디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.11.26 22:04:19
조회 88 추천 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/01 - -
AD 루틴 ON! 운동 찐템! 지금 할인 중 운영자 25/11/27 - -
2905451 밤에도 못 자고 일하니까 출생률이 떨어지는 것이다 [1] 발명도둑잡기(118.216) 11.29 55 0
2905450 윤석열 “전한길은 하나님이 한국에 보낸 선물” 옥중 편지 발명도둑잡기(118.216) 11.29 63 0
2905448 '아쉽다. 뽀뽀'…부하 여경 손 깍지·허리 감싼 경찰관 유죄 확정 발명도둑잡기(118.216) 11.29 43 0
2905447 美서 의미 퇴색한 '블프 세일'…"행사 진정성 사라져" 발명도둑잡기(118.216) 11.29 44 0
2905446 '케네디家' 끝없는 비극?…35살 외손녀 시한부 판정 발명도둑잡기(118.216) 11.29 52 0
2905445 5억짜리 ‘인간 세탁기’ 발명도둑잡기(118.216) 11.29 50 0
2905444 노동장관 "해 뜨면 일하고 해 지면 휴식. 야간 노동자 사망' 쿠팡 발명도둑잡기(118.216) 11.29 46 0
2905441 젤렌스키, 러시아 침공전 방어체제 이끈 '분신' 잃었다 발명도둑잡기(118.216) 11.29 55 0
2905440 회사다니면서 우울증 생겼는데.. [17] ㅇㅇ(1.244) 11.29 138 0
2905437 기분 좋은 주말이다 RyuDOG갤로그로 이동합니다. 11.29 48 0
2905436 [대한민국] 국힘 책임당원 일동 입장문 ㅇㅇ(121.172) 11.29 51 0
2905432 이마트가즈아 넥도리아(223.38) 11.29 42 0
2905431 나 한동훈 인간적이어서 좋아했습니다. 넥도리아(223.38) 11.29 64 0
2905428 내냔 상반기 ㄹㅇ 존나 바쁠거 확정임 ㅅㅂ [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.29 111 0
2905425 뭔가 있어보이는 Ada 코딩법 ㅋㅋ [2] 나르시갤로그로 이동합니다. 11.29 81 2
2905424 책 사는거 이거 맞는건가? [1] 넥도리아(220.74) 11.29 112 0
2905420 주술회전 최신화 ♥멘헤라냥덩♥갤로그로 이동합니다. 11.29 53 0
2905419 Watsn.ai - 최첨단 AI 구라 탐지기 만들어 봤다 Watsn(47.230) 11.29 64 0
2905414 오늘자 민주주의 파괴 진척 경과 현황 [5] chironpractor갤로그로 이동합니다. 11.29 91 0
2905413 저장용 ♥멘헤라냥덩♥갤로그로 이동합니다. 11.29 57 0
2905410 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.29 48 0
2905409 내가 만나고 싶은 여자 이상형 적어봄.txt [1] ㅁㅁㅅ갤로그로 이동합니다. 11.29 80 0
2905407 이직하려면 여기서 어떤부분을 좀더 집중하는게 좋을까? [6] 프갤러(58.76) 11.29 119 0
2905406 평론가, 평론의 중요성, 필요성, 위대한 평론 등이 잘 드러난 작품 발명도둑잡기(118.216) 11.29 210 0
2905405 인지과학조져라 손발이시립디다갤로그로 이동합니다. 11.29 92 0
2905403 프랑스의 쓰레기방지법과 유럽의 '그린 뉴딜' 발명도둑잡기(118.216) 11.29 49 0
2905398 CUDA 때문에 절대 안된다? 구글 TPU 사태의 본질, 엔비디아가 급해 발명도둑잡기(118.216) 11.29 82 0
2905397 공원 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 11.29 56 0
2905396 태연 ㅇㅅㅇ [1] 헤르 미온느갤로그로 이동합니다. 11.29 65 0
2905395 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 11.29 84 0
2905394 7,000명이 호흡할 공기를 걸러낸다고? 도심 한복판에 '이끼'를 발명도둑잡기(118.216) 11.29 63 0
2905393 국내에서 네카라쿠배 위에 어떤 회사들 있음? 프갤러(1.229) 11.29 68 0
2905391 초월지능신교 來世 經文 프갤러(49.165) 11.29 67 0
2905389 지식in 조회수만 도전해봅니다. 넥도리아(220.74) 11.29 68 0
2905388 초월지능신교의 교리와 경전 그리고 기도문 프갤러(49.165) 11.29 73 0
2905387 초월지능신교 경문 프갤러(49.165) 11.29 53 0
2905386 이제 사이비종교를 만들 때다. 프갤러(49.165) 11.29 59 0
2905385 디시는 모자이크 안되냐 네이버 지식in은 되던데 모자이크 기능 오늘 처음 넥도리아(220.74) 11.29 63 0
2905384 The Studio, By Daniel K. Robbins, n.d., 발명도둑잡기(118.216) 11.29 51 0
2905380 유럽처럼 민주노총 IT산별노조가 크면 된다 발명도둑잡기(118.216) 11.29 40 0
2905379 1893년 미국, 세계 최초로 자전거를 탄 여성 발명도둑잡기(118.216) 11.29 47 0
2905378 내년 만 30세 경력 1년 6개월인데 다시 취업될 수 있을까? 프갤러(119.201) 11.29 68 0
2905376 마소 주식 0.001주 3번 샀는데 내려갔는데 이거 못파나요? 넥도리아(220.74) 11.29 66 0
2905374 핵반응로 논쟁은 금방 끝나고 자전거 창고 논쟁은 길다는 역설 발명도둑잡기(118.216) 11.29 52 0
2905371 나도 맨날 대표랑 싸웠지 [2] 프갤러(110.8) 11.29 127 0
2905367 세계최초 탄력적 가상 아레나 아키텍처 설계 완료함. 나르시갤로그로 이동합니다. 11.29 69 0
2905365 리액트 배울때 헛짓거리한거 기억나네 ㅇㅇ(113.59) 11.29 89 0
2905364 리액트 배우기 귀찮아서 웹프로젝트 할땐 바이브코딩한다 프갤러(118.235) 11.29 82 0
2905363 국장이랑 미장 할 때 기분 차이 [4] chironpractor갤로그로 이동합니다. 11.29 113 1
2905362 우리 회사 대리세끼 대표랑 맨날 싸움 [10] ㅇㅇ(221.168) 11.28 115 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2