디시인사이드 갤러리

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

갤러리 본문 영역

Ada 프로그래밍: 1. 다중 통신 및 비동기 제어: select 문

루비갤로그로 이동합니다. 2025.07.16 00:39:29
조회 77 추천 0 댓글 0

Ada 프로그래밍 초안입니다. 내용 검수가 아직 되지 않았습니다.


1. 다중 통신 및 비동기 제어: select 문


accept 문은 하나의 entry만 지정하여 동기적으로 기다릴 수 있다는 한계가 있습니다. 만약 태스크가 여러 종류의 이벤트를 동시에 기다리거나, 무한정 기다리지 않고 다른 작업을 수행해야 한다면 어떻게 해야 할까요? Ada는 바로 이 문제를 해결하기 위해 강력한 select 문을 제공합니다.


select 문은 여러 가능한 이벤트 경로 중 하나를 선택적으로 실행하는 구문으로, 본질적으로 이벤트 다중화(event multiplexing)를 언어 차원에서 구현한 것입니다.


다중 진입점 대기


가장 기본적인 select 문은 여러 accept 문 중 하나를 선택하여 실행하는 것입니다. 이를 통해 태스크는 여러 종류의 요청을 동시에 처리할 수 있습니다.


예시: 제한된 크기의 버퍼 (bounded buffer)


다음은 아이템을 저장(Write)하거나 꺼내(Read)갈 수 있는 버퍼 태스크입니다. select 문 덕분에 버퍼가 비어있지 않으면 Read 요청을, 가득 차지 않았으면 Write 요청을 모두 받아들일 준비를 할 수 있습니다.


task type Bounded_Buffer is

   entry Write (Item : in Integer);

   entry Read  (Item : out Integer);

end Bounded_Buffer;


task body Bounded_Buffer is

   Pool : array (1..10) of Integer;

   Count : Integer range 0..10 := 0;

   -- ... 인덱스 변수 선언 ...

begin

   loop

      select

         when Count < 10 =>          -- 버퍼가 가득 차지 않았을 때만

            accept Write (Item : in Integer) do

               -- 아이템을 버퍼에 저장하는 로직

            end Write;

            Count := Count + 1;

      or

         when Count > 0 =>           -- 버퍼가 비어있지 않을 때만

            accept Read (Item : out Integer) do

               -- 아이템을 버퍼에서 꺼내는 로직

            end Read;

            Count := Count - 1;

      or

         terminate; -- 다른 태스크가 모두 종료되면 이 태스크도 종료

      end select;

   end loop;

end Bounded_Buffer;


when 조건문을 통해 각 accept의 실행 조건을 동적으로 제어할 수 있으며, 먼저 조건이 충족되고 호출이 들어온 entry가 실행됩니다.


비차단 (non-blocking) 호출


때로는 상대방이 준비되지 않았을 때 무작정 기다리지 않고 즉시 다른 일을 처리하고 싶을 수 있습니다. 이때는 select 문에 else 절을 사용합니다.


-- 로그 서버에 메시지 전송을 시도

select

   Log_Server.Send_Message ("Status Update");

else

   -- Log_Server가 즉시 메시지를 받을 수 없다면,

   -- 기다리지 않고 그냥 이 코드를 실행한다.

   Put_Line ("Log server is busy, skipping update.");

end select;


이 구문은 랑데부를 시도하되, 상대가 준비되지 않았으면 대기하지 않고 즉시 else 부분으로 빠져나와 실행을 계속합니다.


타임아웃 (timeout) 구현


네트워크 통신 등에서는 응답을 무한정 기다릴 수 없습니다. select 문에 delay 절을 사용하면 지정된 시간만큼만 기다리는 타임아웃을 손쉽게 구현할 수 있습니다.


select

   accept Get_Data_From_Sensor (Value : out Sensor_Data);

or

   delay 5.0; -- 5.0초 동안만 기다린다.

   -- 5초가 지나도 Get_Data_From_Sensor 호출이 없으면 타임아웃 발생

   Raise_Error ("Sensor timeout!");

end select;


