原文筆記

Chap. 11 Note

0. 本章总线索

这一章的核心不是“会背设备名”,而是理解:

外设很慢、种类很多 → 操作系统要统一管理 I/O → 用中断/DMA/通道减少 CPU 等待 → 用缓冲和缓存提高效率 → 用磁盘调度和 RAID 改善磁盘性能。

可以按这条线记:

I/O 设备差异
→ I/O 控制方式:轮询 / 中断 / DMA / 通道
→ OS 如何抽象和管理 I/O
→ 缓冲技术:单缓冲 / 双缓冲 / 循环缓冲
→ 磁盘性能:寻道 + 旋转延迟 + 传输时间
→ 磁盘调度:FIFO / SSTF / SCAN / C-SCAN / N-step-SCAN / FSCAN
→ RAID:用多个磁盘提高性能和可靠性
→ Disk Cache:用内存缓存磁盘块
→ UNIX / Linux / Windows 的 I/O 实现

11.1 I/O Devices

1. I/O 设备的三大类

教材把外部 I/O 设备分为三类,课件也采用同样分类:

类型含义例子
Human readable面向用户,人能直接读写显示器、键盘、鼠标、打印机、终端
Machine readable面向机器或电子设备磁盘、USB、传感器、控制器、执行器
Communication面向远程通信调制解调器、数字线路驱动器、网络通信设备

2. I/O 设备差异

不同 I/O 设备差异很大,所以 OS 很难用一种完全统一的方式管理所有设备。重点记 6 个差异:

差异解释
Data rate 数据率键盘、磁盘、网络、内存速度差距巨大
Application 应用场景同一个磁盘用于文件系统、虚拟内存交换区时,管理策略不同
Complexity of control 控制复杂度打印机简单,磁盘控制复杂
Unit of transfer 传输单位字节流或块
Data representation 数据表示字符编码、校验位、数据格式可能不同
Error conditions 错误条件不同设备错误类型、报告方式、恢复方式不同

3. 课件补充:I/O 系统与 I/O 操作

课件给出的中文定义也要背:

I/O 系统:I/O 设备及其接口线路、控制部件、通道和管理软件的总称。 I/O 操作:计算机内存和外围设备介质之间的信息传送操作。

4. 字符设备与块设备

类型传输单位特点例子
字符设备 Character device字节 / 字符按字符流传输,无固定块结构键盘、鼠标、终端、打印机
块设备 Block device数据块以固定大小块传输,可按块号访问磁盘、USB、SSD

课件还强调:输入型、输出型外围设备一般是字符设备;存储型外围设备一般是块设备。

5. 顺序存取与直接存取

类型特点例子
顺序存取 Sequential access依赖物理顺序,访问后面的数据必须经过前面的数据磁带
直接存取 Direct access可以直接定位到某个物理块磁盘

11.2 Organization of the I/O Function

1. 三种基本 I/O 技术

教材和课件都强调三种 I/O 执行方式:Programmed I/O、Interrupt-driven I/O、DMA。

技术CPU 做什么优点缺点
Programmed I/O 程序控制 I/O / 轮询CPU 发出 I/O 命令后不断检查设备状态简单CPU 忙等,浪费处理器时间
Interrupt-driven I/O 中断驱动 I/OCPU 发出命令后继续执行,设备完成后中断 CPUCPU 不必一直等每次中断有开销
DMA 直接存储器访问DMA 模块负责内存与 I/O 模块之间的数据块传输CPU 只参与开始和结束需要 DMA 控制器,占用总线周期

2. 轮询方式 Programmed I/O / Polling

课件中文叫轮询方式

CPU 反复查询设备控制器的状态位,判断设备是否就绪。 基本过程:

查询设备状态
→ 如果未就绪,继续查询
→ 如果就绪,执行读/写
→ 再查询下一个设备

缺点很明显:CPU 会被查询过程拖住,设备慢时效率很低。

3. 中断方式 Interrupt-driven I/O

中断方式下,CPU 启动 I/O 后可以去执行别的程序。设备完成后,通过中断请求线通知 CPU。课件强调:设备控制器执行 I/O 操作,完成后发出 I/O 中断信号,CPU 转去执行中断处理程序,再恢复原进程。

