디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

통합 에러 핸들러와 이진 탐색 최적화

나르시갤로그로 이동합니다. 2025.11.26 22:04:19
조회 31 추천 0 댓글 0

제목: [System/Ada] POSIX errno 지옥에서 탈출하기: 통합 에러 핸들러와 이진 탐색 최적화

안녕하세요. 현재 Ada 언어로 고성능 비동기 I/O 라이브러리인 Clair를 개발하고 있습니다.

시스템 프로그래밍을 하거나 C 라이브러리를 래핑해 보신 분들은 공감하시겠지만, 에러 처리(Errno Handling)는 정말 끝없는 노가다의 연속입니다. 오늘은 이 과정을 획기적으로 줄인 경험을 공유하고자 합니다.

1. 고통의 시작: 함수마다 에러가 다르다?

처음에는 정석대로 구현했습니다. man 2 open, man 2 read를 일일이 찾아보며 각 시스템 콜이 리턴할 수 있는 에러 목록을 조사하고 switch/case 문을 작성했죠.

-- [기존 방식] 함수마다 case 문이 복붙됨...
procedure Open (...) is
begin
   res := c_open(...);
   if res < 0 then
      case errno is
         when EACCES => raise Permission_Denied;
         when ENOENT => raise Not_Found;
         when EISDIR => raise Is_A_Directory;
         -- ... open이 뱉는 에러 10개 나열 ...
      end case;
   end if;
end Open;

procedure Read (...) is
begin
   -- ...
   if res < 0 then
      case errno is
         when EACCES => raise Permission_Denied; -- 또 나옴
         when EAGAIN => raise Resource_Busy;     -- 새로운 에러 등장
         when EBADF  => raise Bad_Descriptor;
         -- ... read가 뱉는 에러 5개 나열 ...
      end case;
   end if;
end Read;

함수가 10개면 괜찮지만, socket, bind, listen, epoll_ctl... 함수가 늘어날수록 코드는 중복된 case 문으로 도배되고, 유지보수는 지옥이 되었습니다.


2. 발상의 전환: Superset 전략

문득 이런 생각이 들더군요. 굳이 open이 리턴하는 에러만 골라서 검사해야 하나? 어차피 다 errno 정수값 아닌가?

함수별로 에러를 필터링하지 말고, POSIX 표준이 정의한 모든 에러(Superset)를 처리하는 단 하나의 통합 핸들러를 만들면 어떨까?

  • open EAGAIN을 뱉을 일이 없다고 해도, 핸들러에 EAGAIN 처리 로직이 있는 건 문제 되지 않는다.
  • 어차피 errno가 발생했다면, 그건 우리가 아는 에러 중 하나일 것이다.

3. 해결책: 정렬된 테이블 + 이진 탐색 (Lookup Table)

if-else switch-case를 수백 줄 나열하는 대신, 데이터 기반(Data-driven)으로 접근했습니다.

  1. 데이터 구조: (Errno, Exception_ID) 쌍을 저장하는 배열을 만듭니다.
  2. 정렬: 프로그램 시작 시 Errno 값을 기준으로 정렬합니다. (OS마다 번호가 다를 수 있으므로)
  3. 검색: 런타임에는 이진 탐색(Binary Search)으로 예외를 찾습니다.
-- [Clair.Error 패키지 내부]

