0
问题的起因:
大概的例子就是这样 为什么只创建2个线程来处理用户信息?在while循环里WSAAccept的时候要是有1000个用户都连进来了 那么2个线程够处理吗?
另外 不是听说IOCP是管理线程池的吗 一运行一个IOCP,系统就建1000好几百个线程sleep着, 然后有客户连进来就抓来一个线程让他醒过来为客户服务 客户用完以后再把回到线程池里而不关掉
可是我左找右找只找到了2个线程 那1000好几百个线程到哪里去了?
==================================================
大概的例子就是这样 为什么只创建2个线程来处理用户信息?在while循环里WSAAccept的时候要是有1000个用户都连进来了 那么2个线程够处理吗?
另外 不是听说IOCP是管理线程池的吗 一运行一个IOCP,系统就建1000好几百个线程sleep着, 然后有客户连进来就抓来一个线程让他醒过来为客户服务 客户用完以后再把回到线程池里而不关掉
可是我左找右找只找到了2个线程 那1000好几百个线程到哪里去了?
相关重要讨论信息:
jiangsheng(蒋晟.Net[MVP])
wqrz_013()
DentistryDoctor(不在无聊中无奈,就在沉默中变态)
kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)
sevencat(七猫)
我来把他的实现贴一下吧。
baodi_z(冷冷的太阳)
coolFly19()
sevencat(七猫)
lzzqqq(Jonersen)
shootingstars(有容乃大,无欲则刚)
sevencat(七猫)
level1979(岳麓飘湘)
IO2( G*道也)
大概的例子就是这样 为什么只创建2个线程来处理用户信息?在while循环里WSAAccept的时候要是有1000个用户都连进来了 那么2个线程够处理吗?
另外 不是听说IOCP是管理线程池的吗 一运行一个IOCP,系统就建1000好几百个线程sleep着, 然后有客户连进来就抓来一个线程让他醒过来为客户服务 客户用完以后再把回到线程池里而不关掉
可是我左找右找只找到了2个线程 那1000好几百个线程到哪里去了?
==================================================
大概的例子就是这样 为什么只创建2个线程来处理用户信息?在while循环里WSAAccept的时候要是有1000个用户都连进来了 那么2个线程够处理吗?
另外 不是听说IOCP是管理线程池的吗 一运行一个IOCP,系统就建1000好几百个线程sleep着, 然后有客户连进来就抓来一个线程让他醒过来为客户服务 客户用完以后再把回到线程池里而不关掉
可是我左找右找只找到了2个线程 那1000好几百个线程到哪里去了?
相关重要讨论信息:
jiangsheng(蒋晟.Net[MVP])
引用
When an application creates a completion port it specifies a concurrency value. This value indicates the maximum number of threads associated with the port that should be running at any given point in time.
HANDLE CreateIoCompletionPort(
HANDLE FileHandle,
HANDLE ExistingCompletionPort,
DWORD CompletionKey,
DWORD NumberOfConcurrentThreads
);
you set NumberOfConcurrentThreads to zero.
HANDLE CreateIoCompletionPort(
HANDLE FileHandle,
HANDLE ExistingCompletionPort,
DWORD CompletionKey,
DWORD NumberOfConcurrentThreads
);
you set NumberOfConcurrentThreads to zero.
wqrz_013()
引用
还是没能够听明白 有人有完整的传送文件的完成端口例子吗 给个做参考啊 wqrz@163.com
为什么只创建2个线程来处理用户信息?
为什么只创建2个线程来处理用户信息?
在while循环里WSAAccept的时候要是有1000个用户都连进来了 那么2个线程够处理吗?
在while循环里WSAAccept的时候要是有1000个用户都连进来了 那么2个线程够处理吗?
为什么只创建2个线程来处理用户信息?
为什么只创建2个线程来处理用户信息?
在while循环里WSAAccept的时候要是有1000个用户都连进来了 那么2个线程够处理吗?
在while循环里WSAAccept的时候要是有1000个用户都连进来了 那么2个线程够处理吗?
DentistryDoctor(不在无聊中无奈,就在沉默中变态)
引用
2个线程是用于并行处理的,所谓的1000是同一个完成端口允许关联的IO(当然这个数字可以更大)
www.codeproject.com/internet
上面有许多完成端口的示例。
www.codeproject.com/internet
上面有许多完成端口的示例。
kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)
引用
完成端口是一个复杂的内核对象
http://blog.csdn.net/vbuilderv/archive/2006/02/11/596476.aspx
http://blog.csdn.net/vbuilderv/archive/2006/02/11/596476.aspx
sevencat(七猫)
我来把他的实现贴一下吧。
引用
太长了,贴不下,其实就是这样的,
createiocp的时候传的线程参数就是KeInitializeQueue中的个数,这个是用来激活线程和插入的时候用的。
createiocp的时候传的线程参数就是KeInitializeQueue中的个数,这个是用来激活线程和插入的时候用的。
baodi_z(冷冷的太阳)
引用
完成端口可以管理几千连接,不是用来管理线程的
coolFly19()
引用
完成端口在我理解看来也就是用来管理异步过程调用的,呵呵!在Wait等待事件函数中存在数量限制,而完成端口不存在这一限制。
只给完成端口启动2倍CPU的线程,这是因为线程也耗系统资源,在一个时间片内一个CPU上只会处理一个线程,大量的线程上下文切换也很耗时间,设定2倍的线程,是因为线程处理例程可能会处理比较耗时的操作,这时如果完成端口又来了请求,系统就会唤醒线程池中的空闲线程及时响应,所以设定为2倍。说得够明白了吧!^-^
只给完成端口启动2倍CPU的线程,这是因为线程也耗系统资源,在一个时间片内一个CPU上只会处理一个线程,大量的线程上下文切换也很耗时间,设定2倍的线程,是因为线程处理例程可能会处理比较耗时的操作,这时如果完成端口又来了请求,系统就会唤醒线程池中的空闲线程及时响应,所以设定为2倍。说得够明白了吧!^-^
sevencat(七猫)
引用
传的参数不是让完成端口去启动多少个线程(事实上,那些调用是由内核队列来完成),而是IOCP同时唤醒的线程数量。完成端口唤醒一个线程后会在线程的一个地方把他的工作队列记住
//KeInsertQueue 插入的是什么? 是客户SOCKET(HANDLE)? 还是调用异步ReadFile(..)(WSARecv)时返回的结果?
后一个,也就是你用GetQUeue...拿出来的结果。那个名字取名为GetQueue..还是很合理的。
//send()和WSASend()有什么区别? 第一个我知道是把想发送的内容拷贝到缓冲 第2个能?也是吗? 是不是第一个是同步的 第2个支持异步?
第1个函数最终调用第2个(你要是想看这部分原代码,可以找一下,能找到),第2个也是COPY到缓冲。第二个才支持异步。
//KeInsertQueue 插入的是什么? 是客户SOCKET(HANDLE)? 还是调用异步ReadFile(..)(WSARecv)时返回的结果?
后一个,也就是你用GetQUeue...拿出来的结果。那个名字取名为GetQueue..还是很合理的。
//send()和WSASend()有什么区别? 第一个我知道是把想发送的内容拷贝到缓冲 第2个能?也是吗? 是不是第一个是同步的 第2个支持异步?
第1个函数最终调用第2个(你要是想看这部分原代码,可以找一下,能找到),第2个也是COPY到缓冲。第二个才支持异步。
lzzqqq(Jonersen)
引用
两个线程是处理绝对的并发请求,假如真的会有1000个并发请求,两个线程同时处理也是非常快的,估计1-2秒就差不多了.
完成端口并不是为每个请求开一个线程,否则会把cpu累坏的.楼主没真正理解.
完成端口并不是为每个请求开一个线程,否则会把cpu累坏的.楼主没真正理解.
shootingstars(有容乃大,无欲则刚)
引用
完成端口的目的就是为了减少线程数目。
对于一个CPU而言,只能有一个线程处于工作状态,开1000个线程看似并行,其实还是串行。并且操作系统调度1000个线程需要不小的开销。
IOCP就是为了减少这种线程的切换,在早期的Windows编程书籍上甚至建议有多少个CPU就建立多少个工作线程。(我也疑惑为什么是2倍呢?一个CPU一个工作线程似乎是更好的选择)
对于一个CPU而言,只能有一个线程处于工作状态,开1000个线程看似并行,其实还是串行。并且操作系统调度1000个线程需要不小的开销。
IOCP就是为了减少这种线程的切换,在早期的Windows编程书籍上甚至建议有多少个CPU就建立多少个工作线程。(我也疑惑为什么是2倍呢?一个CPU一个工作线程似乎是更好的选择)
sevencat(七猫)
引用
开多个线程也没用,因为IOCP只会激活你创建的时候传进去参数的那个线程
当你的线程在诸如做数据库调用的时候或者读写文件,如果处于等待状态,IOCP会激活另外一个线程。所以不用太担心。
当你的线程在诸如做数据库调用的时候或者读写文件,如果处于等待状态,IOCP会激活另外一个线程。所以不用太担心。
引用
完成端口的出发点之一就是减少性能在线程切换时的损失吧,好像有的例子里面工作线程的个数是CPU*2+2,据说是实际测试出来的结果这样的设置效率最高
IO2( G*道也)
引用
线程间的操作已经由MS雇佣的人给极高效率地优化了,是超级机器人的效率,只要2个线程,你就添呀(请求)取呀(数据)就很爽了!
[原创]关于UUCall3网络电话协议分析
AcceptEx Function[MSDN 做个记录]


2007/12/17
12:59
2971



