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