对于I/O完成端口机制我的理解

研究了大概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处理完成的通知由系统送入完成端口信息队列。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值