重点理解:

CPU 启动 I/O
→ 设备自己工作
→ CPU 执行其他任务
→ 设备完成,发中断
→ CPU 执行中断处理程序
→ 恢复原程序

优点:减少 CPU 空等。 缺点:如果每传一个字节就中断一次,中断开销会很大。

4. DMA 方式

DMA 的核心是:设备和内存之间直接传输数据块,不经过 CPU 逐字节搬运。

CPU 给 DMA 模块的信息包括:读/写类型、I/O 设备地址、内存起始地址、传输字数。之后 DMA 负责搬运整个数据块,完成后再中断 CPU。课件还列出 DMA 需要的硬件:内存地址寄存器、字计数器、数据缓冲寄存器或缓冲区、设备地址寄存器、中断机制和控制逻辑。

DMA 的关键点:

CPU:只负责发起请求和处理完成中断
DMA:负责实际数据传输
设备 ↔ DMA ↔ 内存

5. 周期窃用 Cycle Stealing

课件提到:当 DMA 和 CPU 同时要访问内存总线时,CPU 会把总线让给 DMA,这叫周期窃用。这样 DMA 能完成设备和内存之间的数据交换,但会占用一些总线周期。

6. 通道方式 I/O Channel

通道方式比 DMA 更进一步。DMA 只是搬数据,而通道像一个专门的 I/O 小处理器,能执行 I/O 程序。CPU 启动通道后,通道控制设备完成 I/O,CPU 可以继续执行其他任务,直到通道发出完成中断。

通道方式的意义:

CPU 和外设并行程度更高
I/O 控制更独立
适合管理大量、复杂、多类型设备

7. I/O 功能的发展阶段

教材列出 I/O 功能从简单到复杂的 6 个阶段:

1. CPU 直接控制外设
2. 加入控制器 / I/O 模块,使用程序控制 I/O
3. 加入中断,CPU 不必忙等
4. 使用 DMA,I/O 模块可直接访问内存
5. I/O 模块发展成 I/O Channel,可执行专门 I/O 指令
6. I/O 模块有自己的局部内存,成为 I/O Processor

一句话总结:越往后,CPU 参与越少,I/O 独立性越强,系统并行性越高。


11.3 Operating System Design Issues

1. 两个设计目标:Efficiency 与 Generality

教材和课件都强调 I/O 系统设计的两个目标:效率通用性

目标含义
Efficiency 效率I/O 很容易成为瓶颈,尤其磁盘 I/O,所以要减少等待、提高并行
Generality 通用性希望用统一方式管理各种设备,例如 read、write、open、close

难点在于:设备差异太大,所以不能完全统一,只能通过层次化、模块化设计隐藏底层差异。

2. I/O 层次结构

教材提出 I/O 功能应该分层:低层处理硬件细节,高层提供通用接口。这样硬件变化不会影响大部分 I/O 软件。

对简单本地外设,通常有三层:

层次作用
Logical I/O 逻辑 I/O把设备看作逻辑资源,提供 open、close、read、write 等接口
Device I/O 设备 I/O把逻辑请求转换为 I/O 指令、通道命令、控制器命令
Scheduling and Control 调度与控制排队、调度、处理中断、收集状态,直接和硬件交互

对通信设备,逻辑 I/O 层可能被通信协议结构替代,例如 TCP/IP。 对文件系统支持的二级存储,还要加:

Directory management 目录管理
File system 文件系统
Physical organization 物理组织

3. 设备独立性 Device Independence

课件补充了一个考试常考点:设备独立性

设备独立性指:用户程序不直接指定物理设备,而是使用逻辑设备名;系统再把逻辑设备映射到具体物理设备。这样程序不依赖某台具体设备。

优点:

用户程序与具体物理设备解耦
系统增加、更换设备时,程序不必修改
设备故障时可以切换到其他物理设备
提高设备分配灵活性

逻辑设备名到物理设备名的映射通过 LUT,Logical Unit Table,逻辑设备表 实现。单用户系统可以全系统一张 LUT;多用户系统可以每个用户一张 LUT,允许不同用户使用相同逻辑设备名。

4. 设备分配

