从MSDN中翻译了IO完成端口的文章,不得不说翻译的很烂,英语需要继续提高啊。。。

在一个多处理器系统上,IO完成端口提供一个非常高效的线程模型来处理多个异步IO请求。当一个进程创建了一个IO完成端口,系统会创建一个关联的队列用于处理请求。进程处理大量并发异步IO请求是非常快速和高效的,通过使用IO完成端口结合一个线程池是比在接收到请求时创建线程高效的。

完成端口是如何工作的

CreateIoCompletionPort方法创建一个IO完成端口,并且关联一个或多个文件句柄。当这些文件的一个异步IO操作完成时,一个IO完成包会被入队到一个FIFO的关联这个IO完成端口的队列。

Note

这个地方引用的术语文件句柄代表一个重叠IO终结点,而不仅仅是磁盘上的文件。比如,它可以是一个网络终结点,TCP socket,命名管道,或者邮件槽。它可以是任何一个支持重叠IO的内核对象。

当一个文件句柄关联了一个完成端口,the status block passed in will not be updated until the packet is removed from the completion port。只有当原来的操作被同步的返回一个错误才会出现异常。一个线程(被主线程创建或者主线程自己)使用GetQueuedCompletionStatus方法等待一个完成数据包被入队到IO完成端口,而不是直接等待异步IO完成。线程阻塞他们的执行在一个IO完成端口按照LIFO的顺序被释放,并且对于那个线程来说下一个来自IO完成端口的FIFO队列的完成数据包被pulled。意思就是,当一个完成数据包被释放到一个线程,系统会释放最近的关联了完成端口的线程,把最早的IO完成信息传递给这个线程。

虽然对于一个特定的IO完成端口,任意数量的线程可以调用GetQueuedCompletionStatus,当一个特定的线程第一次调用GetQueuedCompletionStatus,它开始关联这个置顶的IO完成端口知道下面三个事情发生:线程退出,指定一个不同的IO完成端口,或者关闭这个完成端口。此外一个线程最多关联一个完成端口。

当一个完成数据包入队到一个完成端口中,系统首先检查有多少个关联的线程正在运行。如果运行的线程的数量小于并发值,一个等待的线程被允许处理这个数据包。当一个运行的线程完成了它的处理,它又会调用GetQueuedCompletionStatus,它要么处理下一个数据包,要么当队列是空的时候进行等待。

线程可以使用PostQueuedCompletionStatus是一个完成数据包进入一个IO完成端口的队列。这样做,完成端口就可以被用来与其他线程进行通信,此外,还接收来自IO系统的完成数据包,PostQueuedCompletionStatus方法允许一个程序在不启动一个异步IO操作的情况下,入队它自己指定意图的完成数据包到这个完成端口。用于通知工作线程外部事件是非常有用的。

当没有引用时,完成端口会被释放。因此所有的句柄必须被适当的关闭,来释放完成端口和它关联的系统资源。程序应该使用CloseHandle来关闭完成端口句柄。

线程和并行

线程的并行值是完成端口需要考虑的最重要的属性。并行值是完成端口创建时通过NumberOfConcurrentThreats参数指定的。这个值限制了关联这个完成端口的可以运行的线程的数量。当所有可运行的线程达到最大值,系统会阻塞任何后来的线程的执行,直到可运行的线程数比并行值要小。

并行值的最大值最好是CPU的数量。如果你的事务处理需要一个比较长的计算时间,一个大的并行值来让整个线程执行。每个数据包可能需要执行比较长的时间才能完成,但是同一时间可以有更多的数据包被处理。你可以通过profiling工具尝试并行值,来达到最好的效果。

由于有可能出现线程挂起的情况,所以程序要创建比并行值多的线程。一个比较好的规则是并行值的最小值是处理器的两倍。

