您的位置:首页 > 其它

Window I/O 完成端口 (Windows I/O Completion Port (IOCP))

2015-09-08 16:19 399 查看

相关对象



IO EndPoint, 所有支持重叠IO(overlapped IO)的设备,比如文件,Winsock,管道等。

IOCP, IO完成端口内核对象,可以使用API CreateIoCompletionPort 创建。在使用该API创建IOCP的同时可以关联一个IO EndPoint,也可以在创建后再次调用该API关联其他的IO Endpoint。

Thread,Windows 线程。用来响应IO完成通知。通常用来处理接受到的数据等。

一个IOCP可以关联多个IO EndPoint,但一个IO EndPoint应该只关联上一个IOCP。

一个IOCP可以关联多个Thread,但一个Thread只能关联一个IOCP。

对象协作流程



调用API [b]CreateIoCompletionPort [/b]创建IOCP,同时关联IO EndPoint;

创建线程,用来响应IO完成事件。针对一个IOCP可以指定可以并发执行的最大线程数,也就是可以同时处于活动状态的线程数量。但实际创建的线程数可以更多些。这样可以确保当某个活动的线程运行过程中因故挂起而IOCP队列里头还有待处理的通知时还有空闲的线程可以被系统激活;关于实际线程数量的选择,需要根据具体应用的需要确定。一般建议CPUs+1or2. 线程数量增加可以提高响应速度,但是会增加系统开销。

线程一旦创建,可以调用API [b]GetQueuedCompletionStatus [/b]来等待处理某个IOCP队列里的IOCP包。当有多个线程调用该API时,就会形成一个针对那个IOCP的线程等待队列。该队列实际上是后进先出的堆栈。使用后进先出的调度策略可以很大程度上确保调用该API的当前线程被激活。而激活当前线程,避免了线程的上下文的切换,从而提高了系统运行效率。

IO EndPoint完成某个IO操作后,会产生一个IOCP包加入到先进先出的IOCP队列中。随后,系统会激活线程等待堆栈顶端的线程来处理ICOP队列里头的IOCP包;

线程处理完毕,再次调用AP I[b]GetQueuedCompletionStatus [/b]继续等待IOCP队列里的IOCP包。

关于系统线程池和线程调度的更多信息,请参阅Thread Pools

关于IO完成端口详细信息,请参阅I/O Completion Ports
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: