第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 ...
随机推荐
- Java基础---IO(三)--IO包中的其他类
第一讲 对象序列化 一.概述 将堆内存中的对象存入硬盘,保留对象中的数据,称之为对象的持久化(或序列化).使用到的两个类:ObjectInputStream和ObjectOutputStrea ...
- c++ new 的相关
首先是一个链接 这里 说的很详细了 http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/17/2728019.html 关于c++ ...
- 我的Markdown的利器——Markdown Here、有道云笔记、iPic
Markdown逐渐成为大家文章编辑的首选,这里推荐两个比较冷门的Markdown工具. 用什么当做Markdown的主力工具? 网上有很多人推荐的Markdown的工具包括专业的Markdown工具 ...
- SVG渐变
前面的话 给SVG元素应用填充和描边,除了使用纯色外,还可以使用渐变.本文将详细介绍SVG渐变 线性渐变 有两种类型的渐变:线性渐变和径向渐变.必须给渐变内容指定一个id属性,否则文档内的其他元素不能 ...
- 再起航,我的学习笔记之JavaScript设计模式19(状态模式)
状态模式 概念介绍 状态模式(State):当一个对象的内部状态发生改变时,会导致其行为的改变,这看起来像是改变了对象 示例演示 在我们写项目的过程中或多或少会遇到如下的多分支判断 function ...
- 前端开发【第3篇:JavaScript序】
JavaScript历史 聊聊JavaScript的诞生 JavaScirpt鼻祖:Bremdan Eich(布兰登·艾奇),JavaScript的诞生于浏览器的鼻祖网景公司(Netscape),发布 ...
- 学会数据库读写分离、分表分库——用Mycat,这一篇就够了!
系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...
- Node.js中Async详解:流程控制
安装 npm install async --save 地址 https://github.com/caolan/async Async的内容主要分为三部分 流程控制: 简化九种常见的流程的处理 集合 ...
- Python并发编程协程(Coroutine)之Gevent
Gevent官网文档地址:http://www.gevent.org/contents.html 基本概念 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译 ...
- 201521123093 java 第二周学习总结
201521123093 <java程序设计> 第二周学习总结 一.第二周学习总结 答:(1)关于进一步使用码云管理代码,本周才真正学会了如何将Eclipse里的代码上传到码云中,并且能够 ...