1. 程式人生 > >IOCP原理

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回到已釋放執行緒佇列)