《操作系统导论》第 37 章:磁盘驱动器 - 深度知识架构
1. 核心矛盾 (The Crucial Problem)
在具有极其缓慢的机械物理运动(寻道与旋转)限制下,如何通过智能的请求调度算法,最大化输入/输出 (Input/Output, I/O) 吞吐量并最小化访问延迟,同时避免请求被饿死?
2. 核心概念 (Core Concepts)
- 扇区 (Sector) 与地址空间:
- 定义:现代磁盘驱动器的基本接口抽象,通常由大量 512 字节的扇区组成,编号从 0 到
。 - 角色:操作系统眼中磁盘的“扁平化虚拟形态”,隐藏了底层的柱面、磁道等复杂物理几何结构。
- 定义:现代磁盘驱动器的基本接口抽象,通常由大量 512 字节的扇区组成,编号从 0 到
- 寻道时间 (Seek Time) 与 旋转延迟 (Rotational Latency):
- 定义:磁盘处理请求时的两个核心时间开销。寻道是移动磁头臂到目标磁道的时间;旋转是等待目标扇区转到磁头下方的时间。
- 角色:决定磁盘 I/O 性能的物理性能天花板。所有的磁盘调度算法都在致力于掩盖或最小化这两个时间。
- 最短寻道时间优先 (Shortest Seek Time First, SSTF) / 最近块优先 (Nearest-Block-First, NBF):
- 定义:一种优先服务距离当前磁头位置最近(磁道最近或逻辑块地址最近)的 I/O 请求的调度算法。
- 角色:性能优化的“初级尝试”,基于局部性原理减少磁头移动,但存在严重缺陷。
- 电梯算法 (Elevator Algorithm) / SCAN / C-SCAN:
- 定义:磁头在磁盘上像电梯一样来回跨越磁道,依次服务沿途的请求。
- 角色:解决并发饥饿的“公平卫士”。
- 最短定位时间优先 (Shortest Positioning Time First, SPTF) / 最短接入时间优先 (Shortest Access Time First, SATF):
- 定义:同时综合考量“寻道时间”加上“旋转延迟”,优先服务总定位时间最短的请求。
- 角色:磁盘调度的“终极成熟算法”,它实现了真正的最短任务优先 (SJF) 变体。
3. 逻辑演进 (Logical Evolution)
为了让缓慢的机械硬盘跑得更快,调度算法经历了如下推演:
- 最初的直觉(SSTF / NBF):既然磁头移动(寻道)很慢,那我们就总是挑选距离当前磁头最近的请求来服务。
- 遇到的问题:1. 饥饿 (Starvation)。如果有一连串针对中间磁道的请求到来,磁头就会一直停留在中间,内圈和外圈的请求将永远得不到服务。 2. 忽视了旋转延迟。
- 演进方案 1(解决饥饿:SCAN 算法):为了公平,让磁头只在一个方向上单向扫过整个磁盘(扫一遍),处理沿途的请求,到底后再反向扫描。
- 遇到的问题:它解决了饥饿问题,但仍然没有遵守严格的最短任务优先 (SJF) 原则,因为它忽略了地球的自转(旋转延迟)。有时候,同一磁道上距离稍远扇区的旋转时间,甚至比稍微移动一下磁头去旁边磁道的寻道时间还要长。
- 最终成熟方案(解决旋转:SPTF 算法与硬件委派):算法必须同时计算寻道和旋转时间,选择综合定位时间最短的请求。
- 如何克服问题(信息壁垒):操作系统其实不知道复杂的磁道边界,也不知道磁头当下旋转到了哪里。因此,现代操作系统不再大包大揽,而是将多个请求发给磁盘,由磁盘控制器内部的复杂调度程序利用精确的内部物理信息来执行 SPTF。
4. 机制与策略 (Mechanisms vs. Policies)
- 底层的“实现手段”(机制 - Mechanisms):
- I/O 合并 (I/O Merging):操作系统层面的核心机制。调度程序在发请求给磁盘前,会检查相邻的逻辑请求(如块33、块34),将它们合并为一个更大的单次请求,从而大幅减少协议开销。
- 上层的“决策逻辑”(策略 - Policies):
- 调度策略:FIFO、SSTF、SCAN、SPTF 等决定“接下来服务哪个请求”的具体算法逻辑。
- 时机策略:工作保全 (Work-conserving) 策略只要有请求就立刻让磁盘运转;而非工作保全 (Non-work-conserving) / 预期调度 (Anticipatory Scheduling) 策略会故意让磁盘空闲等待一会儿,赌接下来会有“更好(更近)”的请求到达。
5. 设计折衷 (Design Trade-offs)
- 牺牲“极致的绝对性能”,换取“全局的公平性”:SSTF 为了追求最小寻道时间,无情地牺牲了边缘磁道请求的公平性(导致饥饿)。而 SCAN(电梯算法)通过强制磁头按顺序扫过整个磁盘,牺牲了一部分本可以更快完成的相邻磁道请求,换取了所有请求都不会被饿死的基本保证。
- 牺牲“当前的硬件利用率”,换取“未来的吞吐量红利”:预期调度(非工作保全方法)做出了一个反直觉的折衷。它牺牲了当下让磁盘保持忙碌的机会(即使有请求也不立即执行,而是等待一段时间),以此换取可能会到达的、物理位置极其相近的新请求。通过短暂的空闲等待,换取了整体寻道开销的骤降与系统总效率的提升。
6. 关键洞察 (Key Insights)
- 永远视情况而定 (Livny's Law / Livny 定律):在系统工程中,很多看似固定的选择其实取决于底层硬件的相对性能比例。如果在某个古老硬盘上,寻道时间远远高于旋转延迟,那 SSTF 表现就很好;但在现代驱动器上,寻道和旋转时间大致相当,那就必须采用 SPTF。工程师不能死记硬背算法,必须学会随着硬件的变化动态评估性能瓶颈。
- 让拥有信息的层级去做决策 (Pushing Scheduling Down):操作系统的伟大之处在于它知道自己的局限。由于隐藏在标准化块接口之下的现代磁盘几何结构极度复杂,操作系统根本无法精确计算旋转开销。聪明的做法是操作系统只做 I/O 合并,然后把一批请求直接甩给磁盘控制器,让深谙自己物理结构的驱动器自行完成 SPTF 调度。
- 抽象泄漏的必然性:虽然磁盘被抽象成了一个一维的 0 到
的简单扇区数组(隐藏了物理细节),但操作系统为了榨干性能,又不得不绞尽脑汁去“猜测”磁盘的物理特性(比如预期调度和最近块优先)。这说明在追求极致性能时,完美的抽象黑盒往往会被性能优化的需求所打破。
7. 磁盘物理结构与延迟图

导师的下一步建议:
现在我们已经彻底拆解了机械硬盘的物理运作机制和调度算法。但单块硬盘受限于物理马达的转速,其性能和容量终究是有天花板的,而且一旦物理损坏,数据就会灰飞烟灭。为了突破单块硬盘的物理极限,下一章将介绍 RAID 技术——通过组合多块廉价磁盘来构建高性能、高可靠的"超级磁盘"。