IOCP原理
簡介
I/O完成埠是為多處理器系統處理多重非同步I/O請求執行緒模型。
I/O完成埠就是與執行緒池配合使用的。
API
CreateIoCompletetionPort 建立IOCP和關聯一個或多個控制代碼到埠上。
GetQueuedCompletionStatus 等待或從IOCP佇列中取出完成包(completion packet)。
PostQueuedCompletionStatus 把一個完成包壓入IOCP的佇列。
CloseHandle 關閉IOCP
注意
- 微軟建議併發執行緒數指定為CPU核心數。
- IOCP自動關聯到建立它的程序且不能共享給其他程序。
- 一個執行緒只能關聯一個IOCP。
- IOCP不能嚴格保證事件的出列順序。
- 微軟建議應該先把IOCP所關聯的資源(包括所關聯的控制代碼)先釋放,最後再釋放IOCP。
原理
- 呼叫GetQueuedComoletionStatus(第一次呼叫)的使用者執行緒會被新增到等待執行緒佇列。
- 等待執行緒佇列的LIFO機制使得效能更優。
- 發生以下三種情況時,執行緒會與IOCP取消關聯:
- 執行緒退出。
- 執行緒關聯新的IOCP
- IOCP關閉
I/O完成埠相關核心結構:
1. 裝置列表 2. I/O完成佇列(先入先出,FIFO) 3. 等待執行緒佇列(後入先出,LIFO) 4. 已釋放執行緒列表(可以理解為工作執行緒列表) 5. 已暫停執行緒列表
裝置列表
內容:
• hDevice
• dwCompletionKey下·
新增:
• CreateIoCompletionPort被呼叫
刪除:
• 裝置控制代碼關閉
I/O完成佇列(先入先出)
內容:
• dwBytesTransferred
• dwCompletionKey
• pOverlapped
• dwError
新增:
• I/O請求完成
• PostQueuedCompletionStatus
刪除:
• 完成埠從等待執行緒佇列中刪除一項(GetQueuedCompletionStatus成功返回)
等待執行緒佇列(後入先出)
內容:
• dwThreadId
新增:
• 執行緒呼叫GetQueuedCompletionStatus進入休眠狀態。
刪除:
• I/O完成佇列不為空 && 已釋放執行緒列表項數(即正在執行的工作執行緒數)小於最大併發執行緒數。(GetQueuedCompletionStatus會先從I/O完成佇列中刪除對應的項,接著將 dwThreadId轉移到已釋放執行緒列表,最後函式返回)。
已釋放執行緒列表(可以理解為工作執行緒列表)
內容:
• dwThreadId
新增:
• 完成埠在等待執行緒佇列中喚醒一個執行緒
• 已暫停的執行緒被喚醒
刪除:
• 執行緒再次呼叫GetQueuedCompletionStatus(dwThreadId再次回到等待執行緒佇列)
• 執行緒呼叫一個函式將自己掛起(dwThreadId轉移到已暫停執行緒列表)
已暫停執行緒列表
內容:
• dwThreadId
新增:
• 已釋放的執行緒呼叫一個函式將自己掛起
刪除:
• 已掛起的執行緒被喚醒(dwThread回到已釋放執行緒佇列)