IOCP(IO完成端口)是一種伸縮性的IO模型,普遍應用於各類類型的高性能服務器,如Apache等。服務器
IO完成端口,應用程序使用線程池處理異步IO請求的一種機制。app
最初設計:異步
應用程序發出一些異步IO請求,設備驅動把這些工做項目排序到完成端口,在完成端口上等待線程池即可以處理這些完成IO。函數
完成端口其實是一個WINDOWS IO結構,能夠接收多種對象的句柄。性能
1 建立完成端口對象 spa
調用CreateIoCompletionPort函數建立一個完成端口對象,winsock使用這個對象爲任意數量的套接字句柄管理IO請求線程
HANDLE CreateIoCompletionPort( HANDLE FileHandle, //關聯的套接字句柄 HANDLE ExistingCompletionPort,//建立完成端口的對象句柄 ULONG_PTR CompletionKey,//指定一個句柄惟一的數據 DWORD NumberOfConcurrentThreads//同時執行線程數量 );
此函數做用:1 建立完成端口對象 2 將一個或者多個句柄關聯到IO完成端口對象設計
例子:code
HANDLE hCompletion = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE,0,0,0);
2 IO服務器線程和完成端口 對象
關聯套接字以前,建立一個或者多個工做線程,在完成端口上執行並處理投遞到完成端口上的IO請求
3 完成端口和重疊IO
在套接字上投遞重疊發送和接收請求處理IO。
IO操做完成後,系統向完成端口對象發送一個完成通知封包。
IO完成端口以 先進先出的方式排隊
BOOL GetQueuedCompletionStatus( HANDLE CompletionPort, //完成端口對象句柄 LPDWORD lpNumberOfBytes,//取得IO操做期間 PULONG_PTR lpCompletionKey, LPOVERLAPPED* lpOverLapped, DWORD dwMilliseconds );