课件按设备特性把设备分为三类:

类型含义管理方式
独占设备一段时间只能给一个进程用独占分配
共享设备可被多个进程共享共享分配
虚拟设备通过软件把独占设备改造成可共享效果虚拟分配,例如 SPOOLING

常用分配算法:

先请求先服务 FCFS
优先级高者先服务

还要注意:多进程申请设备时可能发生死锁,所以需要安全性检查。

5. 设备分配的数据结构

课件列出几个关键表:

数据结构全称作用
DCTDevice Control Table每个设备一张,记录设备类型、地址、状态、等待队列、控制器指针等
SDTSystem Device Table全系统一张,记录所有物理设备
COCTController Control Table每个控制器一张,记录控制器状态和连接情况
CHCTChannel Control Table每个通道一张,只在通道方式系统中存在

一个进程要真正执行 I/O,通常需要获得:

设备 Device

- 控制器 Controller
- 通道 Channel

三者都具备后,才有进行 I/O 的物理条件。


11.4 I/O Buffering

1. 缓冲的目的

缓冲技术的本质:在内存中开辟缓冲区,让 CPU、内存、设备之间速度不匹配的问题变小。

课件给出的目的很重要:

改善 CPU 与外设速度不匹配
协调逻辑记录大小和物理记录大小不一致
提高 CPU 与 I/O 设备的并行性

教材也强调,缓冲可以提前执行输入传输,或延后执行输出传输,从而改善系统性能。

2. Block-oriented 与 Stream-oriented

类型特点例子
Block-oriented device固定大小块,一次传一块,可按块号访问磁盘、USB
Stream-oriented device字节流,没有固定块结构终端、打印机、鼠标、通信端口

3. 无缓冲 No Buffer

无缓冲时,OS 直接访问设备。 问题:

进程容易被 I/O 阻塞
设备慢,CPU 等待时间长
进程 I/O 期间可能不能被换出

4. 单缓冲 Single Buffer

单缓冲:OS 为一次 I/O 请求分配一个系统缓冲区。块设备输入时,数据先进入系统缓冲区,再复制到用户空间;同时可以预读下一块。

设:

T = 输入一块数据所需时间
C = 两次输入请求之间的计算时间
M = 系统缓冲区到用户内存的数据移动时间

无缓冲每块大约:

T+CT + C

单缓冲每块大约:

max(C,T)+M\max(C, T) + M

所以单缓冲通常比无缓冲快。

缺点:

OS 缓冲区管理更复杂
换入换出逻辑更复杂
如果 I/O 设备和交换区在同一磁盘上,调度更麻烦

5. 面向流设备的单缓冲

方式场景
Line-at-a-time终端一行一行输入,回车表示一行结束
Byte-at-a-time每个按键都有意义,例如交互式终端、传感器、控制器

Byte-at-a-time 本质上很像生产者—消费者模型。

6. 双缓冲 Double Buffer

双缓冲:使用两个系统缓冲区。进程处理一个缓冲区时,OS 或设备可以填充/清空另一个缓冲区。也叫 buffer swapping

直观理解:

缓冲区 1:交给进程处理
缓冲区 2:同时由设备填充
处理完后交换角色

块设备双缓冲时间大致接近:

max(C,T)\max(C, T)

课件还补充了两种情况:

若 C < T,且 M << T,则一块数据处理时间约为 T,可保证设备连续工作。
若 C > T,且 M << T,则一块数据处理时间约为 C + M,可保证进程不必等待 I/O。

7. 循环缓冲 Circular Buffer

如果两个缓冲区还不够,就使用多个缓冲区组成循环队列。每个缓冲区是循环缓冲中的一个单元。它本质上就是有限缓冲区的生产者—消费者模型。

适用场景:

进程有突发 I/O
设备和进程速度波动较大
需要平滑 I/O 峰值

8. 缓冲的局限

缓冲只能平滑短期峰值。 如果进程长期平均产生数据的速度大于设备处理速度,那么再多缓冲区也会被填满,进程最终还是要等待。


11.5 Disk Scheduling

1. 为什么磁盘 I/O 特别重要?

