这一章描述如何使用 overlapped I/O(也就是 asynchronous I/O)。某些时候 overlapped I/O 可以取代多线程的功用。然而,overlapped I/O 加上completion ports,常被设计为多线程处理,以便在一个“受制于 I/O 的程序”(所谓 I/O bound 程序)中获得高效率。
    译注    深层讨论 Win32 平台(WinNT 和 Win95)的 File Systems 和 Device I/O 的书籍极少。Advanced Windows 3rd edition(Jeffrey Richter/Microsoft Press)第 13章和第 14 章有很多宝贵的内容,可供参考。
    截至目前我已经花了数章篇幅告诉各位“如何”以及“为什么”要使用线程。我将以这一章介绍一个你可能不想使用多线程的场合。许多应用程序,例如终端机模拟程序,都需要在同一时间处理对一个以上的文件的读写操作。利用 Win32 所谓的 overlapped I/O 特性,你就可以让所有这些 I/O 操作并行处理,并且当任何一个 I/O 完成时,你的程序会收到一个通告。其他操作系统把这个特性称为 nonblocking I/O 或 asynchronous I/O。
    回头看看第2章和第3章,那里曾经示范如何产生一个线程负责后台打印操作。事实上“后台打印”这种说法是错误的,我们在后台所进行的操作只不过是产生打印机所需的数据。Windows 操作系统负责以打印管理器(Printer Manager)完成打印。打印管理器会 “spooled” 那些准备好的数据,并且以打印机所能接受的速度,慢慢地将数据喂给打印机。
    关键在于 I/O 设备是个慢速设备,不论打印机、调制解调器,甚至硬盘,与 CPU 相比都奇慢无比。坐下来干等 I/O 的完成是一件不甚明智的事情。有时候数据的流动率非常惊人,把数据从你的文件服务器中以 Ethernet 速度搬走,其速度可能高达每秒一百万个字节。如果你尝试从文件服务器中读取100KB ,在用户的眼光来看几乎是瞬间完成。但是,要知道,你的线程执行这个命令,已经浪费了 10 个一百万次 CPU 周期。
    现在想象一下,同一个文件服务器,透过一条拨号线路,被 Remote Access Services(RAS)处理。于是,100KB 的数据量在 ISDN 上需要 15 秒,在 9600bps 线路上需要几乎两分钟。即使从用户的眼光来看,一个窗口在这么长的时间中完全没有反应,也是相当可怕的。
    这个问题的明显解决方案就是,使用另一个线程来进行 I/O。然而,这就
    产生出一些相关问题,包括如何在主线程中操控许多个 worker 线程、如何设定同步机制、如何处理错误情况、如何显示对话框。这些难题都将在本章出现并解决之。
    一个最简单的回答:overlapped I/O 是 Win32 的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。这项技术使你的程序在I/O 进行过程中仍然能够继续处理事务。事实上,操作系统内部正是以线程来完成 overlapped I/O。你可以获得线程的所有利益,而不需付出什么痛苦代价。
        重要!
        Windows 95 所支持的 overlapped I/O 有些限制,只适用于 named pipes 、mailslots 、serial I/O 、以及 socket() 或 accept() 所传回来的sockets,它并不支持磁盘或光盘中的文件操作。本章的所有例子只在Windows NT 下才能够有效运作。
    这一章对于 overlapped I/O 的讨论,将从最简单的应用开始,然后再演变到最高级的应用。
        i 激发的文件 handles
        i 激发的 event 对象
        i 异步过程调用(Asynchronous Procedure Calls,APCs)
        i I/O completion ports
    其中以 I/O completion ports 特别显得重要,因为它们是唯一适用于高负载服务器(必须同时维护许多连接线路)的一个技术。Completion ports 利用一些线程,帮助平衡由“I/O 请求”所引起的负载。这样的架构特别适合用在SMP 系统(译注:支持多个 CPU 的操作系统)中产生所谓的 “scalable” 服务器。
    译注     所谓 scalable 系统,是指能够藉着增加 RAM 或磁盘空间或 CPU 个数而提升应用程序效能的一种系统。

