从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. Object.assign()方法

    对象的扩展 1.ES6中,对象的属性和方法可简写:对象的属性值可不写,前提是属性名已经声明: var name = "zhangsan"; "; var obj = { ...

  2. 【转】scp 命令格式

    SCP 命令   \ svn 删除所有的 .svn文件 find . -name .svn -type d -exec rm -fr {} \; linux之cp/scp命令+scp命令详解   名称 ...

  3. SVN版本控制系统

    SVN 版本控制系统 1.SVN作用 防止代码丢失 : 因为没有哪个项目能够一次性开发完成 代码版本回退 : 你可以在开发过程中找到以前上传到服务器上面的所有版本 多人代码整合 : 公司中多个人开发同 ...

  4. ubuntu 终端设置(颜色与长路径)

    Linux给人最大的享受就是可以根据个人喜好去定制令自己舒服的系统配置,像终端颜色的设置就是一个典型的例子. 图1 系统默认状态下的终端显示     在没有经过自定义配置的终端下工作久了,难免容易疲劳 ...

  5. mybatis多数据源配置

    项目目录如下: 按照顺序配置吧 首先是配置config jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/a ...

  6. windows环境下修改Mysql的root密码

    最近一直没用Mysql,root密码给忘了,然后就自己修改了一下,现在整理一下步骤.(我的版本是5.1) 启动MySQL服务:>>net start mysql 关闭MySQL服务:> ...

  7. 学习ES6--data1

    在ES6之前,ES5没有块级作用域,没有继承,只有函数作用域,这些导致ES5会变量提升,和函数提升,例(如有错误,请指正): function test() { var name = 'test' t ...

  8. Python 学习---------Day6

    18章 模块:宏伟蓝图 import 使客户端(导入者)以一个整体获取一个模块 from 允许客户端从一个模块文件中获取特定的变量名 reload 在不中止Python程序的情况下,提供了一种重新载入 ...

  9. 「2014-4-13」Think twice before starting the adventure

    杂文一篇. 1. 取名字真心是一件特别困难的事情.这位独立开发者花了将近两天的时间,给他的私人项目取了个名字:这篇博客<为何我不鸟你的开源项目>里显然还忽视了一个原因,就是名字取得太烂以至 ...

  10. JAVA/Android Map与String的转换方法

    在Android开发中 Map与String的转换在,在一些需求中经常用到,使用net.sf.json.JSONObject.fromObject可以方便的将string转为Map.但需要导入jar包 ...