a.IOCP要做好3件事:
1>將完成端口與socket關(guān)聯(lián)
2>實現(xiàn)異步的I/O調(diào)用
3>線程間的同步
b.異步I/O調(diào)用要實現(xiàn)的東西:
1>處理好CompletionKey參數(shù)---->附加用戶參數(shù)
2>處理好Overlapped參數(shù)----->I/O內(nèi)存?zhèn)鬟f參數(shù)
c.模型
所有的I/O調(diào)用都是間接通過"完成端口"對象實現(xiàn)的。
1>發(fā)送狀態(tài)---->PostQueuedCompletionStatus
2>查詢狀態(tài)---->GetQueuedCompletionStatus
d.IOCP 3大麻煩事
1>WSAENOBUFS------操作系統(tǒng)鎖定內(nèi)存的最大數(shù)量的問題(解決方案:投遞1個空的WSARecv)。
>>這樣做犧牲了1個單獨連接的吞吐量但是能獲得較高的并發(fā)連接數(shù).
>>當(dāng)收到完成通知時,使用WSARecv接收數(shù)據(jù),直到返回WSAEWOULDBLOCK
>>但是單個連接的吞吐量也可以通過連續(xù)投遞若干個(需計算)WSARecv來改善(這里需要綜合考慮獲取1個平衡點)
2>包的亂序問題
>>包的亂序問題可以通過編號來避免,同時將亂序的包保存在HashTable中
>>包的亂序可以是包之間的亂序和包內(nèi)數(shù)據(jù)的亂序
3>內(nèi)存訪問錯誤的問題
>>當(dāng)客戶機(jī)斷開連接后,線程池可能嘗試多次釋放"客戶機(jī)的附加數(shù)據(jù)",造成內(nèi)存訪問錯誤。
>>解決辦法,對Pending包進(jìn)行計數(shù)統(tǒng)計,當(dāng)Pending包為0時才釋放內(nèi)存。