读书人

新手对IOCP完成端口的不解解决方案

发布时间: 2012-05-05 17:21:10 作者: rapoo

新手对IOCP完成端口的不解
近来自己做个通信程序,证券方面的,客户端从服务端获取行情数据,由于数据量大,每次下载一次数据,花的时间比较长,少则几分钟,多则几十分钟,甚至个把钟头。都说完成端口高效,能连接的客户端比较多,于是我稍微查了些资料,依葫芦画嫖的也搞了个出来。可是我总感觉使用完成端口,也高效不起来啊,比如工作者线程,要开CPU*2+2=4(假设值),那么,同一时间真正干活的,也就这4个线程了,其他客户端连接进来太多也没用处啊,还必须等某个工作者线程干完了才轮到他。
由于每个线程的工作量大。。假设某一分钟里,有100个客户端连接进来要下载数据,而同时只有4个客户端能获得下载,其他的只能被迫等待,从效率上讲,反而不如100个客户端,每个客户端分配一个工作线程的那种下载方式了。
给位大侠,我这种理解对吗?

[解决办法]
完成端口用在处理多并发的时候比较好用,假如你有几千甚至上万的连接要处理,你就没法开这么多线程了。

另外多开线程也会带来线程切换耗费的时间,系统资源耗费的也比较多。
[解决办法]
像你这种情况,你是服务器往客户端发数据,你说的下载等待其实跟完成端口没什么关系,你发送的时候是用一条线程发送的吧,完成端口只是在发送完成的时候通知你一下,同样都是单线程发送的情况下肯定是用完成端口效率高,阻塞模型你发送的时候就要等待。

使用完成端口也一样可以多开线程去发送啊。但是我觉得这是没有必要的,单线程发送完全够用,瓶颈不会是在上层的发送这,应该是在底层的发送那。
[解决办法]
thread不在多.多了反而效率下降
[解决办法]

探讨
至于所说的多开线程也会带来线程切换耗费的时间,这点时间,与大量的数据库查询比起来,应该是不值一提的吧。

[解决办法]
你的说法是不对的,IOCP可以让几千个客户端同时工作,任何操作都是异步的,为什么会有一个客户端没收完别的客户端连接就不起作用的想法呢?完全可以并发进行的啊,而且读盘和网络也是可以并发的
[解决办法]
其实网上和书上的IOCP例子都是不靠谱的
实际最好把Socket IO和数据(业务逻辑)分开处理,即另外开一组线程(池)去处理数据
CPU*2+2的线程只处理socket的操作
[解决办法]
完成端口关联的线程,最好别去访问数据库,最好只处理和socket相关的操作。
[解决办法]
完成端口一般是和Overlapped I/O协同工作的,其所有的IO操作都是异步的,因此才能通过很少的线程来实现大的吞吐量。
如果你的数据库操作、网络数据读取是同步的,那效率当然低了。
如果需要操作数据库且不能做成异步的,那可以尝试创建额外的线程获取数据,然后传递给完成端口的线程处理。
[解决办法]
lz要理解清楚,iocp是并发量,不是吞吐量。

[解决办法]
看看对你有没有用

http://blog.csdn.net/kevin_qing/article/details/7363714
[解决办法]
每个线程的工作量大是指什么?你看了任务管理器里面CPU占用量大么?据我理解一般下载类应用,都是磁盘I/O和网络接口的负载大,CPU是负载很小的,你一个线程可能要发很多数据、执行很长时间,但大部分时间都是在等待设备操作而不是在执行代码,如果采用一个下载事务一个线程必然会进行大量的线程切换,采用完成端口就能让你尽量避免这些线程切换,从而提高CPU利用效率,也节约了线程资源。
[解决办法]
最好开工作线程来做这个事情,另外,用户发送过来的完整数据可能在传输过程中变成多段,你还要有拼装流数据的方法。
[解决办法]
IOCP适用于大量连接,小IO这种场合,如果数据量大也不合适。

如果是下载可以考虑用其它服务器来分担下载量,比如HTTP,FTP等等
[解决办法]
如果追求下载速度,不考虑并发量,建议用阻塞模式比异要高效些
[解决办法]
iocp效率最高,并发执行相当快,cpu充分利用
多线程理论上说可以。但是实际上cpu能量降低,一致不能回应连接2000个。

读书人网 >VC/MFC

热点推荐