IOCP 几个要点

IOCP 几个要点

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时才释放内存。

你可能感兴趣的:(IOCP 几个要点)