第6章 Overlapped I/O, 在你身后变戏法 ---1
这一章描述如何使用 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的更多相关文章
- 第6章 Overlapped I/O, 在你身后变戏法 ---被激发的 Event 对象 -4
以文件 handle 作为激发机制,有一个明显的限制,那就是没办法说出到底是哪一个 overlapped 操作完成了.如果每个文件 handle 只有一个操作等待决定,上述问题其实并不成为问题.但是如 ...
- 第6章 Overlapped I/O, 在你身后变戏法 ---Win32 文件操作函数 -2
Win32 之中有三个基本的函数用来执行 I/O,它们是: i CreateFile() i ReadFile() i WriteFile() 没有另外 ...
- 第6章 Overlapped I/O, 在你身后变戏法 ---被激发的 File Handles -3
最简单的 overlapped I/O 类型,是使用它自己的文件 handle 作为同步机制.首先你以 FILE_FLAG_OVERLAPPED 告诉 Win32 说你不要使用默认的同步 I/O.然后 ...
- [转]重叠IO
本章回答了如下几个问题: ◆ 什么是Overlapped I/O?为什么需要Overlapped I/O?如何让数据传输支持Overlapped I/O? ◆ 数据传输结束后,Win32提供了哪些方式 ...
- 第11章 Windows线程池(1)_传统的Windows线程池
第11章 Windows线程池 11.1 传统的Windows线程池及API (1)线程池中的几种底层线程 ①可变数量的长任务线程:WT_EXECUTELONGFUNCTION ②Timer线程:调用 ...
- OVERLAPPED相关的socket函数介绍
OVERLAPPED相关的socket函数介绍 上一篇文章介绍了<Windows核心编程>OVERLAPPED结构与内核对象IOCompletionPort相关概念,见http://www ...
- 异步设备IO:OVERLAPPED和IOCompletionPort
异步设备IO:OVERLAPPED和IOCompletionPort 本文内容为<windows核心编程>第10章内容的总结,仅记录一些本人感兴趣的内容. 1:OVERLAPPED &qu ...
- 第4章 同步控制 Synchronization ----同步机制的摘要
同步机制摘要Critical Section Critical section(临界区)用来实现"排他性占有".适用范围是单一进程的各线程之间.它是: 一个局部性对象,不是一个核 ...
- 【转】第8章 前摄器(Proactor):用于为异步事件多路分离和分派处理器的对象行为模式
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...
随机推荐
- hdu3713 Double Maze
Problem Description Unlike single maze, double maze requires a common sequence of commands to solve ...
- python基础教程(七)
本章介绍如何将语句组织成函数,这样,可以告诉计算机如何做事. 下面编写一小段代码计算婓波那契数列(前两个数的和是第三个数) fibs = [0,1] # 定义一个列表,初始内容是0,1 for i ...
- asp.net core策略授权
在<asp.net core认证与授权>中讲解了固定和自定义角色授权系统权限,其实我们还可以通过其他方式来授权,比如可以通过角色组,用户名,生日等,但这些主要取决于ClaimTypes,其 ...
- postman 第4节 切换环境和设置读取变量(转)
postman提供了environment管理功能,想要在多个环境中测试,比如在测试环境.灰度环境.生产环境等,只需要用同样的接口,切换下环境即可,非常方便.具体步骤: 切换环境 1.点击界面右上角的 ...
- JavaScript实现全选和全不选
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- Hashtable、synchronizedMap、ConcurrentHashMap 比较
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp18 Hashtable.synchronizedMap.Concurren ...
- 用GDI+画验证码
1.新建一个窗体应用程序,在上面拖一个pictureBox对象,为其添加单击事件 2.创建GDI对象.产生随机数画入图片中.画线条.最后将图片到pictureBox中,代码如下: private vo ...
- Windows10 VS2015下分别编译libevent 32位和64位库
Libevnt 在Windows10 VS2015下分别编译32位和64位库 直接上王道 libevent代码地址: https://github.com/libevent/libevent git ...
- 团队作业8——第二次项目冲刺(Beta阶段)Day2--5.19
1.展开站立式会议: 会议内容:①汇报一天大家任务的完成成果. ②新成员对学到的知识进行交流,并向老成员提问. ③根据大家的进度制定新一轮的任务计划. 2.每个人的工作分配 队员 今日任务 明日任务 ...
- 201521123061 《Java程序设计》第十周学习总结
201521123061 <Java程序设计>第十周学习总结 1. 本周学习总结 1.这周异常方面的知识主要是关于自定义异常,自定义的异常可以继承自Throwable或Exception类 ...