디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.11.26 22:04:19
조회 102 추천 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/12/08 - -
AD 루틴 ON! 운동 찐템! 지금 할인 중 운영자 25/11/27 - -
2905353 조갑제도 “국힘은 이적단체”…여당은 ‘내란 가짜뉴스’ 대응 중 발명도둑잡기(118.216) 11.28 61 0
2905352 해외 투자 증세에 관해 [3] 발명도둑잡기(118.216) 11.28 135 0
2905351 나님 달러 미국주식 풀매수중 ㅇㅅㅇ [5] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 120 0
2905350 미국주식갤에서 친미매국노들 욕하다가 차단당함 [3] 손발이시립디다갤로그로 이동합니다. 11.28 81 0
2905348 영어를 못해서 구글을 못가네 [1] ㅇㅇ갤로그로 이동합니다. 11.28 92 0
2905345 원티드 자격요건은 거기 직원들도 다 못할거 같은데 ㅇㅇ(182.228) 11.28 70 0
2905343 오픈소스에서는 취약점을 감시하는 사람이 더 많다 발명도둑잡기(118.216) 11.28 72 0
2905342 사타구니 털 제모하면 이상한 사람인가요? [5] 넥도리아(220.74) 11.28 96 0
2905341 노말틱도 말해주잖아 오픈소스의 취약점 [1] ㅇㅇ(114.30) 11.28 97 0
2905340 <복면가왕> 관련 생각나는 예전 글 발명도둑잡기(118.216) 11.28 82 0
2905339 정치가 어쨌든 나라가 어쨌든 국가가 어쨌든 삶이 어쨌든 [8] 넥도리아(220.74) 11.28 100 0
2905337 저좀 어떻게 성공시켜 주실 분 없나요? [2] 넥도리아(220.74) 11.28 90 0
2905335 사실 제가 틀딱이 아니라 귀여운 여자임을 인증합니다 [6] 헬마스터갤로그로 이동합니다. 11.28 125 0
2905332 페이커닮은 개발자 찾습니다 프갤러(106.101) 11.28 62 0
2905331 진짜 크게 벌리는 건 아니고… 그냥 생활비용 차트부자(1.233) 11.28 76 0
2905325 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 89 0
2905324 프로그래머, 내가 하다 하다 3D 공부한다. [3] 프갤러(59.16) 11.28 116 1
2905319 출퇴근길에 소소하게 짭짤하네요 존버장군(1.233) 11.28 93 0
2905316 나 좀 찾지 말아달라고 했음 ㅇㅇ(211.234) 11.28 84 0
2905313 나 아까 실수했네 발명도둑잡기(118.216) 11.28 70 0
2905298 어제부터 저녁에 배가 안 고픔;; [6] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 112 0
2905297 클래스 101 결제해본 사람있나 ㅇㅇ(140.248) 11.28 83 0
2905296 국비 말고 혼자 자격증 따서 취직하는것도 가능함? [1] ㅇㅇ갤로그로 이동합니다. 11.28 119 0
2905294 후 시발 이런건 15분만에 최라락 써서 뚝딱 해야하는건데 프갤러(14.52) 11.28 80 0
2905293 회원가입 겨우 완성했다. 프갤러(14.52) 11.28 83 0
2905292 <서울 자가에 대기업 다니는 김부장 이야기>관련 생각나는 글 발명도둑잡기(118.216) 11.28 149 0
2905291 맨땅에 헤딩하기에는 c가 가장 적절한듯 ㅇㅇ(118.235) 11.28 66 0
2905289 AI 로 뚝딱해서 돈 벌었다는 사람 통장 까봐. [1] 프갤러(59.16) 11.28 79 2
2905288 미디어에서 AI 로 1 분만에 뚝딱 개발했다니까 정말 그런줄 알아. 프갤러(59.16) 11.28 90 1
2905287 프로그래머가 되려면 꿈과 희망을 버려라. [3] 프갤러(59.16) 11.28 109 0
2905283 <우주메리미>가 인기래서 생각나는 예전 글 발명도둑잡기(118.216) 11.28 72 0
2905282 면접문제를 만들어봤다. 프갤러(49.165) 11.28 86 0
2905281 "찬송가 부르고 주식 사"‥ 이불말이는 주가 올리는 '제물' 발명도둑잡기(118.216) 11.28 54 0
2905280 시대의 어르신들이 하나 둘 돌아가시는게 참 먹먹하구낭.. [3] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 86 0
2905279 바지가 내려가 넥도리아(223.38) 11.28 78 0
2905278 ■si회사갈거면 포트폴리오 프론트엔드 뭘로하는게 좋냐? [9] ㅇㅇ갤로그로 이동합니다. 11.28 123 0
2905277 Ada 인생 40 년 갈아 넣었습니다. 프갤러(59.16) 11.28 65 0
2905276 착한 중국인 환영⭐+ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 73 0
2905275 Ada 언어는 공부하면 할수록 너무 신기하다.. ㅎㅎ 나르시갤로그로 이동합니다. 11.28 68 0
2905274 나님 왤케 소중하실깡..?⭐+ [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 78 0
2905272 SK네트웍스 FAMILY AI 캠프 24기 프갤러(118.235) 11.28 80 0
2905271 미국정치 갤러리 이미지, 동영상 첨부 차단 중 [1] 발명도둑잡기(118.216) 11.28 79 0
2905270 열심히 살아라 RyuDOG갤로그로 이동합니다. 11.28 73 0
2905269 오늘 기분좋네 RyuDOG갤로그로 이동합니다. 11.28 69 0
2905268 의사도 유튜버도 아니다…중고생이 꼽은 장래희망 1위 [1] 발명도둑잡기(118.216) 11.28 110 0
2905266 한화시스템 BEYOND SW 캠프 24기 프갤러(118.235) 11.28 91 0
2905263 이제 LLM딸깍으로 과제 풀기 쉬워졌으니 취업난보다 인력난이 더 대두될거 ㅇㅇ(110.10) 11.28 105 0
2905262 진짜 공대처럼 수학 물리를 빡세게 하는 것도 아니고 ㅇㅇ(110.10) 11.28 81 0
2905261 오늘의 작사 실마리: 한국에서 제일 높은 산? 발명도둑잡기(39.7) 11.28 69 0
2905260 헉교수업만 멍청하게 꼬박꼬받듣다가 취업 못 한다고 징징징 ㅇㅇ(110.10) 11.28 74 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2