그리고 프로액터에서는 이렇게 할 것입니다.
1. 개수가 1만 개 이하인 각 Overlapped status 객체에 대해 GetOverlappedStatus를 실행하여 I/O 완료 상태인지 확인합니다.
2. I/O 완료 상태면 나머지 처리(받은 데이터에 대한 여러분 로직 혹은 다음 보낼 데이터에 대한 송신 함수 재호출)를 수행합니다.
어찌 되었건 소켓 개수에 비례해서 루프를 돌기 때문에 딱 보아도 성능 문제임을 알 수 있습니다. 예를 들어 소켓이 1만 개고 각 소켓이 초당 100번씩 I/O 가능 이벤트 혹은 I/O 완료 이벤트가 발생하면, 초당 100만 번의 처리를 해야 합니다. 그런데 1회에 소켓 1만 개에 대한 루프를 돈다고 생각하면 끔찍합니다. 소켓 개수가 많을 때 이러한 루프 없이 한 번에 끝내는 방법은 없을까요?
그래서 등장한 것이 IOCP(Input/Output Completion Port)와 epoll입니다. 먼저 epoll부터 살펴봅시다.