IOCP ( Input/Output Completion Port )
- Windows에서 비동기 I/O 완료 통지를 멀티 쓰레드 환경에서 가장 효율적으로 처리할 수 있는 비동기 I/O 완료 통지 모델이자 쓰레드 풀 ( Thread Pool ) 입니다.
IOCP 비동기 I/O 처리 흐름
- IOCP에 등록된 핸들을 이용해 비동기 I/O 함수를 호출할 경우 커널이 이를 처리 후 I/O Completion Queue에 Enqueue 하고, GQCS( GetQueuedCompletionStatus ) 를 호출하고 대기중인 IOCP WOrkerThread 가 이를 감지하여 완료 통지를 처리합니다.
IOCP 내부 구조
- IOCP 는 위 그림에서 보이는 것처럼 5개의 컨테이너를 이용해서 멀티 쓰레드 환경에서 비동기 I/O에 대한 완료 통지를 효율적으로 처리합니다.
IOCP 의 장.단점
장점
- GQCS( GetQueuedCompletionStatus ) 를 호출한 Worker 쓰레드들을 스택 방식으로 관리하기 때문에 완료 통지 Queue에 완료 통지가 Enqueue 되었을 때 가장 마지막에 GQCS( GetQueuedCompletionStatus ) 를 호출한 쓰레드가 깨어나서 완료 통지를 처리하여 캐시 히트율에 대한 이점이 있습니다.
- 완료 통지를 처리하는 러닝 쓰레드의 개수와 완료 통지를 대기하는 대기 쓰레드의 개수를 실시간으로 파악하고 있기 때문에 러닝 쓰레드가 시스템 함수 호출로 인해서 블락되었을 경우 완료 통지를 처리할 수 있는 대기 쓰레드를 깨워 러닝 쓰레드의 개수를 맞춥니다. 이를 통해 멀티 코어 CPU를 적극 활용할 수 있다는 장점이 있습니다.
- CreateIoCompletionPort를 통해 IOCP에 소켓을 등록할 때 완료 통지를 받을 때 마다 사용자가 지정한 데이터인 CompletionKey를 아웃 파라미터로 받을 수 있도록 할 수 있습니다.
단점
- 비동기 Send, Recv, Accept 완료통지를 처리하기 위해서는 사용자가 직접 Overlapped 확장을 통해서 어떤 비동기 I/O에 대한 완료 통지인지 구분하는 작업이 필요합니다. 이 처럼 IOCP API 자체가 직관적이지 못하며 사용 방법이 어렵다는 단점이 있습니다.
'운영체제 > Windows' 카테고리의 다른 글
힙을 사용하는 이유와 Default Heap과 Dynamic Heap의 차이 (0) | 2022.10.24 |
---|