参考:I/O 控制、磁盘调度与 RAID 速查
基于通用操作系统概念 · 核于 2026-08
速查
- I/O 三控制方式:程序查询(忙等待,CPU 全占)→ 中断驱动(CPU 起止参与,每单位一中断)→ DMA(整块传完才一中断,CPU 几乎零干预)。
- 设备三分类:块设备(磁盘,可寻址)、字符设备(键盘,字节流不可寻址)、网络设备(数据包)。
- 缓冲三层次:单缓冲(互斥)、双缓冲(交替并行)、循环缓冲(环形队列,生产者-消费者)。
- Spooling:磁盘 + 队列把独占设备(打印机)虚拟化成共享设备。
- 磁盘访问三时间:寻道(机械移动,主导)+ 旋转延迟 + 传输。
- 磁盘调度:FCFS(公平乱跑)/ SSTF(最近优先,会饥饿)/ SCAN(电梯,无饥饿)/ C-SCAN(单向服务)/ LOOK(到最远即返)。
- RAID:0(条带无冗余)/ 1(镜像 50%)/ 5(分布式校验 (N-1)/N)/ 10(镜像+条带)。
- SSD:无机械部件无寻道延迟,但有写入寿命与写放大,需 TRIM + 磨损均衡。
一、I/O 控制方式对比
| 维度 | 程序查询 | 中断驱动 | DMA | 通道 |
|---|---|---|---|---|
| CPU 参与度 | 全程忙等待 | 每单位参与 | 仅起止参与 | 仅启动与收尾 |
| 中断频率 | 无 | 每单位一次 | 整块一次 | 整任务一次 |
| 传输单位 | 字/字节 | 字/字节 | 块 | 可编程任务链 |
| 数据通路 | 设备↔CPU↔内存 | 设备↔CPU↔内存 | 设备↔内存 | 设备↔内存 |
| CPU 利用率 | 极低 | 高 | 最高 | 最高 |
| 适用 | 极简单/嵌入式 | 慢速字符设备(键盘) | 块设备(磁盘/网卡) | 大型机 |
| 缺点 | CPU 100% 浪费 | 高频小数据中断淹没 | 总线竞争 | 硬件复杂贵 |
二、磁盘调度算法对比
设当前磁头在 53,请求队列 98/183/37/122/14/124/65/67(磁盘 0-199):
| 算法 | 策略 | 移动距离(参考) | 优点 | 缺点 |
|---|---|---|---|---|
| FCFS | 严格到达顺序 | 640 | 公平 | 寻道长,磁臂乱跑 |
| SSTF | 最短寻道优先 | 236 | 平均性能好 | 会饥饿(远处饿死) |
| SCAN | 电梯来回扫到边界 | ~230 | 无饥饿,稳定 | 边界请求等待久 |
| C-SCAN | 单向服务到边界,回起点不服务 | ~392 | 等待时间均匀 | 返回空跑 |
| LOOK | 到最远请求即返(不跑边界) | ~208 | 实际常用,省空跑 | — |
| C-LOOK | 单向到最远即返,回最近不服务 | ~322 | 均匀+省空跑 | — |
- 选择经验:FCFS 公平但慢;SSTF 性能好但会饥饿,单用户/负载轻可用;SCAN/C-SCAN 无饥饿,多用户重负载用;实际系统多用 LOOK/C-LOOK(不跑空到边界)。
- SSD 上:寻道时间恒定,SCAN 类算法失去意义,调度转向减少写放大。
三、RAID 级别对比
| 级别 | 机制 | 最少盘数 | 容错(可坏几盘) | 空间利用率 | 读性能 | 写性能 | 适用 |
|---|---|---|---|---|---|---|---|
| RAID 0 | 条带,无冗余 | 2 | 0(坏一全毁) | 100% | 最高 | 最高 | 临时数据/缓存 |
| RAID 1 | 镜像 | 2 | 1(每对) | 50% | 好(可并行) | 一般 | 系统盘/重要小数据 |
| RAID 5 | 条带+分布式校验 | 3 | 1 | (N-1)/N | 好 | 有写惩罚 | 通用存储(主流) |
| RAID 6 | 条带+双校验 | 4 | 2 | (N-2)/N | 好 | 写惩罚更大 | 大阵列 |
| RAID 10 | 镜像再条带(1+0) | 4 | 每对可坏 1 | 50% | 很好 | 好 | 数据库 |
- RAID 0:只提速不容错,不可用于重要数据。
- RAID 5 写惩罚:每次写要读旧数据+旧校验、算新校验、写新数据+新校验(read-modify-write),小随机写性能受限。
- RAID 不是备份:RAID 容硬件故障,但防不住误删、病毒、整阵列失窃——备份仍是必需。
四、缓冲层次对比
| 类型 | 缓冲区数 | 并行度 | 适用 |
|---|---|---|---|
| 单缓冲 | 1 | 互斥(任一刻一方用) | 一般场景,CPU 与设备部分并行 |
| 双缓冲 | 2 | 交替并行(填 A 取 B) | 流式 I/O(音视频、串口) |
| 循环缓冲 | N(环形) | 高并行,平滑突发 | 生产者-消费者(网卡收包) |
- 缓冲 vs 缓存:缓冲 = 减 I/O 次数 + 速度匹配(数据必经);缓存 = 复用最近数据(命中不读设备)。
五、易错点清单
- "DMA 不需要 CPU 参与":错。DMA 起止仍需 CPU(设置 DMAC、响应结束中断),只是中间传输不占 CPU。
- "中断驱动比程序查询一定好":高频小数据时中断开销可能淹没 CPU,此时需缓冲/DMA。极端简单场景程序查询也够用。
- "缓冲就是缓存":错。缓冲目的是减少 I/O 次数/速度匹配,数据必经缓冲;缓存目的是复用数据,命中即不读设备。
- "SSTF 是最优调度":错。SSTF 平均寻道短但会饥饿(远处请求饿死),且不一定总移动最少。
- "SCAN 会饥饿":错。SCAN 是电梯算法,磁臂在每个方向都扫过全盘,无饥饿。
- "RAID 0 有冗余":错。RAID 0 是纯条带无任何冗余,坏一块全毁,可靠最差。
- "RAID 5 可坏两块盘":错。RAID 5 只容任意 1 块坏;坏两块会丢数据(要坏两块用 RAID 6)。
- "RAID 1 利用率是 100%":错。RAID 1 是镜像,两盘存相同数据,利用率 50%。
- "RAID 可以替代备份":错。RAID 只防单盘硬件故障,防不了误删/病毒/整体损毁,备份仍必需。
- "SSD 寻道时间和机械盘一样":错。SSD 无机械部件无寻道时间,随机访问快百倍;但有写入寿命。
- "磁盘访问三时间中传输时间最长":错。寻道时间(机械移动)最长且主导,所以调度算法优化寻道。
- "程序查询方式 CPU 利用率高":错。程序查询 CPU 全程忙等待空转,利用率极低。
- "C-SCAN 返回途中也服务请求":错。C-SCAN 返回起点途中不服务任何请求(快速空返),只单向服务。
- "设备驱动运行在用户态":传统上驱动在内核态(Linux LKM),只有部分新型驱动(FUSE/UMDF)在用户态。内核态驱动 bug 会崩内核。
六、进阶方向(链接其他叶)
- 文件系统 —— 文件如何建立在块设备与 I/O 子系统之上
- 中断、异常与系统调用 —— 中断处理机制(I/O 完成中断的基础)
- 操作系统概述 —— 四大资源管理的总览
- 操作系统安全 —— 设备权限与访问控制