3. 磁盘调度算法(一):先来先服务(FCFS)与最短寻道时间优先(SSTF)的原理与对比

磁盘 I/O 是文件系统性能的关键瓶颈。当多个进程同时发起读写请求时,磁盘调度算法决定了磁头移动的顺序,直接影响寻道时间与整体吞吐量。本章深入拆解两种最基础的调度算法:先来先服务(FCFS)与最短寻道时间优先(SSTF),并通过定量对比揭示其适用场景与局限性。

3.1 先来先服务(FCFS)

FCFS 是最直观的调度策略:按照请求到达的先后顺序依次服务,磁头从当前柱面开始,逐一移动到每个请求所在的柱面。该算法实现简单,不存在“饥饿”现象,但寻道路径完全由请求顺序决定,往往导致磁头在磁盘上来回大幅移动,平均寻道长度较长。

核心特征:公平但低效。FCFS 保证每个请求最终都会被服务,但无法优化磁头移动路径,在随机请求负载下性能急剧下降。

3.1.1 算法流程

  1. 维护一个请求队列,按到达时间排序。
  2. 磁头从当前位置开始,移动到队列中第一个请求的柱面。
  3. 服务完成后,移动到下一个请求的柱面,直至队列为空。

3.1.2 示例计算

假设磁盘请求队列(柱面号):98, 183, 37, 122, 14, 124, 65, 67,磁头起始位置为 53。FCFS 的寻道顺序与总移动距离如下:

步骤 当前柱面 下一柱面 移动距离
1539845
29818385
318337146
43712285
512214108
614124110
71246559
865672

总寻道长度:45 + 85 + 146 + 85 + 108 + 110 + 59 + 2 = 640 柱面。

观察:从 183 直接跳回 37(146 柱面)是典型的“大跨度回退”,FCFS 无法避免这种低效移动。

3.1.3 FCFS 寻道路径 SVG

下图展示了 FCFS 算法下磁头在柱面间的移动轨迹,可见路径杂乱无章,存在大量长距离跳跃。

FCFS 寻道路径(起始柱面 53) 0 50 100 150 200 250 300 350 S 1 2 3 4 5 6 7 8 说明:S 为起始位置(53),数字 1~8 为请求服务顺序。 路径总长 640 柱面,可见从 183→37(3 号)和 14→124(6 号)存在大幅回退。

3.2 最短寻道时间优先(SSTF)

SSTF 的核心思想是:每次选择距离当前磁头位置最近的请求进行服务。该算法通过局部贪心策略显著降低平均寻道时间,但可能导致“饥饿”问题——远离磁头的请求可能长时间得不到服务。

核心特征:高效但不公平。SSTF 的平均寻道长度远优于 FCFS,但在持续的高负载下,边缘柱面的请求可能被无限期推迟。

3.2.1 算法流程

  1. 磁头位于当前柱面,扫描所有未服务的请求。
  2. 计算每个请求与当前位置的距离,选择距离最小的请求。
  3. 移动到该请求柱面并服务,重复步骤 1~2 直至队列为空。

3.2.2 示例计算

使用与 FCFS 相同的请求队列(98, 183, 37, 122, 14, 124, 65, 67),起始柱面 53。SSTF 的寻道过程如下:

步骤 当前柱面 候选距离 选中柱面 移动距离
15345,130,16,69,39,71,12,1465(距离 12)12
26533,118,28,57,51,59,2,267(距离 2)2
36731,116,30,55,53,57,2,065(已服务)→ 37(距离 30)30
43761,146,0,85,23,87,28,3014(距离 23)23
51484,169,23,108,0,110,51,5398(距离 84)→ 122(距离 108)→ 124(距离 110)→ 183(距离 169)84
6980,85,61,24,84,26,33,31122(距离 24)24
712224,61,85,0,108,2,57,55124(距离 2)2
812426,59,87,2,110,0,59,57183(距离 59)59

总寻道长度:12 + 2 + 30 + 23 + 84 + 24 + 2 + 59 = 236 柱面。

对比:SSTF 的总寻道长度(236)仅为 FCFS(640)的 36.9%,性能提升显著。但注意步骤 5 中,磁头从 14 移动到 98 时跳过了 122 和 124,因为当时 98 距离更近。

3.2.3 SSTF 寻道路径 SVG

下图展示了 SSTF 的寻道轨迹,磁头移动更加集中,避免了大幅回退。

SSTF 寻道路径(起始柱面 53) 0 50 100 150 200 250 300 350 S 1 2 3 4 5 6 7 8 说明:SSTF 优先服务邻近请求,路径集中在 14~67 区间,后期才处理远端 98~183。 总路径 236 柱面,远优于 FCFS 的 640 柱面。

3.3 FCFS 与 SSTF 的全面对比

下表从多个维度对比两种算法的核心差异:

对比维度 FCFS SSTF
调度依据请求到达时间与磁头当前距离
平均寻道长度长(示例 640)短(示例 236)
饥饿现象无有(边缘请求可能被无限推迟)
公平性完全公平不公平,偏向中间柱面
实现复杂度极低(FIFO 队列)中等(需维护距离计算)
适用负载低负载、顺序请求中低负载、随机请求
最坏情况请求顺序与柱面分布相反持续有近距离请求到达,远距离请求饿死

3.4 饥饿问题深度分析

SSTF 的饥饿问题在以下场景中尤为突出:假设磁头当前位于柱面 100,队列中有柱面 101、102、103 的请求,同时有一个柱面 500 的请求。只要 101~103 的请求持续到达,柱面 500 的请求将永远无法被服务,因为每次选择时它都是最远的。

工程启示:现代磁盘调度算法(如 SCAN、C-SCAN)在 SSTF 基础上引入“方向”和“年龄”机制,既保留低寻道优势,又通过强制扫描边界来避免饥饿。这将在下一章详细展开。

3.5 算法选择建议

  • FCFS 适用场景:请求数量少、负载极低、对公平性有硬性要求的系统(如某些实时系统)。
  • SSTF 适用场景:随机 I/O 为主、对平均响应时间敏感、能容忍个别请求延迟的通用系统。
  • 折中方案:实际文件系统(如 Linux CFQ、Windows 的 I/O 调度器)通常混合使用多种策略,或采用基于优先级的变体。

3.6 本章小结

FCFS 和 SSTF 代表了磁盘调度设计的两个极端:公平 vs 效率。FCFS 实现简单、无饥饿,但寻道路径低效;SSTF 大幅降低平均寻道时间,却引入了不公平的饥饿风险。理解这两种基础算法的权衡,是掌握后续 SCAN、C-SCAN、LOOK 等高级调度算法的前提。在实际系统中,调度器的设计往往需要在公平性、吞吐量和响应时间之间寻找平衡点。