더북(TheBook)

반대로 IOCP는 epoll에서는 할 수 없는 성능상 유리한 기능도 있습니다. 앞서 스레드 풀링을 활용하면 여러 가지 일을 스레드 몇 개가 골고루 분담해서 처리할 수 있다는 것을 배웠습니다. IOCP는 이러한 스레드 풀을 쉽게 구현할 수 있게 하는 반면, epoll은 그렇지 않습니다. 왜 그럴까요?

epoll은 I/O 여부와 상관없이 I/O 가능 이벤트가 일단 옵니다. 그런데 한 epoll에 대해 여러 스레드가 동시에 이벤트 발생을 기다린다면 어떻게 될까요? epoll과 연동된 소켓 하나가 UDP 데이터 2개를 수신 큐에 갖고 있다 가정합시다. epoll 이벤트는 같은 소켓에 대해 두 스레드에서 동시에 꺼내집니다. 그러면 각 스레드는 같은 소켓에 대해 UDP 논블록 수신을 할 것입니다. 이때 데이터 순서는 알기가 어렵습니다.

p182_1

▲ 그림 3-21 한 소켓에 쌓인 두 이벤트가 두 스레드에 분배된 상황

 

순서를 안다고 해도 두 스레드가 동시에 같은 일을 하므로, 어느 것을 먼저 처리하고 어느 것을 나중에 처리할지 교통 정리를 할 로직이 필요합니다. 당연히 일이 복잡해집니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.