磁盘速度远慢于 CPU 和内存,所以磁盘 I/O 很容易成为系统瓶颈。教材强调,磁盘性能对整体系统性能影响极大,因此本章花大量篇幅讨论磁盘调度、RAID、磁盘缓存。

2. 磁盘访问时间组成

一次磁盘读写主要包括:

时间含义
Seek time 寻道时间磁头移动到目标磁道的时间
Rotational delay / latency 旋转延迟目标扇区旋转到磁头下方的时间
Transfer time 传输时间数据真正经过磁头读写的时间
Queueing delay 排队延迟请求等待设备、通道、控制器空闲的时间

访问时间:

Access Time=Seek Time+Rotational DelayAccess\ Time = Seek\ Time + Rotational\ Delay

总平均访问时间常写成:

Ta=Ts+12r+brNT_a = T_s + \frac{1}{2r} + \frac{b}{rN}

其中:

Ts = 平均寻道时间
r = 每秒转数
b = 要传输的字节数
N = 每磁道字节数
b / rN = 传输时间
1 / 2r = 平均旋转延迟

3. 顺序访问 vs 随机访问

教材给过一个很典型的对比:读同样大小的文件,若文件连续存放,寻道和旋转开销少;若随机分布,每个扇区都可能重新寻道和等待旋转,时间会差很多。核心结论是:

磁盘性能不只取决于数据量,
更取决于访问顺序和物理位置。

4. 磁盘调度算法总表

教材表 11.3 总结了常见磁盘调度策略:Random、FIFO、PRI、LIFO、SSTF、SCAN、C-SCAN、N-step-SCAN、FSCAN。

算法中文名核心规则优点缺点
Random随机随机选请求可作基准性能差
FIFO先来先服务按请求到达顺序服务公平,简单可能寻道距离大
PRI优先级按进程优先级服务满足系统优先级策略不一定优化磁盘,可能饥饿
LIFO后来先服务最新请求先服务利用局部性老请求可能饥饿
SSTF最短服务时间优先选离当前磁头最近的请求平均寻道较短远处请求可能饥饿
SCAN扫描 / 电梯算法沿一个方向服务,到端点或无请求后反向避免严重饥饿,分布较好对刚扫过区域不友好
C-SCAN循环扫描只沿一个方向服务,到末端后快速回起点等待时间更均匀回程不服务
N-step-SCANN 步扫描将请求队列分成长度 N 的子队列,逐个 SCAN防止磁臂黏着N 选择影响性能
FSCAN双队列扫描扫描时新请求放入另一个队列对负载变化更稳定实现略复杂

5. FIFO

FIFO 按请求到达顺序服务。 优点是公平;缺点是请求如果分布很散,磁头会来回跳,寻道开销大。教材例子中 FIFO 平均寻道长度较大。

计算方法:

从初始磁道开始
按请求序列逐个访问
每一步移动距离 = |当前磁道 - 下一个请求磁道|
总移动距离 = 所有移动距离求和

6. SSTF

SSTF 每次选择离当前磁头位置最近的请求。

计算方法:

当前位置出发
在未完成请求中找距离最近的
移动过去并删除该请求
重复直到请求为空

优点:通常比 FIFO 寻道距离短。 缺点:如果一直有近处请求,远处请求可能长期得不到服务,也就是饥饿。

7. SCAN / 电梯算法

SCAN 像电梯一样:磁头沿一个方向移动,沿途服务所有请求,到达端点或该方向无请求后,再反向服务。

计算时注意题目给的方向:

当前磁头位置

- 当前移动方向
- 请求序列

如果题目说“刚服务过 120,当前在 100”,说明磁头正在向小号磁道移动。

课件还提醒:有些中文题里的“电梯调度算法”更接近 LOOK,即没有请求时不一定走到磁盘最边界,而是到该方向最后一个请求后反向。

8. C-SCAN

C-SCAN 只在一个方向上服务请求。到达末端后,磁头直接回到另一端,回程不服务。这样可以减少新请求的最大等待时间,使服务更均匀。

理解:

SCAN:来回都服务
C-SCAN:只单向服务,回程不服务

9. N-step-SCAN 与 FSCAN

