从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. ORACLE RAC 11G 更改 /etc/hosts文件

    来自官方文档:()Can I change the public hostname in my Oracle Database 10g Cluster using Oracle Clusterware ...

  2. JSTL和EL

    JSTL和EL 1.EL表达式总是放在大括号里,而且前面有一个美元符前缀. person.name2.相似点:(1).都可以让我们在静态内蓉中插入动态信息.EL:室外温度是{emp}度 JSP:室外温 ...

  3. jQuery选择器引擎和Sizzle介绍

    一.前言 Sizzle原来是jQuery里面的选择器引擎,后来逐渐独立出来,成为一个独立的模块,可以自由地引入到其他类库中.我曾经将其作为YUI3里面的一个module,用起来畅通无阻,没有任何障碍. ...

  4. 高尔夫管理系统SSH

    登录-----------http://localhost:8080/GOLF/Denglu 一.Action 1.处理今日消费数据逻辑的 package com.chinasofti.golf.ac ...

  5. Spring mvc 中使用ftl引用共通文件出错 FreeMarker template error: Error reading included file "/WEB-INF/ftl/common/errormessage.ftl"

    初次接触spring mvc,想做一个小的练习项目,结果在ftl文件中引用其它的共通ftl文件时出错.

  6. ios6 滤镜相关知识内容网址---摘要

    http://blog.csdn.net/justinjing0612/article/details/8145607#

  7. 1293. 3n+1数链问题 2016 12 23

    /* 1293. 3n+1数链问题 Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description 在计算机科学上,有很多类问题是无法解 ...

  8. zTree+EasyUi做权限遇到的小问题

    最近需要做一个zTree+EasyUi的权限管理系统,以前有过接触,在做这一块时,用到了ztree,树来加载咱们的菜单栏,后台获取登录用户信息的权限列表,转换成json对象来加载到咱们的树当中,代码如 ...

  9. Mac电脑配置IOS React Native开发环境配置笔记

    React Native(以下简称RN)的开发环境配置直接参考官方文档即可完成,不过对小白来说东西有点多,有些名词不是很好理解,这里就官方的安装文档稍微展开说一下. 中文版配置说明:不错的中文说明.官 ...

  10. Java学习笔记 07 接口、继承与多态

    一.类的继承 继承的好处 >>使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性 继承的基本思想 >>基 ...