IOCP
IOCP는 Windows Programming에서 비동기 네트워크 통신 방법중 하나이다. IOCP는 다음과 같이 동작한다.
- 여러개의 스레드를 생성해 waiting queue에서 대기한다
- 입력이 완료된 소켓들에 대해 스레드가 waiting queue에서 나와 작업을 수행한다
IOCP를 이해하는데 가장 중요한 개념은 Overlapped IO이다. Overlapped IO는 커널레벨에서 병렬로 여러개의 소켓에 대한 핸들링이 가능하기에 소켓의 입출력은 커널이 수행하고 입출력이 완료된 소켓들에 대해서만 스레드들이 waiting queue에서 나와 작업을 수행하는 방식이다.
두번째로 알아둬야 할 개념은 waiting queue의 동작 원리이다. 이름은 waiting queue이지만 실은 stack으로 동작한다. 즉 FIFO가 아닌 LIFO이다. 레퍼런스 문서를 포함한 다양한 경로를 검색해 봤지만 왜 LIFO인가에 대한 명확한 설명은 없었다. 다만 짧은 지식으로 추측해 보자면 waiting queue에 들어가는 스레드들의 자원을 효율적으로 사용하기 위해서라고 추측한다. 이 말이 무엇이냐면 FIFO보다 LIFO로 동작한다면 최근에 사용했던 스레드의 내용을 훨씬 빠르게 메모리에 적재할 수 있다는 장점이 존재한다.
부가적으로 .NET의 SocketAsyncEvent는 IOCP의 구현체이다. .Net Core에서도 지원이 가능하며 내부적으로 스레드 풀을 생성해 소켓 입출력에 대한 관리를 수행한다.