IOCP使用上的一点看法讨论。

Kevin_qing 2011-07-13 04:59:30
iocp的实现,在msdn和codeproject上面的例子都是创建一个iocp,然后所有socket加入该端口监视,n个工作线程全部等待同一个iocp对象。

这样做的坏处,对单个socket有多次io的情况,可能线程1收到第一次完成,线程2收到第2次完成。这里就存在一个包排序(例如2次都是read)或者需要锁定的情况。这样增加代码的复杂度,同时因为锁定,也会降低多线程下的性能。

而我的做法,是对每个线程建立一个iocp对象,并且该线程维护iocp监视的socket计数。

当有new connection时,选取计数值最小的iocp对象来监视该socket。

那么对于每个连接,上面的操作都简化为了单线程。只有在涉及到需要客户端交互时才需要有锁定操作。

同时,因为每个线程的连接数基本平均,负载上也比较均衡(假设每个客户端负载差不多的情况)。


大家的用法是什么样的,都来说说看




...全文
222 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yynetsdk 2011-08-23
  • 打赏
  • 举报
回复
首先建议看些开源的大项目,如sworld,mongoserver中对iocp的应用。

其次,对completeKey要有足够的认识。socket可以是key,此socket是广义的对socket的封装,包括消息队列etc。其锁是必须的,读/写有2个锁,如考虑大数据包操作,则需要有个计数器在socket内保证数据的完整和顺序。

Kevin_qing 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hyq1986 的回复:]

http://www.cppblog.com/oldworm/archive/2011/02/01/139662.html
[/Quote]

这个测试我觉得没啥意义。

echo实在太轻量级了,处理时间基本可以忽略不计,那么2种方式的比较实际就是单线程和多线程的比较。14%的cpu基本上就是线程切换的开销。

实际应用中,单纯的提高吞吐量我觉得没太大意义。而节约吞吐开销时间更为重要。

当处理数据速度低于吞吐量的时候,最终结果只会造成server崩溃。

比如程序每秒只能处理1m数据,但你收到2m每秒。最终结果只会是buffer把内存耗完。


而异步单线程方式则可以最大限度平衡收到数据和处理速度。
hyq1986 2011-07-28
  • 打赏
  • 举报
回复
奇怪,为什么帖子列表中这个贴的回复量显示为0
hyq1986 2011-07-24
  • 打赏
  • 举报
回复
http://www.cppblog.com/oldworm/archive/2011/02/01/139662.html
hyq1986 2011-07-24
  • 打赏
  • 举报
回复
不懂iocp,无法回答。

听起来你是类似这样的思路:
服务端要处理M个连接,M至少以千记。
服务端开N个线程,数量根据CPU核心来定,大约2倍于CPU。
然后把这M个连接分给N个线程,线程里面进行select。
而你的想法是用iocp代替select轮询。

4,387

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