디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.11.26 22:04:19
조회 105 추천 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 - -
2905224 맨날 뭐 망하라는 소리만 하면서 왜 자기가 애국자인척을 하지 ㅇㅇ갤로그로 이동합니다. 11.28 65 0
2905221 인지과학조져라 손발이시립디다갤로그로 이동합니다. 11.28 77 0
2905219 김영회 동국대 향가연구실장 "양주동 박사 향가 해독법 틀렸다" 발명도둑잡기(39.7) 11.28 69 0
2905218 일본 '만엽집' 대가 "일본은 아름다운 평화를 지향해야 한다" 발명도둑잡기(39.7) 11.28 65 0
2905217 양쪽 얘기 듣자는게 왜 역사왜곡임? [5] chironpractor갤로그로 이동합니다. 11.28 149 3
2905216 박원순 자ㅡ살 맞는지가 의문 [1] 발명도둑잡기(39.7) 11.28 83 0
2905215 스위스는 매달 전국민이 우편투표로 직접민주정치 발명도둑잡기(39.7) 11.28 69 0
2905214 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 56 0
2905212 죽어가는 국민의힘 되살리는 기초의회 ‘2인 선거구’, 더 늘어나나 발명도둑잡기(39.7) 11.28 74 0
2905211 재명이 존나 찐따같네;; 카메라 보이니까 왕따 아닌척 발악;; [5] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 105 0
2905210 진보당, 무주택자·세입자·청년의 ‘감당 가능한 주거’ 7대 정책 제안 [1] 발명도둑잡기(39.7) 11.28 82 0
2905208 경력기술서쓰는데 궁금한거 있음 [7] 프갤러(58.76) 11.28 128 0
2905207 미국 음반 시장 순위 조작을 위한 사재기 있나 발명도둑잡기(39.7) 11.28 163 0
2905203 <하우스 오브 다이너마이트> 인기래서 생각나는 예전 글 발명도둑잡기(39.7) 11.28 68 0
2905200 오늘의 소설, 영화 실마리: 초코파이 재판과 노조원 이야기 발명도둑잡기(39.7) 11.28 65 0
2905195 이익 배분 게임과 지능의 상관관계 [1] 발명도둑잡기(39.7) 11.28 106 0
2905193 넷마블 해킹 SQL 인젝션 추정 [1] ㅇㅇ(175.197) 11.28 116 0
2905191 넥스트 N.EX.T-Dear America 무삭제 발명도둑잡기(39.7) 11.28 78 0
2905190 아니 잼미니 미친년 지맘대로 배포 해버리네 ㅋㅋ 프갤러(218.236) 11.28 90 0
2905187 슈베르트-마왕 발명도둑잡기(39.7) 11.28 59 0
2905186 제리케이-마왕 발명도둑잡기(39.7) 11.28 57 0
2905185 요즘 어셈으로 짤 일이 많아서 그런가 [1] 루도그담당(58.233) 11.28 98 0
2905184 수이 블루비드 다녀옴 [1] 따당갤로그로 이동합니다. 11.28 104 0
2905181 나님 콧대가 그렇게 이뽀..? 따당갤로그로 이동합니다. 11.28 119 0
2905179 독도 간접 언급한 中, 포털사이트·AI도 “독도는 한국 땅” 발명도둑잡기(39.7) 11.28 67 0
2905178 페이커닮은 개발자 찾습니다 [2] 프갤러(106.101) 11.28 128 0
2905177 언리얼 메뉴얼 진짜 거지같네 [4] 프갤러(114.205) 11.28 113 0
2905175 개발하냐고 글 쓸 시간도 없고 ㅁㅌ겠네 ㅠㅠ [4] 나르시갤로그로 이동합니다. 11.27 84 0
2905174 세계최초의 최상위 수준 C API 래핑 설계 패턴인가? 나르시갤로그로 이동합니다. 11.27 100 0
2905173 N-Arity 제네릭 래퍼 + 중앙 집중식 예외 매퍼' 아키텍처 나르시갤로그로 이동합니다. 11.27 69 0
2905172 Clair 라이브러리: 예외 처리 C 바인딩 아키텍처 [1] 나르시갤로그로 이동합니다. 11.27 110 0
2905171 옛날에 nuri.net이 뭐였더라 발명도둑잡기(39.7) 11.27 71 0
2905170 중국 딥시크가 미국 AI 압살하는중 ㄷㄷ [4] ㅇㅇ갤로그로 이동합니다. 11.27 127 0
2905169 ‘성폭력 발언’ 이준석 불송치에…“막말 자유권은 없다” 반발 봇물 발명도둑잡기(39.7) 11.27 74 0
2905168 민주당, '2인선거구로 쪼개기'에 합세한다면 내란본당 국민의힘 부활 발명도둑잡기(39.7) 11.27 75 0
2905167 뭔가 소화가 잘 안된느낌 [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 105 0
2905166 [애니뉴스] YxD Labs - 유튜브 링크 공유 ㅇㅇ(121.172) 11.27 65 0
2905165 MS 엣지브라우저 msn에 중요 노출되는 극우 황색지들 발명도둑잡기(39.7) 11.27 60 0
2905164 이세돌이 바둑 은퇴한거 이제 실감난다 [1] 프갤러(110.70) 11.27 86 0
2905163 컴퓨터로 일하는데 싸구려컴 쓰는 이유가 뭐임? [5] 에이도비갤로그로 이동합니다. 11.27 121 0
2905161 안타까운 점은 대충 아는 애들이 확신에 차있다는거임 [14] 박민준갤로그로 이동합니다. 11.27 142 3
2905160 50위권 밖에 있는 언어들은 대체 왜 만든거냐? [2] 두정갑(221.149) 11.27 99 0
2905157 에구궁 피궁타 ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 82 0
2905156 Go 개발환경은 LiteIDE와 VS-Code 둘 중 어느 게 나음? [2] 두정갑(221.149) 11.27 94 0
2905150 몇 시간 전부터 내 방 두번째 공유기가 재부팅 해도 발명도둑잡기(39.7) 11.27 67 0
2905149 나씻주준⭐+ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 76 0
2905148 자바가 러스트보다 좋은 부분 나르시갤로그로 이동합니다. 11.27 80 1
2905144 ㅊㅗ큼만 더 ♥멘헤라냥덩♥갤로그로 이동합니다. 11.27 78 0
2905142 백엔드 퇴사하고 국비 클라우드 인프라 과정 어떤가요 [5] 프갤러(115.23) 11.27 165 0
2905141 하긴 지금이야 러이브러리 차원에서 많이들 크로스 os 지원하는거지 [1] 프갤러(110.8) 11.27 84 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2