这一章描述如何使用 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 个数而提升应用程序效能的一种系统。

最新文章

  1. [LeetCode] Binary Tree Zigzag Level Order Traversal 二叉树的之字形层序遍历
  2. 学霸数据处理项目之数据处理网页以及后台以及C#代码部分开发者手册
  3. javscript对cookie的操作,以及封装
  4. Objective—C基础学习总结
  5. 【五子棋AI循序渐进】——多线程搜索
  6. android中ListView控件&&onItemClick事件中获取listView传递的数据
  7. Report_SRW在RDF中初始化的重要性(案例)
  8. Java学习笔记(二)UML基础
  9. Cocos2d-x——CocosBuilder官方帮助文档翻译3 动画
  10. ☀【SeaJS】SeaJS Grunt构建
  11. [原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇)
  12. tr069开源代码——cwmp移植
  13. [FromBody]与[FromForm]区别
  14. spark submit参数调优
  15. springboot知识点补充(一)
  16. 一种BCD码转换的算法
  17. html页面小技巧
  18. 网页筛选Automatic Input Enrichment - FLAIR
  19. 《团队-爬取豆瓣电影TOP250-设计文档》
  20. 分分钟搞懂union与union all

热门文章

  1. Sass初学者超强十分钟入门
  2. 关于RequestDispatcher的原理
  3. [2013-03-14]使用wiki维护产品文档
  4. 比较三个 CSS 预处理器:Sass、LESS 和 Stylus(下)
  5. 3_SQL Server通过代码的方式添加数据
  6. (三)、LNMP的搭建,并制作rpm包
  7. IT经典书籍——Head First系列【推荐】
  8. 【★】致全球第一批全帧3D游戏!
  9. JSON与String之间互转
  10. UX是什么?