SSTF、SCAN、C-SCAN 都可能出现一种现象:某些进程不断请求同一附近磁道,磁臂长期停留在一小片区域,叫 arm stickiness,磁臂黏着

为了解决它,可以把队列分段:

N-step-SCAN

把磁盘请求队列分成长度 N 的子队列
每次对一个子队列使用 SCAN
处理当前子队列时,新请求加入其他队列
N 很大时接近 SCAN
N = 1 时接近 FIFO

FSCAN

使用两个队列
扫描开始时,所有旧请求在一个队列
扫描过程中,新请求进入另一个队列
旧请求全部处理完后,再处理新队列

10. 磁盘调度题做法模板

遇到磁盘调度计算题,按这个流程:

1. 写出初始磁头位置
2. 判断初始方向
3. 写出请求序列
4. 根据算法排序访问顺序
5. 每一步计算移动距离
6. 求总移动磁道数

例如:

移动距离 = |当前磁道号 - 下一磁道号|
总移动距离 = 每一步移动距离之和

考试最容易错的是:

SCAN 是否走到 0 / 最大磁道?
LOOK 是否只走到该方向最后一个请求?
C-SCAN 回程是否计入移动距离?
题目有没有说“刚服务过某磁道”,这会影响初始方向。

课件补充:旋转优化与记录分布

课件有一组“循环排序 / 优化分布”的例题,核心思想是:

磁盘不是只考虑磁道移动,还要考虑旋转延迟。
如果记录顺序存放,但处理一个记录需要时间,
处理完后下一个扇区可能已经转过去了,
就需要等几乎一整圈。

所以可以通过交错存放记录优化读取时间:

逻辑顺序:A B C D E ...
物理顺序:不一定连续摆放
目标:让 CPU 处理完 A 后,B 正好快转到磁头下

这类题步骤:

1. 算每转一圈时间
2. 算每个扇区经过磁头的时间
3. 算处理一个记录需要跨过几个扇区
4. 按这个间隔重新排列逻辑记录
5. 计算总读取时间

11.6 RAID

1. RAID 的思想

RAID 的核心是:用多个磁盘并行工作,提高性能,并通过冗余提高可靠性。 教材指出,RAID 0、1、5、6 是最常用的几个级别。

两个关键词:

含义
Strip条带单元,逻辑磁盘上的一小块连续数据
Stripe条带组,一组 strip 分布到多个磁盘上

2. RAID 0

RAID 0:条带化,无冗余。它不是真正意义上的“冗余阵列”,因为没有容错。

特点:

数据分散到多个磁盘
多个磁盘可并行读写
性能高,容量利用率高
没有冗余,一个盘坏可能导致数据丢失

适合追求性能、不重视可靠性的场景。

3. RAID 1

RAID 1:镜像。每份数据写到两个磁盘。

优点:

读请求可以从两个镜像盘中选择更快的一个
写请求需要两个盘都写
恢复简单,一个盘坏了另一个还能用
可靠性高

缺点:

成本高,需要 2 倍磁盘空间
容量利用率约 50%

4. RAID 2

RAID 2:使用 Hamming Code 进行纠错,按位或字节级条带化。

特点:

所有磁盘并行参与每次 I/O
使用多个校验盘存放纠错码
能纠正单比特错误、检测双比特错误

现实中很少使用,因为现代磁盘自身可靠性较高,RAID 2 成本偏高,有点“过度设计”。

5. RAID 3

RAID 3:小条带 + 单独奇偶校验盘。

特点:

数据以很小单位分散到多个数据盘
一个专门的校验盘存储 parity
适合大块连续数据传输
小 I/O 并发能力差,因为每次 I/O 都牵涉多个磁盘

奇偶校验恢复思想:

如果有数据盘损坏,可以通过剩余数据盘和校验盘 XOR 恢复数据。

6. RAID 4

RAID 4:块级条带 + 专用校验盘。

特点:

数据按块分布
读操作可独立访问不同磁盘
写操作需要更新校验盘
校验盘容易成为写瓶颈

7. RAID 5

RAID 5:块级条带 + 分布式奇偶校验。

特点:

没有固定校验盘
校验信息分布到所有磁盘
读性能接近 RAID 0
写操作有 parity 更新开销
比 RAID 4 更避免单一校验盘瓶颈

