第 37 章 磁盘驱动器

接口

现代磁盘驱动器的基本接口是一个由大量扇区(通常为 512 字节)组成的线性地址空间(0 到 n-1)。驱动器制造商仅保证单个 512 字节的写入是原子的。如果发生掉电,较大的写入操作可能会出现不完整写入(Torn Write)。

磁盘驱动器存在一个“不成文的契约”:访问空间上彼此靠近的块比访问相隔较远的块更快,且连续块的顺序访问是最快的访问模式。

基本几何形状

磁盘由一个或多个盘片(Platter)组成,每个盘片有上下两个表面。盘片围绕主轴(Spindle)以恒定速度旋转,旋转速率以 RPM(每分钟转数)衡量(如 10000 RPM 意味着单次旋转约需 6ms)。

数据编码在表面的同心圆上,称为磁道(Track)。读写操作由连接在磁盘臂(Disk Arm)上的磁头(Disk Head)完成。

简单的磁盘驱动器模型

为了深入理解磁盘的运作方式,我们可以逐步构建一个磁盘模型。一次完整的 I/O 操作时间严格按照先后顺序由寻道旋转传输三个阶段组成。

单磁道模型与旋转延迟

假设磁盘只有一个磁道,包含 12 个扇区(编号 0 到 11)。磁头连接在磁盘臂的末端,盘片逆时针旋转。 当驱动器收到读取某个扇区的请求时,它必须等待目标扇区旋转到磁头下方。这段等待时间被称为旋转延迟 (Rotational Delay)。 如果磁盘完整的旋转周期耗时为 ,在最坏情况下(目标扇区刚转过磁头)需要等待接近 的时间,而平均旋转延迟通常为单次旋转时间的一半()。

多磁道模型与寻道时间

真实的磁盘表面拥有数以百万计的同心磁道。当请求的扇区位于其他磁道时,驱动器必须首先将磁盘臂移动到正确的磁道上方,这个物理移动过程称为寻道 (Seek)。 寻道与旋转一样,是最昂贵的磁盘操作之一。寻道过程包含四个物理阶段:

  1. 加速:磁盘臂开始移动。
  2. 滑行:磁盘臂全速惯性移动。
  3. 减速:磁盘臂靠近目标磁道时开始减速。
  4. 停放 (Settling Time):磁头小心且精确地定位在目标磁道上。停放时间通常不短(约 0.5 到 2ms),因为驱动器必须绝对确认找准了磁道,而不仅仅是移到了附近。

寻道完成后,磁头已定位在正确的磁道上。此时盘片仍在旋转,接下来只需承担短暂的旋转延迟,等待目标扇区来到磁头下方。

传输

当目标扇区经过磁盘磁头时,I/O 操作进入最后阶段:传输 (Transfer)。此时数据才真正从磁盘表面读取,或写入到磁盘表面。

其他关键设计细节

除了基本的寻道和旋转,现代磁盘还包含以下重要设计以优化性能:

  • 磁道偏斜 (Track Skew):在跨越磁道边界进行顺序读取时,磁盘需要时间来重新定位磁头(即使是移动到相邻磁道)。如果没有偏斜,当磁头到达新磁道时,所需的下一个扇区可能已经转过了磁头,导致必须白白等待一整圈的旋转延迟。因此,相邻磁道的扇区在物理位置上会有一定的角度偏移,以完美衔接磁头切换的时间。

  • 多区域 (Multi-zoned):由于外圈的物理周长更大,现代磁盘将表面划分为多个连续的区域(Zone)。外圈区域的磁道比内圈区域的磁道拥有更多的扇区。
  • 缓存 (Cache/Track Buffer):驱动器内置少量内存(通常 8MB 到 16MB)。
    • 预读机制:读取某扇区时,驱动器可能会将该磁道上的所有扇区一并读入缓存,以极快地响应后续对同磁道的请求。
    • 写入策略:分为后写 (Write Back)(数据放入缓存即向系统报告完成,也称立即报告)和直写 (Write Through)(数据真正落盘后才报告完成)。后写策略能让驱动器看起来更快,但在发生掉电时,可能会破坏文件系统对数据写入顺序的依赖,引发一致性问题。

I/O 时间计算

I/O 时间与速率的计算公式如下:

随机工作负载与顺序工作负载的性能差异巨大。以 Cheetah 15K.5 高性能驱动器为例,其随机 I/O 速率约为 0.66 MB/s,而顺序 I/O 速率可达 125 MB/s,性能差距接近 200 倍。因此,尽可能以顺序方式或大块传输数据是核心的设计原则。

磁盘调度

由于 I/O 成本高昂,操作系统和磁盘控制器会通过调度算法来优化请求顺序,其核心思想是遵循最短任务优先(SJF)。

SSTF (最短寻道时间优先)

SSTF(Shortest-Seek-Time-First)优先服务距离当前磁头最近磁道上的请求。由于操作系统只能看到逻辑块,通常实现为其变体 NBF(Nearest-Block-First)。 SSTF 的致命缺陷是饥饿 (Starvation):如果内圈磁道持续有请求到来,外圈磁道的请求将被无限期搁置。

SCAN / C-SCAN (电梯算法)

为了解决饥饿问题,SCAN 算法以跨越磁道的顺序(如从内到外,再从外到内)服务请求,类似于电梯运行。

  • F-SCAN:在单次扫过期间冻结队列,新到达的请求放入单独队列等待下次扫描。
  • C-SCAN (Circular SCAN):单向扫描(如仅从外向内),到达尽头后直接返回起点,保证了更公平的等待时间。

SPTF (最短定位时间优先)

SSTF 和 SCAN 仅考虑了寻道时间,而忽略了旋转延迟。在现代驱动器中,寻道和旋转时间大致相当。 SPTF(Shortest Positioning Time First)同时考虑寻道和旋转时间,选择总体定位时间最短的请求。由于操作系统缺乏精确的磁头位置和磁道布局信息,SPTF 通常在磁盘控制器内部实现。操作系统只需将一批请求发送给磁盘,由磁盘内部的调度器决定最优执行顺序。

其他调度策略

  • I/O 合并 (I/O Merging):调度器会将相邻的逻辑块请求合并为一个大块请求,以减少请求数量和开销。
  • 非工作保全 (Non-work-conserving):在某些情况下,即使磁盘空闲且有待处理请求,调度器也会选择等待一段时间(Anticipatory Scheduling),期望有物理位置更优的新请求到达,从而提高整体吞吐量。