待總結 IOCP相關

2021-09-16 23:29:19 字數 1974 閱讀 7511

i/o完成佇列(先進先出) q1

等待執行緒佇列(後進先出)q2

已釋放執行緒列表(活動執行緒)l1

已暫停執行緒列表(掛起執行緒)l2

1.當執行緒呼叫getqueuedcompletionstatus阻塞時,該執行緒被放入等待執行緒佇列q2中。

io 完成埠核心物件根據此佇列知道有哪些執行緒在等待處理completion packet。執行緒等待佇列是按照 lifo 的方式入隊的,也就是當有乙個 completion packet 到來時,系統先喚醒最後呼叫getqueuedcompletionstatus進入等待佇列的執行緒。

2.當乙個非同步 io 請求完成了。

1)系統會去檢查是否這個 io 裝置與任何 io 完成埠關聯了,如果是,系統會在 io 完成埠佇列q1的末尾新增乙個 completion packet(以 fifo 的順序入隊),getqueuedcompletionstatus就是在這個佇列上等待。

2)此時completion packet來了,若正在執行的執行緒數小於最大併發執行緒數,從等待執行緒佇列q2中拿到最後進入的執行緒tn將其喚醒,並將tn執行緒從等待佇列q2中刪除,將其tn的執行緒id放入已釋放執行緒列表(活動執行緒)l1中,且getqueuedcompletionstatus返回,此執行緒tn被喚醒處於活動狀態。此時該completion packet從 io 完成埠佇列q1中刪除。

3.若正活動的執行緒tn再次呼叫getqueuedcompletionstatus時,該執行緒id從已釋放執行緒列表(活動執行緒)l1中刪除,且該執行緒再次進入等待執行緒佇列(後進先出)q2中。

1)建立 iocp 的時候會指定乙個併發值,雖然任意個執行緒可以關聯到這個 iocp,但是併發值限定了可以同時執行的執行緒數。假設這樣的場景,有乙個併發值為 1 的 iocp,但是有多於乙個的執行緒關聯到了這個 iocp,如果完成佇列中總是有乙個 completion packet 在等待,當正在執行的執行緒呼叫getqueuedcompletionstatus時就會立即返回,該執行緒處理完這個 completion packet 再次呼叫getqueuedcompletionstatus又會立即返回。在處理 completion packet過程中,雖然完成佇列中始終有 completion packet 待處理,但是因為併發值為 1 的原因,系統不會去排程其他執行緒來執行,儘管關聯 iocp 的執行緒不止乙個。同時也避免了執行緒切換的開銷,因為始終都是這乙個執行緒在執行。

2)在上述情況中,看起來執行緒池中關聯的其他執行緒毫無用處,但是其實是沒有考慮到正在執行的執行緒進入等待狀態或者因為某種情況與該 iocp 解除繫結時的情況。如果正在執行的執行緒呼叫sleepwaitfor*,或者乙個同步 io 函式,或者任何可以引起當前執行緒從執行狀態變為等待狀態的函式時,iocp 就會立即排程其他關聯的執行緒,維持始終有乙個執行緒在執行。

for(int i=0; icreatethread(...workthread...);

工作執行緒

workthread()

getqueuedcompletionstatus(...);

1. windows iocp完成埠原理詳解

2. windows iocp實踐

1和2結合著看,理解原理

3. iocp

4. 完成埠高效的三個原因

3和4概括總結,解決問題

5. 完成埠(completionport)詳解

一步一步如何使用詳解

6. iocp模型與網路程式設計

6包含具體的例子

7.  關於windows完成埠(iocp)的一些理解

7包含關鍵函式的講解

8. windows socket程式設計之完成埠模型

9. 結構體指標之間喝結構體之間的強制型別轉換那些事

IOCP相關的一些總結

1 在iocp中投遞wsasend返回wsa io pending的時候,表示非同步投遞已經成功,但是稍後傳送才會完成。這其中涉及到了三個緩衝區。網絡卡緩衝區,tcp ip層緩衝區,程式緩衝區。情況一 呼叫wsasend傳送正確的時候 即立即返回,且沒有錯誤 tcp ip將資料從程式緩衝區中拷貝到t...

IOCP模型總結

呼叫的步驟如下 抽象出乙個完成埠大概的處理流程 1 建立乙個完成埠。2 建立乙個執行緒a。3 a執行緒迴圈呼叫getqueuedcompletionstatus 函式來得到io操作結果,這個函式是個阻塞函式。4 主線程迴圈裡呼叫accept等待客戶端連線上來。5 主線程裡accept返回新連線建立以...

記錄,待總結

1.關於函式位址 class a void h virtual void g 0 int main mike jack 4.乙個類的成員變數列表中包含另乙個類的物件,叫做包含 包容 10.傳遞陣列的3種方式 1 void func int a 2 void func int a 5 3 void f...