[memo] Reactor / Proactor pattern

epoll , iocp, asio 를 살펴볼때 이해하고 넘어가야할 중요 패턴

Reactor :

event hendler

reactor 패턴의 경우 이벤트가 발생했을 때의 event handler 의 등록을 통해 reactor 가 해당 이벤트 핸들러에게 매 이벤트 마다의 이벤트 작업을 하도록 한다

일반적인 이벤트 핸들러 패턴이라고 볼 수 있다

proactor:

proactor 의 경우 단어의 사전적 의미가 없다
후미의 postfix 를 살작 제거하면 사전 예방적 이라는 proactive 와 적극적으로 라는 proactively 가 나타난다
내생각엔,, 실제 proactor pattern 의 모습을 볼때 적극적으로 처리하는놈이라고 이해하면 더 좋지않을까? 싶었다
proactor pattern 의 경우 eventhandler 패턴과 살짝 다른점은 class diagram 좌측의 async operation 을 담당하는 쪽이 있다

class diagram 보다 더 확실히 이해하기 쉬운내용으로

https://en.wikipedia.org/wiki/Proactor_pattern

wikipedia 의 sequence diagram

completion dispatcher , async operation processor 로 나뉜다

이미 할건 한다 – 단 async 하게

icop 를 기준으로 설명하자면 이미 등록된 핸들에 대한 입출력은 일어나게 둔다 다만 해당 입출력이 완료된 시점에 completion dispatch 가 발생할 수 있도록 도와준다

실제 iocp 에서는 GetQueuedCompletionStatus 를 통해서 completion dispatch 가 필요한(할 수 있는) 상태 인지를 completion queue 를 통해 확인하고 해당 완료된 io 에 대한 후속 처리를 하도록 한다

실제 io 자체는 이미 병렬로 일어나게 두며 해당 일어난 이후 이벤트 핸들링을 하는게 reactor 와 크게 다른점 으로 이해 하면 된다

https://www.boost.org/doc/libs/1_75_0/doc/html/boost_asio/overview/core/async.html

boost asio 의 proactor pattern 에 대한설명 페이지를 보면 아래와 같은 설명으로 되어 있다

async operation 은 일어나게 하며 일어난 때 enqueues 이벤트에 대한 demultiplexer 가 dequeue proactor 가 해당 이벤트에 대한 완료 핸들링을 한다

해당 페이지의 설명을 보면 epoll 과 iocp 에서의 asio 구현의 각부분의 차이를 이해할 수 있다

사실 reactor 의 경우 별다른 특징없는 이벤트 핸들러 패턴이라고 이해해도 좋으며

해당 reactor 패턴을 사용 했을때의 한계나 단점을 극복하고 더 효율적으로 이벤트 핸들링/io 가 일어 나고 핸들링 될 수 있도록 하기위한 방법을 proactor 라고 이해하면 될듯 하다

asynchronous operation 과 해당 완료에 파생한 이벤트 핸들링을 나누어 처리할 수 있을때


댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다