標籤:style 使用 os strong 檔案 資料
1、關於IOCP
IOCP即IO完成連接埠,是一種高伸縮高效率的非同步IO方式,一個裝置或檔案與一個IO完成連接埠相關聯,當檔案或裝置的非同步IO操作完成的時候,去IO完成連接埠的【完成隊列】取一項,根據完成鍵(Complete Key)來判斷是哪個裝置或檔案的操作完成,然後再根據實際情況進行處理。
2、相關API 和 資料結構
將一個已完成的IO通知追加到IOCP的【完成隊列】中
BOOL PostQueuedCompletionStatus(
HANDLE hCompletionPort, //IO完成連接埠
DWORD dwNumBytes, //傳輸的位元組數
ULONG_PTR completionKey, //完成鍵
OVERLAPPED* pOverlapped //裝置或檔案發送非同步IO請求時的關聯OVERLAPPED結構指標
)
從【完成隊列】中取一項
BOOL GetWQueuedCompletionStatus(
HANDLE hCompletionPort, //IOCP
PWORD pdwNumberOfBytesTransferred, //已傳輸位元組數
PULONG_PTR pCompletionKey, //完成鍵
OVERLAPPED** ppOverlapped, //與檔案或裝置關聯的OVERLAPPED結構,指標的指標,[out]
DWORD dwMilliseconds //等待時間
)
建立IOCP 或 將一個檔案/裝置與一個IOCP關聯起來
HANDLE WINAPI CreateIoCompletionPort( __in HANDLE FileHandle, //檔案 裝置控制代碼 __in_opt HANDLE ExistingCompletionPort, //一個IOCP控制代碼 __in ULONG_PTR CompletionKey, //完成鍵 __in DWORD NumberOfConcurrentThreads //允許啟動並執行最大線程數量);
建立
HANDLE hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 一個數量);
關聯
CreateIoCompletionPort(hFile, hIOCP, CK_XXX, 一個數量);
OVERLAPPED結構
typedef struct _OVERLAPPED { ULONG_PTR Internal; //錯誤碼,系統管理 ULONG_PTR InternalHigh; //傳輸自位元組數 系統管理 union { struct { DWORD Offset; //起始位移 地位, 需要特別注意:大檔案時這個值容易溢出 DWORD OffsetHigh; //起始位移 高位 } ; PVOID Pointer; } ; HANDLE hEvent; //事件核心對象} OVERLAPPED, *LPOVERLAPPED;
IOCP的五個資料結構
①裝置列表
表示與該連接埠相關聯的一個或多個裝置
②IO完成隊列 FIFO
包含已傳輸位元組數、完成鍵、OVERLAPPED結構、錯誤碼等
當IO請求完成 或 調用PostQueuedCompletionStatus時 會往該隊列中添加項
③等待線程隊列 FILO
當線程池中每個線程調用GetQueuedCompletionStatus時,調用線程的線程標示符會被添加到這個等待線程隊列,這使得IOCP始終都能夠知道有哪些線程正在等待對已完成的IO請求進行處理。
④已釋放線程列表
對IO請求後進行處理的線程由於某種原因被掛起後,又被喚醒,就進入以釋放線程列表
⑤已暫停線程列表
對IO請求後進行處理的線程由於某種原因被掛起後進入已暫停線程列表
3、說明
IOCP中運行啟動並執行最大線程數一般是CPU個數
線程池中的最大線程數一般是CPU個數的2倍
下一篇用一個複製檔案的例子來示範一下IOCP的使用