http://community.csdn.net/Expert/topic/4453/4453593.xml?temp=.8793756
“Windows NT小组注意到这些应用程序的性能没有预料的那么高。特别的,处理很多同时的客户请求意味着很多线程并发地运行在系统中。因为所有这些线程都是可运行的[没有被挂起和等待发生什么事],Microsoft意识到NT内核花费了太多的时间来转换运行线程的上下文[Context],线程就没有得到很多CPU时间来做它们的工作。大家可能也都感觉到并行模型的瓶颈在于它为每一个客户请求都创建了一个新线程。创建线程比起创建进程开销要小,但也远不是没有开销的。我们不妨设想一下:如果事先开好N个线程,让它们在那hold[堵塞],然后可以将所有用户的请求都投递到一个消息队列中去。然后那N个线程逐一从消息队列中去取出消息并加以处理。就可以避免针对每一个用户请求都开线程。不仅减少了线程的资源,也提高了线程的利用率。理论上很不错,你想我等泛泛之辈都能想出来的问题,Microsoft又怎会没有考虑到呢?”-----摘自nonocast的《理解I/O Completion Port》
也就是说IOCP模型和其它模型(如select模型)的区别是不是其它模型(如select模型)只开了一个线程处理一个来自不同客户端而放入服务器端消息队列的消息,而IOCP模型是开了n个线程来处理一个(这里也是一个消息队列吧?)来自不同客户端而放入服务器端消息队列的消息??
-----------------------------------
A:
对于连接的监听(listen)来说,一般都是单线程,关键在于 I/O这一块的处理方法有区别。
iocp是先调用异步读写函数,然后由os内核去处理实际的io工作,处理完了应用层再取出来投射进去的缓冲区;而select模型是通过os内核获取读写通知,然后再调用读写函数进行读写。前者可以支持重叠io,效率更高,但是编程也更复杂。
iocp一般是先开若干个线程(数目固定),在线程中轮询io完成情况,并做相应处理。
博客围绕Windows系统展开,指出处理多客户请求时并行模型瓶颈在于为每个请求创建新线程。介绍了一种预先开启N个线程处理消息队列的设想。还对比了IOCP模型和select模型,指出前者开n个线程,支持重叠IO,效率高但编程复杂;后者单线程处理,通过内核获取读写通知再读写。
的区别&spm=1001.2101.3001.5002&articleId=550283&d=1&t=3&u=b09d2f7bed6945e9b2cf9978b7736db2)
1万+

被折叠的 条评论
为什么被折叠?