这是实际系统中很常见的 RAID 级别之一。

8. RAID 6

RAID 6:块级条带 + 双重分布式奇偶校验。

特点:

能容忍两个磁盘同时故障
可靠性最高
写开销比 RAID 5 更大
至少需要 N + 2 个磁盘

9. RAID 级别速记表

RAID核心冗余性能可靠性
RAID 0条带化很高
RAID 1镜像完整复制读好,写一般
RAID 2Hamming Code多校验盘并行访问高但少用
RAID 3小条带 + 专用 parity1 个校验盘大块传输好可容错 1 盘
RAID 4块条带 + 专用 parity1 个校验盘读好,写瓶颈可容错 1 盘
RAID 5块条带 + 分布 parity分布式校验综合较好可容错 1 盘
RAID 6双 parity双重校验写较慢可容错 2 盘

11.7 Disk Cache

1. Disk Cache 是什么?

磁盘缓存是主存中的一块缓冲区,用来保存磁盘扇区的副本。请求某个扇区时,先查 cache:命中则直接从内存取,未命中再读磁盘。它利用的是局部性原理

请求磁盘块
→ 查 Disk Cache
→ 命中:从内存返回
→ 未命中:从磁盘读入 cache,再返回

2. Disk Cache 与 Buffering 的区别

项目BufferingDisk Cache
目的平滑速度差,协调传输减少重复磁盘访问
内容当前 I/O 数据可能未来会再次访问的磁盘块
原理CPU 与设备并行时间局部性、空间局部性
典型策略单缓冲、双缓冲、循环缓冲LRU、LFU、Frequency-based

3. Cache 数据交付方式

当 I/O 请求在 disk cache 中命中时,数据可以:

1. 从 cache 复制到用户进程空间
2. 通过共享内存传递 cache 中位置的指针

第二种方式避免内存到内存复制,效率更高。

4. LRU

LRU,Least Recently Used,最近最少使用。 规则:替换最长时间没有被访问的块。教材和课件都说它是常用的替换策略。

理解:

最近用过 → 更可能马上再用
很久没用 → 更适合淘汰

5. LFU

LFU,Least Frequently Used,最不经常使用。 规则:替换访问次数最少的块。每个块有计数器,每访问一次计数加 1。

问题:

某些块曾经短时间高频访问,计数很高;
但之后可能不再使用;
LFU 仍可能保留它们,导致替换效果差。

6. Frequency-based Replacement

为解决 LFU 的问题,教材介绍了基于频率的改进策略:把 cache 栈分成 new、middle、old 等区域,只有 old 区块才适合替换,这样能避免刚进入 cache 的块因为计数低而马上被淘汰。

7. 写回问题

如果缓存块只是被读过,替换时不必写回磁盘。 如果缓存块被修改过,它就是 dirty block,替换前必须写回磁盘。

为了减少寻道,系统通常会把多个 dirty block 聚集起来,按较优顺序写回。


11.8 UNIX SVR4 I/O

1. UNIX 的统一接口思想

UNIX 把每个 I/O 设备都关联为一个特殊文件。进程通过读写特殊文件来读写设备。这体现了 UNIX 的经典思想:

Everything is a file.

这样用户进程看到的是统一接口,而底层设备差异由内核隐藏。

2. UNIX 的两类 I/O

类型含义
Buffered I/O经过系统缓冲区
Unbuffered I/O通常通过 DMA,直接在设备和进程 I/O 区之间传输

Buffered I/O 主要使用:

Buffer cache
Character queue

3. Buffer Cache

UNIX buffer cache 本质上是磁盘缓存。它用来缓存磁盘块。管理时维护三类列表:free list、device list、driver I/O queue;查找时使用按 device 和 block 组织的哈希链表,替换策略使用 LRU。

4. Character Queue

字符设备如终端、打印机适合 character queue。字符队列体现生产者—消费者模型:设备写入、进程读取,或进程写入、设备读取。字符被读走后就“消耗掉”,不像 buffer cache 可以多次读取。

5. Unbuffered I/O

Unbuffered I/O 是设备和进程空间之间通过 DMA 直接传输,速度快,但进程必须锁定在内存中,不能被换出,会降低系统整体调度和内存管理灵活性。


