为何IOCP能够同时处理成千上万个连接???(20分)

  • 主题发起人 主题发起人 mill666
  • 开始时间 开始时间
M

mill666

Unregistered / Unconfirmed
GUEST, unregistred user!
看了IOCP文章,有个问题一直郁闷:
IOCP根据CPU的数量,创建CPU*2个线程来处理客户端的请求,如果我只有一个CPU,那么这个线程数就是2,我们就叫它ThreadA和ThreadB;
问题是,如果处理客户请求的过程很耗时,比如是文件传输服务器ftp,如果TheadA正在服务某个客户端ClientA,ClinetA请求传输好几百兆的数据,那么线程ThreadA就一直在为ClientA服务,说不定好几个小时哟【因为文件有好几百兆啊】,如果另外一个客户ClientB也提交了一个几百兆的文件请求,那么ThreadB为ClinetB服务,估计也是要很长时间。

如果这个时候再来一个客户端ClinetC请求,那么这个服务器拿什么线程为ClinetC服务??
这样的法,服务器不就是只能同时处理2个客户端了???

当然,我的理解是错误的,因为Iocp确实能够处理多个客户端,可是我觉得郁闷的地方就是这种处理客户端请求需要很长时间的情况下,为什么还能处理多个客户端???

我看网络上很多关于IOCP的例子都是举例echo服务器,这种服务器处理客户端请求不费时,所以线程利用率就很高。

问题是处理客户端请求 需要很长时间的情况下,怎么能处理多个客户端??
 
系统处理多个线程时采用的是分时分片机制,比如把时间分成100ms一片.分别对a,b c...用户响应.
第一轮,先对a服务100ms,再对b服务100ms,...
接着第二轮....
依次类推...
 
startpc大侠:
我问的并不是你答的。不知道你对IOCP模型了解吗?
我问的是IOCP模型中,只创建了CPU*2个工作线程,我的CPU只有一个,那么就是创建两个线程了,就这么两个线程怎么同时服务成百上千个客户端?
你回答的只是CPU怎么分配时间服务于线程。
 
CPU*2个线程 作为服务 侦听线程(ThrdA, ThrdB)。文件传输应该是由(ThrdA, ThrdB)创建另外的工作线程吧。不知我说的对不对。请不吝指教。谢谢~
 
再多的客户端都最终被排成了队的,所谓并发处理是宏观上的概念,从微观来说则是非并发的,只要处理的足够快对于每个用户来说就等于被立即处理了。数据又是分包的,没有可能说一次传几百兆东西过来,实际上workthread是同时为多个(或者说全部的用户服务),当遇到某个用户的数据的时候就切换到该用户的用户上下文中进行处理。
 
后退
顶部