IOCP理解

以下敘述僅限於網絡通信。
所謂完成端口,就是一個隊列。
這個隊列裏面以句柄(網絡通信裏爲socket)爲元素,在有消息到達後,通知工作線程(如果隊列裏的元素有投遞請求)進行消息處理。這個流程與select模型相反,select模型是主動查詢去獲取消息,而iocp則是由windows內核通知工作線程有消息來了你可以進行處理了。
同時,iocp有一個消息隊列,其中的每一個消息只會發送給一個工作線程。
具體流程(UDP爲例):
1.創建完成端口;
2.啓動工作線程;
3.創建socket並與本地端口綁定;
4.將socket句柄關聯到完成端口;
5.投遞請求;
6.關閉socket句柄;
7.關閉完成端口;
在上述流程中,對於每個socket句柄,3、4、5、6是必須的。而在每個socket的流程中,5步驟必須重複,因爲只有先投遞請求才能收到響應。

關於完成端口收到消息後的數據處理。
1.創建IO類,該IO類中有存儲數據的鏈表、消息處理回調函數的地址等信息。在該IO類的啓動函數(自定義函數)中,創建存儲空間並啓動消息處理線程,在該線程中調用回調函數處理存儲空間中的數據。
2.每個socket句柄關聯一個IO類對象,並把該socket的處理收到的消息的函數的地址傳給IO類對象。
3.把在工作線程中收到的消息直接存儲到IO類對象中,保證工作線程不會阻塞或者耗費很長時間去處理一個消息。
4.該IO類必須能夠自動擴展。比如原來的存儲空間爲1M,現在已經寫滿了,卻都沒有處理,然而消息還在源源不斷的到來,此時必須擴展存儲空間以容納更多的消息,當然,如何擴展及擴展多少則根據需求決定。
5.該IO類最好能夠自動縮減存儲空間,在消息比較少的時候釋放部分存儲空間。

經測試,在每s一萬條消息的情況下,iocp服務工作正常。在每s有8-10萬條消息的情況下也能保證每條消息都收到,對比select模型簡直堪稱完美!

由於是用手機,代碼就不提供了。

總結:iocp只是MS提供的一個處理模型,至於具體的消息接收、數據處理等則需要自行實現,對於高併發服務器簡直是利器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章