11.9 Linux I/O

Linux I/O 与 UNIX 类似,也区分块设备和字符设备。教材重点讲 Linux 磁盘调度和 page cache。

1. Linux Elevator Scheduler

Linux 2.4 默认磁盘调度器是 Linux Elevator,类似 LOOK 算法。它维护一个请求队列,并按块号排序,同时进行请求合并。

插入新请求时大致考虑:

1. 能否和已有相邻请求合并
2. 是否有旧请求需要避免饥饿
3. 能否按块号有序插入
4. 否则放到队尾

2. Deadline Scheduler

Deadline 调度器是为了解决 Elevator 的饥饿问题和读写不公平问题。它使用 sorted queue 和 FIFO queue,读请求和写请求分别有过期时间;读请求默认过期时间比写请求短,因为读通常会阻塞进程。

重点:

读请求更影响进程响应时间
写请求通常可以异步延后
Deadline 通过过期时间保证请求不会被无限推迟

3. Anticipatory Scheduler

预期调度器的思想:读请求完成后,稍等很短时间,看同一进程是否马上发出附近位置的新读请求。因为局部性原理,新请求很可能就在附近。教材提到 Linux 2.6 中它叠加在 Deadline Scheduler 上,读请求后最多等待约 6ms。

4. NOOP Scheduler

NOOP 是最简单的调度器:

FIFO 队列
只做请求合并
适合本身已有调度能力的设备或非传统磁盘设备

5. CFQ Scheduler

CFQ,Completely Fair Queuing,完全公平队列。 它为每个进程维护 I/O 队列,并给每个队列时间片,以 round-robin 的方式分配磁盘 I/O 带宽,目标是公平。

6. Linux Page Cache

Linux 2.4 以后使用统一 page cache,所有磁盘与主存之间的数据流都经过它。好处:dirty pages 可以排序后批量写回;由于时间局部性,缓存页可能再次被访问,从而减少磁盘 I/O。

dirty pages 写回场景:

空闲内存低于阈值
脏页年龄超过阈值

11.10 Windows I/O

1. Windows I/O Manager

Windows 的 I/O Manager 负责操作系统的所有 I/O,并给各种驱动提供统一接口。教材列出的 Chapter 11 Windows I/O 重点包括 Basic I/O Facilities、Asynchronous and Synchronous I/O、Software RAID、Volume Shadow Copies、Volume Encryption。

2. Windows I/O 的核心组件

教材中 Windows I/O Manager 主要配合四类组件:

Cache Manager:文件缓存,lazy writer 批量写回
File System Drivers:文件系统驱动
Network Drivers:网络驱动和远程文件系统支持
Hardware Device Drivers:硬件设备驱动,经 HAL 访问硬件寄存器

3. 同步 I/O 与异步 I/O

类型含义
Synchronous I/O发出 I/O 后线程阻塞,直到完成
Asynchronous I/O发出 I/O 后线程继续执行,完成后通过某种机制通知

异步 I/O 更适合提高应用性能,但需要完成通知机制。

Windows 常见完成通知方式:

File object signaling
Event object signaling
Asynchronous Procedure Call, APC
I/O Completion Port
Polling

4. Windows Software RAID

Windows 支持硬件 RAID 和软件 RAID。软件 RAID 由 OS 中的容错磁盘驱动实现,Windows Server 可实现 RAID 1 和 RAID 5。

5. Volume Shadow Copies 与 Volume Encryption

功能作用
Volume Shadow Copies创建卷的一致性快照,用于备份和恢复旧版本文件
Volume Encryption使用 BitLocker 对整个卷加密,比只加密单个文件更完整

课件补充:SPOOLING 与虚拟设备

1. 什么是 SPOOLING?

SPOOLING 又叫假脱机技术。它的思想是:用磁盘上的缓冲区模拟外围设备,把独占设备虚拟成可共享设备。课件中把用于缓冲的存储区域称为“井”。

典型例子:

打印机 SPOOLING
网络通信 SPOOLING

2. SPOOLING 的组成

课件列出:

输入井
输出井
预输入程序
缓输出程序
井管理程序

