这一章描述如何使用 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. Django 模板.html中 href参数传入

    在Django模板中可能会出现访问多个URL指向同一函数,为减少代码可以利用正则表达式实现 url(r'^remove_userinfo(?P<nid>\d+)/',views.remov ...

  2. nohup介绍

    背景 我们通常使用&将前台任务变为后台任务执行,但是如果只是使用&,那么在突然断网或者关闭启动该任务的终端(ps:可使用putty来测试,部分软件如mobaxterm做了优化,关闭终端 ...

  3. prop解决一个checkbox选中后再次选中失效的问题

    //问题点 初始状态复选框没有全选, 点击全选按钮调用checkAll方法, 实现了全选, 然后点击全不选按钮, 实现了全不选, 然后再次点击全选按钮, 结果却木有全选, 再反复点击木有任何反应. d ...

  4. java语言基础(变量和运算符)

    java八大基本数据类型: 整型{   int(整型)    short(短整型)   long(长整型)} 浮点型{ float(浮点型)   double(双精度)} 布尔{boolean}   ...

  5. spring mvc:exclude-mapping错误提示

    今天搭建一个java web项目时,增加了一个登录的拦截器,主要功能就是未登录的用户无法访问系统的任何页面. 先说明下我的web项目springmvc的版本以及刚开始配置的拦截器: springmvc ...

  6. apache如何设置缓存

    基本介绍 httpd是一个比较经典的web服务器,也就是静态资源服务器,主要用来服务于一些静态的文件,例如css,js,html等文件,所谓的静态文件,也就是不需要通过服务器进行运行的文件. 在使用静 ...

  7. NET .NET深入体验和实战精要

    在学习.NET之前要充分理解基础,在这里将基础的知识点一一列举. 万丈高楼平地起 1.命名空间 命名空间是一种特殊的分类机制,他将与一个特定功能集有关的所有类型都分到一起,是.避免类名冲突的一种方式 ...

  8. java与32/64位虚拟机

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt232 32位电脑与64位电脑有什么不同? 我们通常说的64位技术是相对于32 ...

  9. 我的天哪,现在的移动VIN码识别已经这么。。

    VIN码是英文(Vehicle Identification Number)的缩写,译为车辆识别代码,又称车辆识别码,车辆识别代码,车辆识别号,车辆识别代号,VIN码是表明车辆身份的代码.VIN码由1 ...

  10. 团队作业3--需求改进&系统设计

    小学生四则运算练习软件APP 一.需求&原型改进 1.给目标用户展现原型,与目标用户进一步沟通理解需求 我们的主要目标用户是小学生,次要目标用户是小学教师 场景一:小明一个三年级的学生,放学回 ...