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。
相关文章推荐
- mysql 写入优化
- web前端学习路线推荐(讲的很细致)
- 关于Java中File的renameTo函数
- Controlling WebBrowser Control Compatibility
- phpMyAdmin 安装配置
- Centos6.5安装配置SVN
- LeetCode Sort List 链表的归并排序
- 深入Java字符串
- 使用PBEWithMD5AndDES算法对数据的加密和解密
- left join ,right join ,inner join 的区别
- iOS应用程序的本地化-(妖妖随笔)
- (转)ASP.NET Identity入门系列教程(一) 初识Identity
- android 轮播图无限循环,自动播放
- 读书笔记之TCP/IP1(1)
- android四大组件之--->BroadcastReceiver广播接收器
- 软件测试常用术语
- CentOS添加路由
- LoadRunner
- linux常用命令(18):locate命令
- linux 下取进程占用 cpu/内存 最高的前10个进程