关于IO完成端口(IO Completion Port),译|摘

本文围绕IO完成端口展开,介绍其是应用程序处理异步I/O请求时线程池的使用机制,处理并发异步I/O请求更高效。还阐述了相关函数如CreateIoCompletionPort、GetQueuedCompletionStatus等的作用,以及完成端口的concurrency属性,最后提及它在Winsock2中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于IO完成端口(I/O Completion Port)

  学习线程池时,碰到了IO Completion Port这个词汇,所以找了些资料看看,MSDN资料简单翻译一下,基本上可以了解IO完成端口的概念,在《游戏编程精粹III》中也有一段谈到了这个概念,一并摘录至此。

I/O完成端口(I/O Completion Ports),译

  I/O完成端口是应用程序启动后处理异步I/O请求时所创建线程池的使用机制。这些
线程创建的唯一目的是处理I/O请求。处理众多并发异步I/O请求的程序通过应用I/O完成
端口比I/O请求时创建线程更快、更有效率。
  CreateIoCompletionPort函数可以使一个或多个file handles与一个I/O完成端口结
合。当一个file handle已绑定到I/O完成端口,其上的异步I/O操作开始时,一个I/O
completion packet就会排队到当前端口。这可以用来把多个file handles的同步点组合
一个单独对象中(大概是说,组合到一个I/O完成端口对象中??)。
  一个线程应该使用GetQueuedCompletionStatus函数等待排队到完成端口中的
completion packet,而不是直接等待异步I/O完成(原意含前一个方法更好之意)。阻
塞在同一个完成端口上的线程按照后进先出(LIFO)的顺序进行释放(release)。这也就
意味着当一个completion packet排队到完成端口时,系统将释放(release)最后一个线
程来阻塞端口上它的执行。
  当一个线程调用GetQueuedCompletionStatus时,它就会结合到指定完成端口,直到
退出、指定了另外端口或者释放了该完成端口。一个线程最多与一个完成端口相结合。
  完成端口最重要的属性是concurrency,完成端口的concurrency属性值是在端口创
建时指定的。该值限制了可与指定完成端口结合的可执行线程数量,如果已经到达指定
(要求)的最大线程数,系统将阻塞指定到该完成端口的任意后续线程,直到可执行线
程数量小于了指定值。最有效、最令人满意的就是completion packets在队列中排队,
但不需要等待,其实这也是因为端口已经到达了它的concurrency限制。既然如此,当一
个执行线程调用GetQueuedCompletionStatus时,排列的completion packet将立即提交
(pick up),而不会有上下文的转换产生,这是由于,连续提交completion packets时,
其他线程不会运行。
  Concurrency的最佳值为所在计算机的CPU数量。如果你的事务需要冗长的处理,大一
些的concurrency值就允许更多的线程运行。每个事务完成将花费更长时间,但同一时刻
更多的事务处理将得到执行。
  PostQueuedCompletionStatus函数允许程序将特殊目的的I/O completion packets排
队到完成端口,而不用启动一个异步I/O操作。对于通知工作线程外部事件触发时非常有
用。
  没有任何引用时,完成端口将被释放。完成端口句柄及每个结合到完成端口的文件句
柄都会引用完成端口。释放完成端口前,必须首先释放所有这些句柄。调用CloseHandle
函数关闭端口句柄。

以下摘自《游戏编程精粹III》,与Winsock有关系:

  微软在Winsock2中引入了IOCP(I/O完成端口)。IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序,与使用select()或其他异步方法不同的是,一个套接字与一个完成端口关联了起来,然后就可以继续运行正常的Winsock操作了,然而,当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中,然后应用程序可以对核心层进行查询以得到此完成端口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值