입출력 완료 포트(IOCP)
비동기 입출력과 완료 포트를 이용하고, 스레드를 효율적으로 관리하며, GQCS에 의해 필요한 스레드만이 깨어난다.
APC 큐는 스레드 별로 확인할수 있지만, IOCP는 제약이 없다.
- 입출력 완료 포트는 CreateIoCompletionPort()을 통해 생성하고, CloseHandle로 파괴한다.
- 입출력 완료 포트에 접근하는 스레드를 별로도 두는데, 이를 작업자 스레드라고 부르며, 이를 관리해준다.
- 입출력 완료 포트에 저장된 결과를 처리하려면 GetQueuedCompletionStatus() 함수를 통해 처리한다.
동작원리
- 응용 프로그램을 구성하는 임의의 스레드에서 비동기 입출력 함수를 호출함으로써 OS 입출력 작업을 요청한다.
- 모든 작업자 스레드는 GQCS 함수를 호출하여 입출력 완료 포트를 감시한다. 완료된 비동기 입출력 작업이 아직 없다면, 모든 작업자 스레드는 대기 상태가 된다. 이때 대기 중인 작업자 스레드 목록은 입출력 완료 포트 내부에 저장된다.
- 비동기 입출력 작업이 완료되면, 운영체제는 입출력 완료 포트에 결과를 저정한다. 이때 저장되는 정보를 입출력 완료 패킷이라고 부른다.
- 운영체제는 입출력 완료 포트에 저장된 작업자 스레드 목록에서 하나를 선택하여 깨운다. 깨어난 작업자 스레드는 비동기 입출력 결과를 처리한다. 이후 작업자 스레드는 필요에 따라, 다시 비동기 입출력 함수를 호출할수 있다.
IOCP에 등록된 핸들(소켓)이 CloseSocket을 한경우, GQCS로 해당 소켓이 오류형식으로 워커스레드가 깨어나고 IOCount를 차감시키는데 소켓은 재활용되므로, 새로 들어온 클라가 끊길수있다.
Example Note
1 | <포함> |