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