从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. GitHub安装配置

    GitHub安装配置1.安装Git-1.9.5-preview20141217 2.配置config文件Windows(在命令行下)cd /d %userprofile%if not exist &q ...

  2. Mono for android 如何动态添加View,线程内部如何更新UI.

    貌似所有设计到UI的程序原理都是一样的,子线程是不能够更新UI状态的,所以就必须使用UI自身或者第三方来更新UI. 如 在WinForm 中 就可以使用Control.Invoke(Action ac ...

  3. iOS 单例模式

    主要用于做应用程序的资源共享控制.用途很多⋯⋯ 实质为,单例是在程序声明周期里 有且仅有 被实例化过一次的类.为确保实例化的唯一,利用类的 类(static)方法来生成和访问对象. 至此,你便可以在程 ...

  4. python ImportError: DLL load failed: %1 不是有效的 Win32 应用程序

    导入的时候报出了 ImportError 在windows上安装python 的模块后,导入模块时报 python ImportError: DLL load failed: %1 不是有效的 Win ...

  5. CSS有三种基本的定位机制

    CSS有三种基本的定位机制:普通流,浮动和绝对定位. 普通流:在普通流中元素框的位置由元素在html中的位置决定, 1.元素position属性为static或继承来的static时就会按照普通流定位 ...

  6. DBCP配置数据库连接乱码问题

    driverClassName = com.mysql.jdbc.Driver url = jdbc:mysql:///bigdata username = root password = 82371 ...

  7. Swift基础语法(一)

    swift是一个基于objc进化过来的一个新的 OS X/IOS编程语言,而objc是基于c语言进化过来的一门编程语言.所以理论上说objc与c++是同一代产物并且objc与c++是相互独立的两套体系 ...

  8. this、super关键字

    this关键字 this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性. public class Demo{ public int x = 10; ...

  9. Bootstrap 栅格系统

    1.简介 Bootstrap内置了一套响应式.移动设备优先的流式栅格系统,随着屏幕设备或视口(viewport)尺寸的增加,系统会自动分为最多12列.它包含了易于使用的预定义classe,还有强大的m ...

  10. 虚拟机安装Ubuntu到U盘

    这篇经验中特指系统安装到U盘,系统在U盘上,不是双系统,不会改变源系统的设置.只需在启动的时候选择启动路径,就可以从U盘启动你的系统.本文仅仅Ubuntu系统,举一反三可以按照此方法安装各种各样的系统 ...