이처럼 select 문은 단순한 동기 통신을 넘어, 조건부 실행, 비차단 호출, 타임아웃 등 견고한 동시성 시스템을 만드는 데 필요한 핵심적인 제어 구조를 제공합니다.


[심화 학습] 고수준 추상화와 저수준 최적화


Ada select 문의 가장 큰 장점 중 하나는, kqueue(FreeBSD)나 epoll(Linux)과 같은 운영체제 종속적인 저수준 API를 직접 다루지 않고도 이식성 있는 표준 문법만으로 강력한 동시성 제어가 가능하다는 점입니다.


성능 또한 뛰어납니다. 현대적인 Ada 컴파일러(GNAT)의 런타임 시스템은 내부적으로 해당 운영체제에서 가장 효율적인 I/O 다중화 메커니즘을 사용하도록 구현되어 있습니다.


리눅스 (Linux): epoll 사용

FreeBSD: kqueue 사용

윈도우 (Windows): IOCP (I/O Completion Ports) 사용


즉, 프로그래머는 select라는 표준적이고 안전한 고수준 문법으로 코드를 작성하면, 컴파일러와 런타임 시스템이 자동으로 타겟 운영체제에 최적화된 가장 빠른 시스템 콜로 변환해 줍니다. 따라서 개발자는 복잡한 저수준 코드가 아닌 비즈니스 로직에 집중하면서도 성능은 최고 수준으로 확보할 수 있습니다. 이것이 Ada가 미션 크리티컬한 실시간 시스템이나 고신뢰성 서버 개발에 사용되는 중요한 이유 중 하나입니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 의외로 연애 못할 것 같은 연애 하수 스타는? 운영자 25/08/04 - -
공지 프로그래밍 갤러리 이용 안내 [92] 운영자 20.09.28 46134 65
2879249 생물학 대인 무기 약물: 정상인에게 조현병 걸리게 하는 약 성분 발명도둑잡기갤로그로 이동합니다. 04:28 15 0
2879248 Ada 프로그래밍: 1. Ada 패러다임 나르시갤로그로 이동합니다. 04:28 6 0
2879247 Ada 프로그래밍: 1부: Ada의 기초 나르시갤로그로 이동합니다. 04:24 8 0
2879246 Ada 프로그래밍: 머리말 나르시갤로그로 이동합니다. 04:23 7 0
2879244 권위주의와 종교와 성적 억압 발명도둑잡기갤로그로 이동합니다. 04:18 10 0
2879243 아 씨발 넥도리아 모가지 참수하고 싶다 [2] 류류(118.235) 04:01 21 1
2879242 쉿! ♥냥덩이♥갤로그로 이동합니다. 03:50 10 0
2879232 어케 act에서 떨어지지 ㅅㅂ 프갤러(175.112) 01:50 20 0
2879222 자바가 개병신인 이유 [1] ㅇㅇ갤로그로 이동합니다. 01:11 42 0
2879220 근데 왜 아직도 국비지원 << 왤케 해주는거임? [3] 프갤러(222.107) 00:53 74 0
2879217 부서에 트롤있으면 코드 개 ㅈ되냐? 프갤러(118.223) 00:26 24 0
2879216 자야겠어 루도그담당(58.239) 00:24 13 0
2879215 오늘의 소설, 영화 실마리: 밤에는 고양이 낮에는 개로 변하는 사람 발명도둑잡기갤로그로 이동합니다. 00:17 17 0
2879212 형들 재택근무가 많은 개발직종은 어디야? [1] 프갤러(175.204) 08.07 51 0
2879210 헬조센에선 정신과 약 먹으며 버티는게 답이다 프갤러(61.79) 08.07 24 0
2879208 마음을 비우면 행복해져요~ [3] 개멍청한유라갤로그로 이동합니다. 08.07 39 0
2879206 누가 내 고닉 해킹함 누구야 [2] 씹멍청한유라(211.36) 08.07 49 1
2879205 아스카는 내일 휴가다 [2] 아스카영원히사랑해갤로그로 이동합니다. 08.07 41 0
2879204 진동스피커가 책상에 납땜 되었습니다. 순간접착제 들어가서, ㅠㅠㅠ 넥도리아(220.74) 08.07 15 0
2879203 정액으로 우라늄이랑 순갑접착제 접착된거 땔 수 있습니까? [1] 넥도리아(220.74) 08.07 31 0
2879202 네부캠이 신입 개발자가 들어갈 정도임? 프갤러(118.44) 08.07 44 0
2879201 잘자요 [8] 개멍청한유라갤로그로 이동합니다. 08.07 49 0
2879200 익명 싫어하는놈 없냐 프갤러(211.234) 08.07 36 0
2879198 단독 보도) 구글 제미니로 책 쓰는 방법 나르시갤로그로 이동합니다. 08.07 25 1
2879195 사실 내가 멍유 남친임 ㅋㅋ [1] ㅇㅇ(211.36) 08.07 36 0
2879192 마귀소굴의 음기에 찌그러질것 같아요. 프갤러(220.84) 08.07 18 0
2879191 3d max할줄 아시는분 있나요 [1] ㅇㅇ(14.52) 08.07 33 0
2879190 ai 만드는게 목표인사람 있음? 일단 나 [9] 프갤러(175.197) 08.07 53 0
2879189 무얼 잘못했기에 중죄인 취급인가요? 프갤러(220.84) 08.07 29 0
2879188 2시간동안 걸으면서 메이플을 접어야하나 말아야하나 진지하게 고민함 ㅇㅇ(223.39) 08.07 33 0
2879187 오늘의 코딩음악 ㅇㅅㅇ 네오커헠(61.253) 08.07 33 0
2879186 애니메이션 개어렵네 ㅅㅂ ㅇㅇ(126.254) 08.07 30 0
2879185 마귀소굴 제발 폐업하고 싶습니다. 프갤러(220.84) 08.07 22 0
2879182 정말 옛날에 비하면 코딩 환경도 많이 좋아졌어. [1] 프갤러(59.16) 08.07 52 0
2879180 홍대에서 귀가 중 발명도둑잡기갤로그로 이동합니다. 08.07 19 0
2879179 멍청한유라님 30대시면 제가 밥 한끼 사드리고싶은데 [1] 발명도둑잡기갤로그로 이동합니다. 08.07 40 0
2879178 사형폐지국가에서 어째서 사형을 받았을까요? 프갤러(220.84) 08.07 22 0
2879177 경쟁약 출시…비만약 가격 확 떨어진다 발명도둑잡기갤로그로 이동합니다. 08.07 18 0
2879176 구역질나는 마귀소굴의 공기. 프갤러(220.84) 08.07 14 0
2879175 Ada 프로그래밍 책 첨부터 다시 작성 중 나르시갤로그로 이동합니다. 08.07 84 4
2879174 깃허브 보면서 느끼는데 막상 돈버는 서비스를 오픈한 곳은 없네 ㅆㅇㅆ(124.216) 08.07 26 0
2879173 it노조? 여기 활동하는 사람? ㅇㅇ(14.7) 08.07 26 0
2879172 화목을 바라면 화목이 없고. 안정을 바라면 안정이 없고. 프갤러(220.84) 08.07 19 0
2879171 멍유가 그래도 남혐은 안함 [2] ㅇㅇ(211.36) 08.07 40 0
2879170 살고자 해도 바라는 바를 이루지 못하겠지요. 프갤러(220.84) 08.07 35 0
2879167 프로그래머가 전망이 구리다는건 착각임 [1] 프갤러(211.234) 08.07 69 0
2879166 납땜이랑 선이 단선되어서 우라늄은 접어야할 것 같습니다. 넥도리아(220.74) 08.07 14 0
2879164 말리긴커녕 기름을 붓는 xx진아! 프갤러(220.84) 08.07 20 0
2879161 멍유의 실체를 다시한번 폭로합니다 [5] ㅇㅇ(211.36) 08.07 86 2
뉴스 티빙 '아이쇼핑' 최종회 오공개... 시청자 스포일러 피해 디시트렌드 08.07
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2