工作理解:

用户作业输入 → 先进入输入井
作业运行 → 从输入井取数据
作业输出 → 先写入输出井
输出设备空闲 → 缓输出程序慢慢输出

3. SPOOLING 的意义

提高独占设备利用率
减少人工干预
实现虚拟设备
让多个作业看起来可以同时使用独占设备

最经典例子:多个进程都“打印”,其实只是把输出放入输出井,真正的打印机按队列慢慢打印。


重点概念速记

I/O 系统:
I/O 设备 + 接口线路 + 控制部件 + 通道 + 管理软件

字符设备:
按字节/字符流传输,如键盘、终端、打印机

块设备:
按块传输,可随机访问,如磁盘、USB

Programmed I/O:
CPU 发命令后忙等

Interrupt-driven I/O:
设备完成后中断 CPU

DMA:
设备与内存直接传输数据块,CPU 只管开始和结束

I/O Channel:
能执行 I/O 程序的专用 I/O 处理结构

Buffering:
平滑 CPU 和设备速度差

Disk Cache:
用内存缓存磁盘块,减少磁盘访问

Seek Time:
磁头移动到目标磁道时间

Rotational Delay:
目标扇区转到磁头下方的时间

Transfer Time:
真正读写数据的时间

FIFO:
按到达顺序服务

SSTF:
每次选最近磁道

SCAN:
电梯算法,单方向扫,到端点或无请求后反向

C-SCAN:
循环扫描,只单向服务,回程不服务

RAID 0:
条带化,无冗余,高性能低可靠

RAID 1:
镜像,高可靠,成本高

RAID 5:
分布式 parity,常用

RAID 6:
双 parity,可坏两个盘

考试高频点

1. 简答题高频

1. I/O 设备分为哪三类?
2. I/O 设备有哪些差异?
3. Programmed I/O、Interrupt-driven I/O、DMA 区别?
4. DMA 的工作过程和优点?
5. 通道方式和 DMA 的区别?
6. I/O 设计目标为什么是效率和通用性?
7. Logical I/O、Device I/O、Scheduling and Control 分别做什么?
8. 单缓冲、双缓冲、循环缓冲区别?
9. 磁盘访问时间由哪些部分组成?
10. FIFO、SSTF、SCAN、C-SCAN 区别?
11. N-step-SCAN 和 FSCAN 解决什么问题?
12. RAID 0、1、5、6 区别?
13. Disk Cache 和 Buffering 区别?
14. UNIX 为什么把设备看作特殊文件?
15. SPOOLING 如何把独占设备虚拟成共享设备?
16. 什么是设备独立性?

2. 计算题高频

磁盘调度:
给初始磁头位置、方向、请求序列,求 FIFO / SSTF / SCAN / C-SCAN 总移动磁道数。

旋转优化:
给转速、扇区数、处理时间,求顺序存放读取时间和优化分布读取时间。

缓冲时间:
无缓冲 T + C
单缓冲 max(C, T) + M
双缓冲根据 C 和 T 判断接近 T 或 C + M

磁盘访问时间:
Ta = Ts + 1/(2r) + b/(rN)

3. 最容易混淆的点

易混点正确区分
Buffer vs CacheBuffer 为了解决速度差;Cache 为了减少重复访问
Interrupt vs DMA中断仍可能频繁让 CPU 介入;DMA 传一整块后才中断
DMA vs ChannelDMA 负责数据块搬运;Channel 可执行 I/O 程序
SCAN vs LOOKSCAN 通常到端点;LOOK 到该方向最后一个请求
SCAN vs C-SCANSCAN 双向服务;C-SCAN 单向服务,回程不服务
RAID 0 vs RAID 1RAID 0 高性能无冗余;RAID 1 镜像高可靠
RAID 4 vs RAID 5RAID 4 专用 parity 盘;RAID 5 parity 分布到各盘
字符设备 vs 块设备字符设备按流;块设备按块,可随机访问

一句话总复习

Chapter 11 的核心是:操作系统通过抽象、分层、缓冲、中断、DMA、通道、调度、RAID 和缓存,把复杂且慢速的 I/O 设备管理成统一、高效、可靠的系统资源。