Appearance
磁盘结构与调度
考情分析
磁盘调度算法的手算过程是计算题高频考点,磁盘访问时间的计算也常考。🔥🔥🔥 高频核心。
一块磁盘每秒能传几百兆数据,但磁头"跑"到正确磁道却要好几毫秒——寻道时间才是性能瓶颈,调度算法的核心就是让磁头少跑冤枉路。
磁盘的物理结构
┌─ 磁道(同心圆环)
磁盘 ──┤
├─ 扇区(磁道上的弧段,最小读写单位)
└─ 柱面(不同盘面上相同位置的磁道)| 概念 | 说明 |
|---|---|
| 磁道 | 磁盘表面的同心圆环 |
| 扇区 | 磁道上的一段弧,磁盘的最小读写单位(通常 512B) |
| 柱面 | 所有盘面上编号相同的磁道组成一个柱面 |
| 磁头 | 每个盘面一个磁头,沿径向移动 |
磁盘地址
一个扇区的地址:(柱面号, 磁头号, 扇区号)
磁盘访问时间
| 时间 | 说明 | 典型值 |
|---|---|---|
| 寻道时间 | 磁头移动到目标磁道 | 几~十几 ms |
| 旋转延迟 | 等待目标扇区转到磁头下 | 平均为半圈时间 |
| 传输时间 | 数据传输 | 远小于前两者 |
寻道时间占主导地位,因此磁盘调度的目标是最小化总寻道时间。
旋转延迟计算
对于转速为
例如:7200 RPM = 120 转/秒 → 平均旋转延迟
磁盘调度算法
假设当前磁头在第 53 号磁道,请求队列为:98, 183, 37, 122, 14, 124, 65, 67
1. FCFS(先来先服务)
按请求到达顺序服务。
移动顺序:53→98→183→37→122→14→124→65→67
总移动磁道数 = |53-98| + |98-183| + |183-37| + |37-122| + |122-14| + |14-124| + |124-65| + |65-67| = 45+85+146+85+108+110+59+2 = 640
2. SSTF(最短寻道时间优先)
每次选择离当前磁头最近的请求。
移动顺序:53→65→67→37→14→98→122→124→183
总移动磁道数 = 12+2+30+23+84+24+2+59 = 236
缺点:可能导致饥饿(远处的请求长期得不到服务)。
3. SCAN(扫描/电梯算法)
磁头沿一个方向移动,服务途中的请求,到达最远端后反向。磁盘调度就像电梯调度——SCAN 算法的磁头像电梯一样来回扫,途经的楼层(磁道)都停一下。
假设初始向磁道号增大方向移动:
假设最大磁道号为 199:
53→65→67→98→122→124→183→199(最远端)→37→14
总移动磁道数 = (199-53) + (199-14) = 146+185 = 331
SCAN 的特点
像电梯一样来回扫描。不会饥饿,但对刚扫过方向的请求不太公平(要等一个来回)。
易错
SCAN 和 LOOK 的区别是计算题陷阱:
- SCAN:磁头必须移到最远端(如 0 号或最大磁道号)才能折返
- LOOK:磁头移到最远的请求处即可折返
题目说"SCAN"时磁头要到边界,说"LOOK"时只到最远请求。两者总寻道距离不同,审题时注意区分。
4. C-SCAN(循环扫描)
磁头只在一个方向上服务请求,到达最远端后直接回到起点重新开始(返回时不服务)。
53→65→67→98→122→124→183→(直接回 0)→14→37
比 SCAN 更公平:每个请求的最大等待时间更均匀。
5. LOOK 与 C-LOOK
LOOK 是 SCAN 的改进:磁头不必移到最远端,移到最远的请求处即可返回。
C-LOOK 是 C-SCAN 的改进:同理,只需移到最远请求处。
实际系统中通常使用 LOOK / C-LOOK。
算法对比
| 算法 | 总寻道距离 | 饥饿 | 公平性 |
|---|---|---|---|
| FCFS | 大 | 无 | 公平 |
| SSTF | 小 | 可能 | 不公平 |
| SCAN | 较小 | 无 | 较公平 |
| C-SCAN | 较小 | 无 | 最公平 |
减少延迟时间的方法
交叉编号(扇区交替编号)
磁头读完一个扇区后,系统需要时间处理数据。如果逻辑相邻的扇区物理上也相邻,处理期间下一个目标扇区会转过磁头,只能等将近一整圈。
解决方案:让逻辑相邻的扇区在物理上间隔排列。
连续编号: 0 1 2 3 4 5 6 7
交替编号: 0 4 1 5 2 6 3 7这样处理完扇区 0 后,扇区 1 刚好转到磁头下方,无需额外等待。
错位命名(盘面间扇区错位)
磁盘所有盘面同步旋转。读完盘面 0 的最后一个扇区后切换到盘面 1,同样需要处理时间。如果两个盘面扇区编号对齐,目标扇区会被错过。
解决方案:不同盘面的扇区编号错位排列,使跨盘面连续读取时目标扇区刚好到达磁头。
本质
交叉编号解决同一盘面内连续读取的延迟,错位命名解决跨盘面连续读取的延迟。两者都是通过物理布局优化来减少旋转等待时间。
提高磁盘 I/O 速度的方法
| 方法 | 说明 |
|---|---|
| 磁盘高速缓存 | 在内存中缓存磁盘数据,避免重复读盘 |
| 磁盘调度算法 | SSTF/SCAN/C-SCAN 等,减少寻道时间 |
| 提前读(预读) | 读当前块时顺便预读后续块到内存缓冲区 |
| 延迟写 | 修改缓冲区数据后不立即写盘,设置标志,被替换时才写入 |
| 优化物理块分布 | 文件的块尽量放在同一磁道或相邻磁道 + 交叉编号/错位命名 |
| 虚拟盘(RAM 盘) | 用内存空间模拟磁盘,存放临时文件(内容由用户控制,区别于 OS 管理的磁盘高速缓存) |
| RAID 磁盘阵列 | 多个磁盘并行工作,支持交叉存取 |
磁盘管理
磁盘初始化
| 步骤 | 说明 |
|---|---|
| 低级格式化 | 将磁盘划分为扇区(物理格式化) |
| 分区 | 将磁盘划分为多个逻辑分区(C: D:) |
| 高级格式化 | 在分区上建立文件系统 |
引导块
磁盘的第 0 扇区(MBR)存放引导程序和分区表,用于系统启动。
坏块管理
| 方法 | 说明 |
|---|---|
| 简单方法 | 在 FAT 表中标记坏块 |
| 扇区备用 | 用备用扇区替换坏扇区(控制器自动映射) |
考研高频考点
- 🔥🔥🔥 给定请求队列和初始位置,手算各种调度算法的总寻道距离
- 🔥🔥🔥 磁盘访问时间 = 寻道时间 + 旋转延迟 + 传输时间
- 🔥🔥🔥 SSTF 可能饥饿,SCAN/C-SCAN 不会饥饿
- 🔥🔥 SCAN vs C-SCAN 的区别(单向 vs 双向服务)
- 🔥🔥 LOOK/C-LOOK 是 SCAN/C-SCAN 的实际改进
- 🔥🔥 交叉编号减少同一盘面的旋转延迟,错位命名减少跨盘面的旋转延迟
- 🔥🔥 提高磁盘 I/O 速度的方法(磁盘缓存/提前读/延迟写/虚拟盘/RAID)
- 🔥 磁盘地址格式:(柱面号, 磁头号, 扇区号)
机械磁盘靠磁头移动寻道,天然有延迟瓶颈。下一篇来看没有机械部件的固态硬盘(SSD)是如何突破这一限制的。