编程与 AI14 分钟阅读更新于 2026-08-04

磁盘 I/O 怎么完成:磁盘结构、寻道过程与调度算法

梳理磁盘的盘面、磁道和扇区,解释一次磁盘 I/O 的寻道、旋转与传输过程,并比较 FCFS、SSTF 和 SCAN 调度策略。

相关工具

为什么磁盘 I/O 需要单独管理

处理器执行指令的速度远高于传统磁盘移动磁头和读取盘面数据的速度。多个程序同时请求文件时,如果系统不安排访问顺序,磁头可能在不同磁道之间来回移动,大量时间花在等待位置,而不是传输数据。

操作系统因此把磁盘看成一个需要排队服务的设备。上层只提出读取或写入某个逻辑块的请求,底层再决定何时服务、先服务谁,以及如何减少不必要的机械移动。磁盘调度的目标不是简单地让某一个请求最快完成,而是让整体等待时间、吞吐量和公平性保持平衡。

应用到文件系统、I/O 调度器和磁盘设备的请求路径图
磁盘 I/O 的请求路径

文件系统把文件访问转换为块请求,I/O 调度器安排顺序,设备完成寻道、旋转和数据传输。

盘面、磁道和扇区分别是什么

传统硬盘由多个盘片组成,盘片的表面称为盘面。磁头可以在盘面上方移动,盘面上按同心圆划分出许多磁道;每条磁道又被切分成若干扇区,扇区是磁盘读写的基本物理区域。多个盘片上半径相同的磁道可以看作同一个柱面。

这些概念帮助我们理解磁头为什么要移动,也解释了连续数据为什么通常更容易读取。现代系统一般不会让普通程序直接使用盘面、磁道和扇区,而是提供逻辑块号。文件系统和设备驱动负责把逻辑块转换成设备能够执行的访问位置。

一次磁盘读取要经过三个阶段

第一步是寻道,磁头移动到目标磁道;第二步是旋转等待,盘片旋转到目标扇区经过磁头;第三步是数据传输,设备把目标扇区中的内容读入控制器和内存。对传统硬盘来说,寻道和旋转等待通常比真正传输少量数据更耗时。

因此,连续读取一段相邻数据往往比多次随机读取更高效。前者可能只需要一次寻道和一次旋转等待,后续数据随着盘片转动连续经过磁头;后者则可能反复触发位置变化。文件系统把相关块尽量放在相近位置,缓存和预读也都建立在这种访问特征上。

磁盘 I/O 依次经过寻道、旋转等待和数据传输三个阶段的流程图
一次磁盘读取的三个阶段

寻道、旋转等待和数据传输共同构成传统硬盘的一次读取延迟。

为什么要用逻辑块号抽象磁盘

如果每个程序都需要了解磁盘有多少个盘面、每条磁道有多少个扇区,程序就会被具体设备牢牢绑定。不同硬盘的结构不同,换一块设备就可能要重新计算地址,应用也无法把文件系统的逻辑组织和设备细节分开。

逻辑块号提供了一层稳定的接口。应用请求的是某个文件,文件系统把它转换成一个或多个逻辑块号,设备驱动再根据硬件布局完成实际访问。这样,文件系统可以专注于文件和空间管理,设备驱动专注于控制器和介质差异。

FCFS:先到的请求先服务

FCFS 按照请求进入队列的顺序处理磁盘访问。它的优点是规则简单,先来先服务,不容易让某个请求因为距离磁头较远而长期得不到响应。在负载变化大、请求量不高的情况下,简单策略也更容易预测。

它的问题是可能产生很长的磁头移动路径。假设请求位置交替分布在磁盘两端,磁头就会反复横跨整个盘面,平均等待时间和总移动距离都可能较大。FCFS 更看重到达顺序和公平性,而不是寻找最短的当前路径。

SSTF:优先处理最近的请求

SSTF 每次从等待队列中选择距离当前磁头位置最近的请求,类似于在当前时刻选择最短的移动距离。它通常能减少一次服务中的寻道时间,在请求集中于某些区域时表现尤其明显。

但“最近”不等于“公平”。如果磁头附近持续有新请求到达,较远位置的请求可能一直被推迟,形成饥饿。系统设计不能只看平均等待时间,还要观察最长等待时间,避免吞吐量提高的同时牺牲部分请求的可用性。

SCAN:像电梯一样往返服务

SCAN 让磁头沿一个方向移动,依次处理这个方向上的请求,到达一端或没有更远请求后再改变方向。它像电梯在楼层之间运行:不会为了一个刚到达的近处请求频繁掉头,也不会长期忽略另一侧的请求。

SCAN 在寻道效率和公平性之间做了折中。它的服务顺序受到磁头当前方向影响,因此比 SSTF 更容易限制最长等待时间。实际系统还可以根据请求分布改进边界行为,例如到达最后一个请求后就返回,而不是一定移动到物理盘面最外侧。

FCFS、SSTF 和 SCAN 磁盘调度策略的路径对比图
三种磁盘调度思路

FCFS 保持到达顺序,SSTF 选择最近请求,SCAN 沿一个方向批量服务后再返回。

缓存、预读和磁盘整理如何减少等待

块缓存把近期访问过的磁盘块留在内存中。再次读取同一块时,系统可以直接返回缓存内容,省去设备访问。预读则根据顺序访问的迹象,把程序可能马上需要的后续块提前装入缓存。预读适合连续读取,对真正随机的访问不一定有帮助。

把相关文件或数据块放得更接近,可以减少磁头移动;磁盘碎片整理则试图把分散的数据重新组织成更连续的区域。不过整理本身也需要大量读写,是否值得进行,要结合设备类型、空间使用率和实际访问模式判断。

从硬盘经验看待今天的存储设备

寻道、旋转和磁头移动是机械硬盘的典型特征。固态硬盘没有这些机械动作,随机访问延迟通常更低,但它仍然需要处理闪存页、擦除块、写放大、磨损均衡和请求队列。操作系统中的缓存、块层和 I/O 排队仍然重要,只是调度依据不再完全等同于磁头移动距离。

学习磁盘调度的价值,不只是记住几个算法名称,而是理解设备延迟来自哪里,以及系统如何利用局部性、队列和批量操作降低成本。面对不同存储介质,策略可以变化,但“把高层请求转换成设备可执行的有序工作”这条主线仍然成立。

用一条主线记住磁盘 I/O

应用提出文件访问,文件系统找到对应的数据块,块层把请求放入队列,调度器选择处理顺序,设备再完成定位和传输。缓存命中时可以提前结束;缓存未命中时,等待时间主要取决于设备定位、队列长度和实际传输量。

比较调度算法时,可以依次问三个问题:它是否减少了总移动距离,是否会让部分请求长期等待,是否适合当前设备的物理特征。这样,FCFS、SSTF 和 SCAN 就不再是孤立的缩写,而是面对不同目标时的几种取舍。

常见问题

磁盘 I/O 延迟主要由什么组成?

传统硬盘通常包括寻道时间、旋转等待时间和数据传输时间,实际还会受到请求排队、控制器和缓存命中的影响。

SSTF 一定比 FCFS 好吗?

不一定。SSTF 通常能减少局部寻道距离,但可能让远处请求长期等待;FCFS 更公平简单,却可能产生较大的总移动距离。

固态硬盘还需要磁盘调度吗?

需要,但调度依据会变化。固态硬盘没有磁头寻道和盘片旋转,系统仍需管理请求队列、并发、缓存、写放大和设备内部资源。