原文筆記
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/O | CPU 发出命令后继续执行,设备完成后中断 CPU | CPU 不必一直等 | 每次中断有开销 |
| 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. 设备分配的数据结构
课件列出几个关键表:
| 数据结构 | 全称 | 作用 |
|---|---|---|
| DCT | Device Control Table | 每个设备一张,记录设备类型、地址、状态、等待队列、控制器指针等 |
| SDT | System Device Table | 全系统一张,记录所有物理设备 |
| COCT | Controller Control Table | 每个控制器一张,记录控制器状态和连接情况 |
| CHCT | Channel 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 = 系统缓冲区到用户内存的数据移动时间
无缓冲每块大约:
单缓冲每块大约:
所以单缓冲通常比无缓冲快。
缺点:
OS 缓冲区管理更复杂
换入换出逻辑更复杂
如果 I/O 设备和交换区在同一磁盘上,调度更麻烦
5. 面向流设备的单缓冲
| 方式 | 场景 |
|---|---|
| Line-at-a-time | 终端一行一行输入,回车表示一行结束 |
| Byte-at-a-time | 每个按键都有意义,例如交互式终端、传感器、控制器 |
Byte-at-a-time 本质上很像生产者—消费者模型。
6. 双缓冲 Double Buffer
双缓冲:使用两个系统缓冲区。进程处理一个缓冲区时,OS 或设备可以填充/清空另一个缓冲区。也叫 buffer swapping。
直观理解:
缓冲区 1:交给进程处理
缓冲区 2:同时由设备填充
处理完后交换角色
块设备双缓冲时间大致接近:
课件还补充了两种情况:
若 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 排队延迟 | 请求等待设备、通道、控制器空闲的时间 |
访问时间:
总平均访问时间常写成:
其中:
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-SCAN | N 步扫描 | 将请求队列分成长度 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 2 | Hamming Code | 多校验盘 | 并行访问 | 高但少用 |
| RAID 3 | 小条带 + 专用 parity | 1 个校验盘 | 大块传输好 | 可容错 1 盘 |
| RAID 4 | 块条带 + 专用 parity | 1 个校验盘 | 读好,写瓶颈 | 可容错 1 盘 |
| RAID 5 | 块条带 + 分布 parity | 分布式校验 | 综合较好 | 可容错 1 盘 |
| RAID 6 | 双 parity | 双重校验 | 写较慢 | 可容错 2 盘 |
11.7 Disk Cache
1. Disk Cache 是什么?
磁盘缓存是主存中的一块缓冲区,用来保存磁盘扇区的副本。请求某个扇区时,先查 cache:命中则直接从内存取,未命中再读磁盘。它利用的是局部性原理。
请求磁盘块
→ 查 Disk Cache
→ 命中:从内存返回
→ 未命中:从磁盘读入 cache,再返回
2. Disk Cache 与 Buffering 的区别
| 项目 | Buffering | Disk 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 Cache | Buffer 为了解决速度差;Cache 为了减少重复访问 |
| Interrupt vs DMA | 中断仍可能频繁让 CPU 介入;DMA 传一整块后才中断 |
| DMA vs Channel | DMA 负责数据块搬运;Channel 可执行 I/O 程序 |
| SCAN vs LOOK | SCAN 通常到端点;LOOK 到该方向最后一个请求 |
| SCAN vs C-SCAN | SCAN 双向服务;C-SCAN 单向服务,回程不服务 |
| RAID 0 vs RAID 1 | RAID 0 高性能无冗余;RAID 1 镜像高可靠 |
| RAID 4 vs RAID 5 | RAID 4 专用 parity 盘;RAID 5 parity 分布到各盘 |
| 字符设备 vs 块设备 | 字符设备按流;块设备按块,可随机访问 |
一句话总复习
Chapter 11 的核心是:操作系统通过抽象、分层、缓冲、中断、DMA、通道、调度、RAID 和缓存,把复杂且慢速的 I/O 设备管理成统一、高效、可靠的系统资源。