-- 1. 모든 POSIX 에러를 때려 넣은 테이블
Error_Table : array (1 .. MAX_ERRORS) of Error_Entry :=
  ((EACCES, Permission_Denied'Identity),
   (EAGAIN, Try_Again'Identity),
   (EBADF,  Bad_File_Descriptor'Identity),
   -- ... (약 30~50개 표준 에러) ...
   (ENOMEM, Memory_Error'Identity));

-- 2. 통합 핸들러 (이진 탐색 O(log N))
procedure Raise_From_Errno (Errno : int; Message : String) is
   -- Binary Search 로직 ...
   -- 찾으면 해당 예외 발생 (Raise)
   -- 못 찾으면 Unknown Error 발생
end Raise_From_Errno;

4. 결과: 매뉴얼과의 이별

이제 시스템 콜 래퍼 함수들은 이렇게 변했습니다.

procedure Open (...) is
begin
   if c_open(...) < 0 then
      -- [끝!] 어떤 에러인지는 핸들러가 알아서 찾아서 던짐
      Clair.Error.Raise_From_Errno(errno, "Open failed on " & Path);
   end if;
end Open;

이득:

  1. 생산성 폭발: 더 이상 man 페이지를 뒤지며 이 함수가 무슨 에러를 뱉지? 고민할 필요가 없습니다. 그냥 넘기면 됩니다.
  2. 제로 할당 (Zero Allocation): 해시 맵(Hash Map) 대신 정적 배열을 썼기 때문에 힙 메모리 할당이 전혀 없습니다.
  3. 성능: 50개의 에러가 있어도 이진 탐색은 최대 6번 비교면 끝납니다. 에러 상황에서의 오버헤드로는 완벽합니다.
  4. 캐시 효율: 배열이라 메모리에 연속적으로 배치되어 CPU 캐시 히트율이 높습니다.

결론: 시스템 프로그래밍에서 변하지 않는 정적 데이터를 다룰 때는, 무거운 맵(Map) 자료구조보다 정렬된 배열(Sorted Array)이 깡패라는 걸 다시 한번 느꼈습니다.

혹시 비슷한 고민을 하시는 분들이 있다면 Superset 전략을 강력 추천합니다.

C 바인딩을 위해 Ada 예외를 C int 값으로 변환하는 핸들러도 마찬가지의 알고리즘으로 작성할 수 있습니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 뛰어난 운동 신경으로 남자와 싸워도 이길 것 같은 여자 스타는? 운영자 25/11/24 - -
이슈 [디시人터뷰] 충무로가 주목하는 신예, '세계의 주인' 서수빈 운영자 25/11/24 - -
AD 대학생 필수템! What's in my Bag 운영자 25/11/21 - -
공지 프로그래밍 갤러리 이용 안내 [97] 운영자 20.09.28 48772 65
2905075 33세 남성 벌레인생 나같은 성욕부시레기도 결혼 가능하려나 ㅇㅇ(203.232) 10:08 1 0
2905074 유튜브 프리미엄 1년 50,000원 파티원 모집 / 선 조치 후 입금 프갤러(175.199) 09:49 18 0
2905073 이재명 대통령님 전자정부프레임워크를 러스트 기반으로 이전해주십 프갤러(110.8) 09:47 10 0
2905072 [대한민국] 이재명 때문에- 1급시크릿공문(121.172) 09:22 12 1
2905070 개발자 새끼들이 씹덕 애니 프사 하는 이유는? ㅇㅇ(211.235) 09:07 14 0
2905069 졸라 피곤하네..ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:52 14 0
2905067 오늘은 에러처리 패키지 구조를 잡아야겠어요 나르시갤로그로 이동합니다. 08:47 10 0
2905066 산책로 다리 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:42 9 0
2905065 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:39 11 0
2905064 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:38 12 0
2905063 찬반논란인데 너희 생각은? ㅇㅇ(203.232) 08:28 17 0
2905061 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 07:03 36 0
2905060 이재명이 잘 하고 잇다는 증거.jpg [4] 야옹아저씨갤로그로 이동합니다. 06:52 41 1
2905058 죽은 인터넷 이론 발명도둑잡기(118.216) 04:54 20 0
2905057 음기 충전 발명도둑잡기(118.216) 04:31 37 0
2905056 북한학자 조희승의 가야사- 임나는 한반도가 아닌 일본 서부지역에 발명도둑잡기(118.216) 04:00 16 0
2905053 영화 <프랑스> 인기래서 생각나는 예전 글 발명도둑잡기(118.216) 03:40 21 0
2905047 내가 예술계 새 트렌드 알려준다 발명도둑잡기(118.216) 03:22 29 0
2905042 지금 분위기가 프갤러(49.165) 03:07 51 0
2905041 Le Solitaire. Theo Mercier 발명도둑잡기(118.216) 02:56 19 0
2905040 DB는 조인을 안하는게 걍 최선인듯 [2] 프갤러(58.29) 02:53 42 0
2905038 책사풍후의 게임 엔진 개발 일지_프로젝트 삼국사기 책사풍후갤로그로 이동합니다. 02:46 38 0
2905036 씨발국가 완전 중국 다 되었네 이딴 병신같은걸로 전과 ㅋㅋㅋㅋ ㅇㅇ(39.7) 02:30 61 0
2905034 ai는 코드를 낳고 ㅇㅇ갤로그로 이동합니다. 02:18 33 1
2905033 노력한 보상을 갈취당하고 주식이란 도박에 몰두하는 시민들 발명도둑잡기(118.216) 02:12 24 0
2905027 위성 쏘는 이유가 나오는 영화 <에너미 오브 더스테이츠> [1] 발명도둑잡기(118.216) 01:59 37 0
2905025 국내에 외국계 기업 특 ) 짱깨랑 양키랑 좇본 인도 대기업들 몰렸는데 타이밍뒷.통수한방(1.213) 01:54 35 0
2905023 윤도현-타잔 발명도둑잡기(118.216) 01:47 21 0
2905022 위성 싸서 좋은점은 짱깨들밖에없잖누 ㅋㅋㅋㅋㅋ 타이밍뒷.통수한방(1.213) 01:41 29 0
2905021 위성 쏘는 이유 중 하나가 야당 감시다 발명도둑잡기(118.216) 01:33 25 0
2905017 내일 또 클리앙새끼를 누리호 ㅇㅈㄹ하면서 난리치겠누 [1] 타이밍뒷.통수한방(1.213) 01:23 41 0
2905015 냥덩이 잡아다가 누리호에 묶어서 쏴올렸다는데? 발명도둑잡기(118.216) 01:17 30 0
2905014 누리호 궤도 진입 성공 대 실패 예상 댓글좀 발명도둑잡기(118.216) 01:09 24 0
2905013 오늘의 영상 기획 실마리: 작품 발표를 로케트 발사처럼 패러디 발명도둑잡기(118.216) 00:58 25 0
2905010 조선이 위성을 쏘아도 한국은 도발이라고 표현하는데 발명도둑잡기(118.216) 00:31 31 0
2905009 법무부 영문 표기가 Ministry of Justice 발명도둑잡기(118.216) 00:14 23 0
2905008 DB 검색할 때 %like%는 걍 없다고 생각하고 써야함? [2] 프갤러(58.29) 00:14 36 0
2905006 이거 항소하면 무죄 내지는 벌금50까지 줄여지냐? 씨발국가야? ㅇㅇ(39.7) 11.26 64 1
2905005 대통령보다 연봉높은 우주청 현실 [1] 타이밍뒷.통수한방(1.213) 11.26 70 0
2905004 개인 자격으로 인공위성 만들어 발사한 미디어아티스트 송호준 [1] 발명도둑잡기(118.216) 11.26 28 0
2905003 해외기사들보면 삼성 lg제품 존나 광고하네 타이밍뒷.통수한방(1.213) 11.26 50 0
2905002 소프트웨어 엔지니어의 몰입 손발이시립디다갤로그로 이동합니다. 11.26 36 0
2905001 [공식] 누리호 4차 발사 현장 생중계 발명도둑잡기(118.216) 11.26 23 0
2905000 이거 ㅈㄴ 억울한데 항소할지 걍 벌받을지 추천좀 [1] ㅇㅇ(39.7) 11.26 69 0
2904999 슬슬 재취업들어가야겠군 ㅇㅇ(113.59) 11.26 37 0
2904998 R이나 파이썬같은 툴 돌릴 때 작동 원리에 대한 수학 ㅇㅇ(211.108) 11.26 30 0
2904997 음악인 나오는 영화 추천 <꿈의 제인> 발명도둑잡기(118.216) 11.26 32 0
2904994 충격적임.. ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.26 61 0
2904992 밤하늘 별빛이 호롱불 같구낭 ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.26 62 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2