본문 바로가기

프로그래밍

IOCP

완료된 IO의 정보가 Completion Port 오브젝트라는 커널 오브젝트에 등록.
그러나 그 전에 등록에 대한 요청 과정이 선행되어야 한다. -> 소켓과 CP 오브젝트와의 연결 요청

그러므로, IOCP 모델의 서버 구현을 위해서는
1. Completion Port 오브젝트의 생성
2. Completion Port 오브젝트와 소켓의 연결
그리고 이것을 하나의 함수를 다르게 사용한다. -> CreateIoCompletionPort()

1)


2)


3. Completion Port의 완료된 IO를 확인
- GetQueuedCompletionStatus()
GetQueuedCompletionStatus 함수의 세 번째 인자를 통해서 얻게 되는 것은 소켓과 CP 오브젝트의 연결을 목적으로 CreateIoCompletionPort 함수가 호출 될 때 전달되는 네 번째 인자 값이다. -> 즉, 2)에 해당하는 CreateIoCompletionPort 함수의 ioInfo.
- GetQueuedCompletionStatus 함수의 네 번째 인자를 통해서 얻게 되는 것은 WSASend, WSARecv 함수 호출 시 전달되는 WSAOVERLAPPED 구조체 변수의 주소 값이다.

4. 쓰레드의 IO 처리에 대하여
GetQueuedCompletionStatus 함수는 누가 호출해야 할까? 
-> IOCP의 완료된 IO 처리를 담당하는 쓰레드가 호출해야 한다.
-> 즉, WSASend, WSARecv 함수를 호출하는 쓰레드가 호출.
-> 그리고 쓰레드는 직접 생성하여야 한다.


추가)
Completion Port는 어떤 별개의 영역이라고 생각.
그리고 그 영역안에 쓰레드가 빨빨빨 돌아다니는 것.
즉 우리는 CP 오브젝트를 생성하고 그것을 해당 소캣과 연결만 한다.
나머지는 쓰레드가 빨빨빨 알아서 돌아다니면서 GetQueuedCompletionStatus 함수를 통하여 입출력이 완료되면 우리한테 알려주는 것으로 생각.