Event 통지 패턴

Select 모델은 Reactor 패턴이라고 볼수있다. 그에 반해, Overlapped IO, IOCP는 Proactor 패턴이다.

Reactor 패턴

Reactor Pattern

1
2
3
4
5
6
7
8
9
Reactor 객체를 만들고, 사건 발생시 React가 반응하여, Event Handler에게 이벤트를 발생한다.

이벤트를 발생하면 역 다중화기를 이용하여, Event Handler 단위로 분할한다.
분할된 이벤트는 해당 Event Handler에게 발송되고(Dispatch)
Event Handler는 알맞은 Method을 통해 이벤트를 처리한다.

Reactor 패턴에는 리엑터가 등록된 이벤트핸들러들을 들고 관리해야된다.
동시에 수많은 IO 요청이 오면, 이벤트 핸들러가 너무 많아져서, 성능에 좋지 않음.
멀티스레드 활용도가 낮아진다.

Select, Epoll, WSAAEventSelect 등이 이에 해당된다.

Proactor

1
2
3
4
5
6
7
8
9
Proactor는 비동기 작업을 지시하고 완료 이벤트 받을 Completion Handler 등록한다.

비동기 프로세스가 가능한 작업을 대기한다. 혹은 작업이 발생하면 깨어나 처리한다.

가능한 작업들이 생기면 비동기 프로세스가 작업을 완료하여, 비동기적으로 처리한다.

작업이 완료되면, 비동기 프로세스는 Completion Dispatcher 에게 정보를 넘기고 Dispatcher는 정보를 이벤트로 만들어서 적절한 Completion Handler 에게 발송한다.(Dispatch)

Completion Handler는 받은 이벤트 정보를 토대로 정해는 콜백을 호출하여 Process Event를 처리한다.

Overlapped IO, IOCP가 이에 해당

Overlapped I/O

비동기 입출력과 비동기 통지를 결합하였다. IO을 충접치켜, 하나의 스레드에서 여러개의 IO처리를 가능하게 한다.

  1. WSASend, WSARecv을 이용해 Overlapped IO 송수신하겠다고 우리가 커널에게 요청하면, OS가 송수신하고 우리에게 통지한다.

  2. 소켓 내부 버퍼를 사용하지 않더라도, 직접 TCP 전송 버퍼에서 데이터를 보내고 받을수 있다.

내부 버퍼를 사용하지 않다면?

  1. 수신시에는 TCP 수신버퍼에서 바로 가져올수 있도록, 충분한 수의 Overlapped IO 호출을 미리 해야된다.

  2. 송신시에는 사용자 버퍼량을 적당히 설정하고, TCP 송신 버퍼의 크기보다 크지않도록 설정해놓지 않으면, 사용자 버퍼의 내용이 TCP 송신버퍼에 다 복사될때까지, 사용자 버퍼를 쓰지못하기 때문에, 끊김 현상이 발생할수 있다.

  3. 데이터 전송이 완료되는 시점 이전까지 사용자 버퍼의 내용을 지우면 안된다.

장단점

  • 장점
    사용자가 지정한 버퍼로 바로 복사가 일어나기 때문에 데이터 복사 비용이 준다.

  • 단점
    멀티 스레드에 특화되지 않음.