首页
社区
课程
招聘
[求助]IOCP中关于线程数目的一点疑惑!
发表于: 2009-9-22 00:41 5467

[求助]IOCP中关于线程数目的一点疑惑!

2009-9-22 00:41
5467
1,完成端口最优线程数目有的说是CPU数,也有说是CPU*2+2,反正相比系统中运行的线程的数来说还是很少的。

2,Windows是基于线程调度的系统,就IOCP这很少的几个线程,和系统中上百个线程相比,大多数时间都轮不到IOCP的线程(假设每个线程分得时间片都一样)。

现在假设有2000个连接发数据过来了,照这样下去就这么几个线程挨个处理下去都什么时候了(每个完成通知处理时间1ms,那也得2s)。怎么可能高效呢?

所以,我觉得是不是根据数据发送频率/流量来确定,线程再多点可能比较好?还是microsoft对 IOCP线程的时间片进行了优待处理?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 70
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
当然了,IOCP的完成后通知回调还是很有效的,只是对这个线程数目有点疑惑!就这么几个线程怎么应对上千个数据同时过来?
2009-9-22 00:44
0
雪    币: 248
活跃值: (1056)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看一看实验数据吧。
附件:I/O模型性能比较表
上传的附件:
2009-9-22 10:07
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我觉得就是不想在处理连接数据时候线程切换的消耗

另外楼主提的问题应该算是计算机整体性能上的问题了
2009-9-22 10:33
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
要回答你的问题,首先得讲讲windows对线程的调度处理问题,在windows中,线程有优先级的,windows总是把时间分给优先的线程,优先线程处理完了,再分给次优先线程,以次往下分配CPU时间,同一优先级线程,分配的时间理论上相等,但实际并不相等,如果说分给每个线程时间为1ms,但并不是每个线程都会将这1ms用完,如等待事件,IO读写处理等待,延时,放弃处理时间等等,有很多因素可以导致线程把CPU时间让出去,由系统调度给其它线程,
其次,按您的说法,系统中几百个线程,如果都把分配给他的CPU时间全部用完(这是非常极端情况,您的CPU将会达100%,而且机器卡得要死),那么,我告诉你,是的,大多数时间轮不到IOCP线程,因为你的线程没有设置优先级,将和其它大部份线程优先级相同,你的线程和几百个线程比较,只能分到相对较少的时间,但实际上,您的系统中几百个线程不会被分配给他的CPU时间全部用完,
如果有2000个连接发数据来,您的线程处理一个连接发来的数据所用时间为1ms,那么,的确得用2S,我只能告诉您,您的处理时间花得太长太长了,一般情况下,在IOCP线程中不使用同步IO函数,因为同步IO函数等待时间不是般地长(相对于异步函数来说)
系统调度线程的开销,不是一般的大,IOCP的优势在于减少系统对线程的调度时间,和减少系统代理IO这一环节,因为你的线程少,所以系统可以减少线程调度,在IOCP中,有一个激活线程的概念,如果一个线程处于被激活状态,那么,IO数据将优先被激活线程处理,而不是去调度其它线程来处理,如果你有2个CPU,而多个重叠IO同时完成,那么,将会由两个线程来处理,而不会调度给其它线程来处理
在IOCP中,如果您的IOCP线程中,没有使用任何同步函数,那么,与CPU数目相同数目的处理线程将是最好的选择,能达到很高效率,如果您多几个线程,多出来的线程将不会被调度,影响不大,但并不是越多的线程越来,越多的线程,只会带来更多的内存消耗与系统处理时间
建议你看一下windows线程调度相关资料以及异步IO相关东西...
2009-9-22 10:41
0
游客
登录 | 注册 方可回帖
返回
//