C++ / a working model

141 / 163   ·   C11   ·   约 8 分钟

硬盘驱动器

先记住这句话

本章讲解硬盘如何以扇区数组形式持久保存数据,盘片磁道磁头的几何布局,以及寻道与旋转延迟如何决定访问成本。调度策略通过重排请求显著提升吞吐。

本篇内容
  1. 接口与线性地址空间
  2. 盘片、磁道与磁头机械
  3. 寻道旋转代价与请求调度
  4. 运行示例
  5. 动手练习

官方章节 PDF

接口与线性地址空间

操作系统把硬盘看成从零开始连续编号的扇区集合,每扇区固定大小。虽然一次可读写多个扇区,厂商只承诺单个扇区写入具有原子性。相邻编号的扇区通常物理上也靠近,因此顺序传输远快于随机跳转。

盘片、磁道与磁头机械

数据以磁性方式记录在高速旋转的盘片两面。主轴电机维持恒定转速,每面分布成千上万条同心磁道。读写磁头固定在可径向摆动的臂上,必须精确停在目标磁道上方才能开始传输。

寻道旋转代价与请求调度

磁头移动包含加速、匀速、减速和最后的稳定阶段,稳定往往耗时最长。到达正确磁道后还要等待目标扇区转到磁头下方。SSTF 或 SCAN 一类调度器把待处理请求按磁道位置排序,从而缩短总寻道距离并提高整体带宽。

常见误区

  • 把多扇区写入当成原子操作,断电时会出现撕裂写。
  • 计算寻道时漏掉磁头稳定时间,导致延迟被严重低估。
  • 误以为随机负载也能达到顺序传输的吞吐量。

运行一个例子

最低标准 C11 · 完整程序 · 下载 .c

#include <stdio.h>

int main(void) {
    const double rpm = 7200.0;
    const double full_rotation_ms = 60000.0 / rpm;
    const double avg_seek_ms = 9.0;
    const double settle_ms = 1.0;
    printf("Hard Disk Drive Access Time Simulator\n");
    printf("=====================================\n");
    printf("RPM: %.0f, Full rotation: %.2f ms\n", rpm, full_rotation_ms);
    printf("Average seek: %.1f ms, Settle: %.1f ms\n\n", avg_seek_ms, settle_ms);
    double random_access = avg_seek_ms + settle_ms + 0.5 * full_rotation_ms;
    printf("Typical random I/O time: %.2f ms\n", random_access);
    printf("Sequential transfer much faster due to no extra seeks/rotations.\n");
    int current_track = 0;
    int target_track = 100;
    double seek_time = 0.08 * (target_track - current_track) + settle_ms;
    double rot_delay = 0.3 * full_rotation_ms;
    double total = seek_time + rot_delay;
    printf("\nExample request: from track %d to %d\n", current_track, target_track);
    printf("Seek time: %.2f ms, Rotational delay: %.2f ms, Total: %.2f ms\n", seek_time, rot_delay, total);
    return 0;
}

在本地编译

gcc -std=c11 -Wall -Wextra -Wpedantic -Werror ostep-37-hard-disks.c -o example && ./example

预期结果

Hard Disk Drive Access Time Simulator
=====================================
RPM: 7200, Full rotation: 8.33 ms
Average seek: 9.0 ms, Settle: 1.0 ms

Typical random I/O time: 14.17 ms
Sequential transfer much faster due to no extra seeks/rotations.

Example request: from track 0 to 100
Seek time: 9.00 ms, Rotational delay: 2.50 ms, Total: 11.50 ms

CHECK YOUR UNDERSTANDING

合上答案,试着解释。

硬盘转速为 15000 RPM,最坏情况下旋转延迟等于多少毫秒?

查看参考答案

4 毫秒,因为一整圈需要 60/15000 = 0.004 秒。

继续查证

标准草案与官方章节会更新;版本标记只说明示例最低要求。

回到目录