荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: mmkiller (PPMM makes me go around), 信区: Program
标  题: 对于I/O完成端口机制我的理解
发信站: 荔园晨风BBS站 (2005年03月27日13:20:50 星期天), 站内信件

研究了大概1天多的完成端口的文章、代码,刨了一下MSDN大概弄清楚了这个机制
是怎么一回事。

I/O完成端口是WinNT下的一个机制,看起来像是一个FIFO的消息队列。

举个例子说,例如一个Winsock做的服务器(看作是工厂),主线程建立了一个完
成端口(可以看作是一个流水线),然后建立了几个线程,几个线程同时用
GetCompletionPortStatus()函数获取完成信息并阻塞自身(可以把线程看作是流
水线上的工人,用函数等待阻塞自身可以看作是等待流水线传来货物),然后主线
程就开始监听循环,响应连接请求(相当于工厂接单)。然后连接完成之后客户端
和服务器端就可以开始用WSASend/WSARecv(货物来源/产品生成)函数进行数据收
发了。由于WSASend/WSARecv这两个是I/O操作的函数,在这些I/O操作的过程之中
数据还没传送完毕不能处理(货物还没到达流水线),所以线程们一直处于等待的
状态。当I/O操作完成后(货物到达流水线),其中一个等待的线程
GetCompletionPortStatus()得到返回,开始执行接下来的代码处理输入(工人进
行货物加工),处理完以后可以发回处理后的数据或者继续等待下一次的数据接收
。如果在线程1处理过程中又有数据到达而线程1还没处理完,这时候等待的线程2
就可以开始工作了。

这样做的好处就是不必每一个套接字对应一个线程,从而节省了线程的数目。只需
要预先建立若干并发线程(具体数目怎样决定的问题正在问CSDN的牛人们,不过总
的来说应该取决于数据交换的繁忙程度,过多会浪费系统资源,过少可能会令完成
端口消息的队列堆积过多来不及处理),再对已经完成了I/O操作的套接字进行数
据处理即可。I/O处理完成的通知由系统送入完成端口信息队列。



原文地址:http://blog.csdn.net/garfield/archive/2005/03/27/331511.aspx
--
                                ▁▃▅▇▇▅▃▁
                               ╭┼╮  ▌  ╭┼╮
                              ╱ │ ╲ ▌ ╱ │ ╲
                              ◥██◤ ▌ ◥██◤
                                    ◢██◣
                                Libra Bigcat.NET
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 218.18.200.233]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店