IO完成端口的更多相关文章

  1. 【windows核心编程】IO完成端口(IOCP)复制文件小例前简单说明

    1.关于IOCP IOCP即IO完成端口,是一种高伸缩高效率的异步IO方式,一个设备或文件与一个IO完成端口相关联,当文件或设备的异步IO操作完成的时候,去IO完成端口的[完成队列]取一项,根据完成键 ...

  2. IOCP IO完成端口

    一. IO完成端口概念 IO完成端口的出现是为了解决并发模型中可运行线程上下文切换开销过大而出现的. 在<Windows核心编程>的描述中,IO完成端口是Wnidows系统提供的最复杂的内 ...

  3. 异步机制 - IO完成端口

    1 KQUEUE KeInitializeQueue VOID KeInitializeQueue( IN PKQUEUE  Queue, IN ULONG  Count  OPTIONAL ); l ...

  4. PIC16SCM设置不同IO功耗端口状态的影响

    最近做的PIC低功耗微控制器,因此,要设置不同的IO端口状态有关电源的情况测试,在系列万用表的方法来测量电流,供应链管理IO港是在地狱,无头整个系统驱动器.的是PIC16F690单片机. 思路例如以下 ...

  5. led,key通用IO的端口

    1 注意通用IO端口, GPBCON 只能控制一个GPBDAT位(对应的位),而GPBUP可以使能GPBCON.

  6. 【C# 线程】IOCP IO完成端口-Windows系统下常见的7种I/O模型

    一.IOCP(I/O Completion Ports)简介        要实现异步通信,必须要用到一个很风骚的I/O数据结构 ,叫重叠结构"Overlapped",Window ...

  7. 【windows核心编程】IO完成端口(IOCP)复制文件小例

    1.演示内容 文件复制 2.提要 复制大文件时,使用FILE_FLAG_NO_BUFFERING标志 同时需要注意: 读写文件的偏移地址为 磁盘扇区 的整数倍 读写文件的字节数为 磁盘扇区 的整数倍 ...

  8. IOCP Input/Output Completion Port IO完成端口

    I/O completion ports provide an efficient threading model for processing multiple asynchronous I/O r ...

  9. io端口与io内存详解

    (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义.物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存.BIOS等).在程序指令中的虚拟地址 ...

随机推荐

  1. 进阶版css的点滴

    -moz-:firefox: -webkit- Safari 和 Chrome

  2. Python 3.5 连接Mysql数据库(pymysql 方式)

    由于 MySQLdb 模块还不支持 Python3.x,官方的Mysql连接包只支持到3.4,所以 Python3.5 如果想连接MySQL需要安装 pymysql 模块. pymysql 模块可以通 ...

  3. iazq更新网址

    [版本:1.1] [介绍:哈哈(ಡωಡ)hiahiahia 新版软件试试去和哥哥刚放学噢噢噢天然呆翡翠城] [链接:http://info.3g.qq.com/g/s?aid=index&g_ ...

  4. Windows如何修改MySQL用户root密码

    听语音 浏览:16925 | 更新:2015-06-12 14:49 | 标签:windows 1 2 3 4 5 6 分步阅读 MySQL是一个关系型数据库管理系统,在 WEB 应用方面 MySQL ...

  5. android的单击监听事件

    Button button = (Button) findViewById(R.id.button1); //1.直接new出来 button.setOnClickListener(new View. ...

  6. 模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用A,B,C,D表示,当选某候选人时,直接输入其编号(编号由计算机随机产生,若输入的不是A,B,C,D则视为无效票,选举结束后按得票数从高到底输出候选人编号和所得票数.

    模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用A,B,C,D表示,当选某候选人时,直接输入其编号(编号由计算机随机产生,若输入的不是A,B,C,D则视为无效票,选举结束后按得票数从 ...

  7. "i++"和"++i"浅析

    public class a{     public static void main(String[] args){         int k =100;         k++;//k+=,k ...

  8. 浅谈struts2之chain

    转自:http://blog.csdn.net/randomnet/article/details/8656759 前一段时间,有关chain的机制着实困绕了许久.尽管网上有许多关于chain的解说, ...

  9. Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解

    前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...

  10. 清除路由器NAT地址转换

    首先当你的NAT网络地址转换成功搭建起来,并且测试过网络通信时,此时NAT地址转换表上面是存在转换信息的,你可以通过在特权模式下输入命令"show ip nat translation&qu ...