141 / 163 · C11 · 约 8 分钟
硬盘驱动器
先记住这句话
本章讲解硬盘如何以扇区数组形式持久保存数据,盘片磁道磁头的几何布局,以及寻道与旋转延迟如何决定访问成本。调度策略通过重排请求显著提升吞吐。
接口与线性地址空间
操作系统把硬盘看成从零开始连续编号的扇区集合,每扇区固定大小。虽然一次可读写多个扇区,厂商只承诺单个扇区写入具有原子性。相邻编号的扇区通常物理上也靠近,因此顺序传输远快于随机跳转。
盘片、磁道与磁头机械
数据以磁性方式记录在高速旋转的盘片两面。主轴电机维持恒定转速,每面分布成千上万条同心磁道。读写磁头固定在可径向摆动的臂上,必须精确停在目标磁道上方才能开始传输。
寻道旋转代价与请求调度
磁头移动包含加速、匀速、减速和最后的稳定阶段,稳定往往耗时最长。到达正确磁道后还要等待目标扇区转到磁头下方。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 秒。
继续查证
标准草案与官方章节会更新;版本标记只说明示例最低要求。