第6章 Overlapped I/O, 在你身后变戏法 ---1的更多相关文章

  1. 第6章 Overlapped I/O, 在你身后变戏法 ---被激发的 Event 对象 -4

    以文件 handle 作为激发机制,有一个明显的限制,那就是没办法说出到底是哪一个 overlapped 操作完成了.如果每个文件 handle 只有一个操作等待决定,上述问题其实并不成为问题.但是如 ...

  2. 第6章 Overlapped I/O, 在你身后变戏法 ---Win32 文件操作函数 -2

    Win32 之中有三个基本的函数用来执行 I/O,它们是:        i CreateFile()        i ReadFile()        i WriteFile()    没有另外 ...

  3. 第6章 Overlapped I/O, 在你身后变戏法 ---被激发的 File Handles -3

    最简单的 overlapped I/O 类型,是使用它自己的文件 handle 作为同步机制.首先你以 FILE_FLAG_OVERLAPPED 告诉 Win32 说你不要使用默认的同步 I/O.然后 ...

  4. [转]重叠IO

    本章回答了如下几个问题: ◆ 什么是Overlapped I/O?为什么需要Overlapped I/O?如何让数据传输支持Overlapped I/O? ◆ 数据传输结束后,Win32提供了哪些方式 ...

  5. 第11章 Windows线程池(1)_传统的Windows线程池

    第11章 Windows线程池 11.1 传统的Windows线程池及API (1)线程池中的几种底层线程 ①可变数量的长任务线程:WT_EXECUTELONGFUNCTION ②Timer线程:调用 ...

  6. OVERLAPPED相关的socket函数介绍

    OVERLAPPED相关的socket函数介绍 上一篇文章介绍了<Windows核心编程>OVERLAPPED结构与内核对象IOCompletionPort相关概念,见http://www ...

  7. 异步设备IO:OVERLAPPED和IOCompletionPort

    异步设备IO:OVERLAPPED和IOCompletionPort 本文内容为<windows核心编程>第10章内容的总结,仅记录一些本人感兴趣的内容. 1:OVERLAPPED &qu ...

  8. 第4章 同步控制 Synchronization ----同步机制的摘要

    同步机制摘要Critical Section Critical section(临界区)用来实现"排他性占有".适用范围是单一进程的各线程之间.它是:  一个局部性对象,不是一个核 ...

  9. 【转】第8章 前摄器(Proactor):用于为异步事件多路分离和分派处理器的对象行为模式

    目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...

随机推荐

  1. [js高手之路]性能优化技巧 - 缓存与函数重载实战

    所谓缓存,通俗点讲就是把已经做过的事情结果先暂时存起来,下次再做同样的事情,不用再重新去做,只要把之前的存的结果拿出来用即可,很明显大大提升了效率.他的应用场景非常广泛.如: 1.缓存ajax结果,大 ...

  2. java基础部分细节

    访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权限. 默认的,也称为 default,在同一包内可见,不使用任何修饰符. 私有的,以  ...

  3. [2016-09-09]IIS站点发布、同步和备份工具MSdeploy(WebDeploy)介绍

    前提准备:完整安装Microsoft Web Deploy 3 下载页面:WebDeploy_amd64_zh-CN.msi msdeploy 同步站点 命令所在目录C:\Program Files\ ...

  4. asp.net core策略授权

    在<asp.net core认证与授权>中讲解了固定和自定义角色授权系统权限,其实我们还可以通过其他方式来授权,比如可以通过角色组,用户名,生日等,但这些主要取决于ClaimTypes,其 ...

  5. C++ Concept 和Java 接口

    C++ Concept 和Java 接口 Concept及接口 我会用Java写个case来解释什么是C++的Concept.Concept可以理解为接口,它是一种广义的接口.不同于Java的Inte ...

  6. android-学习1 配置环境

    转载注明出处,谢谢--http://www.cnblogs.com/JK-HYJ/ 前提:电脑先配置好java的环境-- adk_bundle下载安装地址:http://tools.android-s ...

  7. 从async await 报错Unexpected identifier 谈谈对上下文的理解

    原文首发地址: 先简单介绍下async await: async/await是ES6推出的异步处理方案,目的也很明确:更好的实现异步编程.   详细见阮大神 ES6入门 现在说说实践中遇到的问题:使用 ...

  8. 没有闲话和grunt.initConfig()

    grunt.initConfig()为Gruntfile.js的核心部分,它接收对象作为参数. 对象包含两种类型的属性,一种是单纯的变量,一种是task类型.举个栗子: grunt.initConfi ...

  9. 【★】KMP算法完整教程

    KMP算法完整教程 全称:                               Knuth_Morris_Pratt Algorithm(KMP算法) 类型:                 ...

  10. JS中的事件&对象

    一.JS中的事件 (一)JS中的事件分类 1.鼠标事件 click/dblclick/onmouseover/onmouseout 2.HTML事件 onload/onscroll/onsubmit/ ...