I/O Completion Ports MSDN IOCP

IOCP 는 멀티 프로세서 시스템에서 다수의 비동기 I/O 요청을 실행하기 위한  효율적인 쓰레딩 모델을 제공한다. 프로세서가 IOCP 를 생성할 때 시스템은 유일한 목적인 요청을 위한 연관된 큐 객체를 생성한다. 비동기 IO요청을 핸들하는 프로세스는 (요청이 올때마다 쓰레드를 생성하는 것보다)미리 띄워진 쓰레드 풀과 함께 IOCP 를 이용함으로써 더 빠르고 효율적으로 처리할 수 있다.

I/O completion ports provide an efficient threading model for processing multiple asynchronous I/O requests on a multiprocessor system. When a process creates an I/O completion port, the system creates an associated queue object for requests whose sole purpose is to service these requests. Processes that handle many concurrent asynchronous I/O requests can do so more quickly and efficiently by using I/O completion ports in conjunction with a pre-allocated thread pool than by creating threads at the time they receive an I/O request.

How I/O Completion Ports Work

함수 CreateIoCompletionPort 는IOCP 를 생성하고 한개 이상의 파일핸들을 그 포트에 연계시킨다. 비동기 I/O 작업이 이 핸들 중의 하나에서 완료되었을 때, IOC 패킷이 FIFO 순서로 연계된 IOCP에 큐 된다. 이 메카니즘의 파워풀한 사용은 여러 파일 핸들에 대한 싱크 포인트를 하나의 객체로 묶는 것이다.  하지만, 패킷은 FIFO 로 큐 되었어도 디큐는 다른 순서로 될 수 있다.

The CreateIoCompletionPort function creates an I/O completion port and associates one or more file handles with that port. When an asynchronous I/O operation on one of these file handles completes, an I/O completion packet is queued in first-in-first-out (FIFO) order to the associated I/O completion port. One powerful use for this mechanism is to combine the synchronization point for multiple file handles into a single object, although there are also other useful applications. Please note that while the packets are queued in FIFO order they may be dequeued in a different order.

Note

‘파일 핸들’ 은 디스크의 파일만이 아닌 중첩된 I/O 끝단을 표현하기 위한 추상적인 표현이다. 예를 들어, 네트워크단, TCP 소켓, 네임드 파이프, 메일 슬롯등이 될 수 있음. 중첩 IO를 지원하는 어느 시스템 객체든 사용될 수 있다. 관련된 IO 함수는 이 토픽의 마지막을 볼 것.

The term file handle as used here refers to a system abstraction representing an overlapped I/O endpoint, not only a file on disk. For example, it can be a network endpoint, TCP socket, named pipe, or mail slot. Any system object that supports overlapped I/O can be used. For a list of related I/O functions, see the end of this topic.

파일 핸들이 CP에 연계될 때, 전달된 패스 블럭은  패킷이 CP에서 제거될 때까지 업데이트되지 않을 것이다. 유일한 예외는 원래의 작동이 동시적인 에러를 리턴할 때 이다. 쓰레드(메인 쓰레드자신 혹은 메인 쓰레드가 생성한 것이든)는  IOCP에 큐된 C 패킷을 기다리기 위해 비동기적으로 IO가 끝나기를 기다리기보다  GetQueuedCompletionStatus function을 사용한다.
IOCP 에서 블락된 쓰레드는 LIFO 순서로 릴리스되고, 다음 C 패킷은 IOCP 의 해당쓰레드의 FIFO 큐로부터 받는다. 이것은 C 패킷이 쓰레드에게 릴리스되면 시스템은 그 포트와 연계된 마지막(최근의) 쓰레드를 릴리스하고 가장 오래된 IO C에 대한  ??

When a file handle is associated with a completion port, the status block passed in will not be updated until the packet is removed from the completion port. The only exception is if the original operation returns synchronously with an error. A thread (either one created by the main thread or the main thread itself) uses the GetQueuedCompletionStatus function to wait for a completion packet to be queued to the I/O completion port, rather than waiting directly for the asynchronous I/O to complete. Threads that block their execution on an I/O completion port are released in last-in-first-out (LIFO) order, and the next completion packet is pulled from the I/O completion port’s FIFO queue for that thread. This means that, when a completion packet is released to a thread, the system releases the last (most recent) thread associated with that port, passing it the completion information for the oldest I/O completion.