磁盘

重点内容,需熟练掌握机械磁盘调度算法,在选择题中会考察,也可能在大题中考察相关调度算法。

磁盘管理

磁盘初始化

一个新的磁盘只是一个磁性记录材料的空白盘。在磁盘可以存储数据之前,必须对其进行 物理格式化(也叫做低级格式化)。

物理格式化是指在磁盘的物理表面上创建磁道(track)、扇区(sector)、写入控制信息 以及 测试和标记坏扇区等过程。通过这一过程,磁盘被划分为可供读写头访问的物理存储单元,为数据存储和检索提供基础结构。

一般来说,现代硬盘在出厂时已完成物理格式化,并优化了磁道和扇区的布局。用户通常只需进行逻辑格式化即可使用。

分区

Partition #1
Partition #2
Partition #3
Volume C:
Volume D:
Volume E:
Disk

在使用磁盘存储文件之前,操作系统首先需要对磁盘进行分区,并且将每个分区的起始扇区和大小都记录在磁盘 主引导记录 (MBR,Master Boot Record)的分区表中。这一过程为磁盘划分出若干逻辑存储区域,每个分区可以独立格式化并使用不同的文件系统,为数据的组织和管理提供了基础。

分区表是存储在磁盘主引导记录(MBR)或 GUID 分区表(GPT)中的关键数据结构,用于描述磁盘的分区布局(简单了解即可):

  • 在 MBR 结构中,分区表位于磁盘的第一个扇区(主引导记录),最多支持 4 个主分区或 3 个主分区加 1 个扩展分区,每个分区记录包含起始扇区、结束扇区、分区类型和大小等信息。
  • GPT 结构使用更现代的设计,支持更多的分区(通常 128 个),并存储在磁盘的前几个扇区,提供更高的可靠性和大容量磁盘支持。分区表的存在使操作系统能够准确识别和访问各个分区,确保数据存储的有序性和兼容性。

下图是一个 MBR 分区表的结构:

引导程序
分区入口 1
分区入口 2
分区入口 3
分区入口 4
引导签名
分区标志
起始 CHS 地址
分区类型
结束 CHS 地址
起始 LBA
扇区数量
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22%22%20style%3D%22endArrow%3Dclassic%3BstartArrow%3Dclassic%3Bhtml%3D1%3Brounded%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22140%22%20y%3D%22360%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%22140%22%20y%3D%22240%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22%22%20style%3D%22endArrow%3Dclassic%3BstartArrow%3Dclassic%3Bhtml%3D1%3Brounded%3D0%3B%22%20edge%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20width%3D%2250%22%20height%3D%2250%22%20relative%3D%221%22%20as%3D%22geometry%22%3E%3CmxPoint%20x%3D%22140%22%20y%3D%22360%22%20as%3D%22sourcePoint%22%2F%3E%3CmxPoint%20x%3D%22140%22%20y%3D%22240%22%20as%3D%22targetPoint%22%2F%3E%3C%2FmxGeometry%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
64
Bytes
446
Bytes
4 Bytes
分区
MBR
MBR:磁盘的第一个扇区
每个分区的
启动扇区
分区 1
分区 2
分区 3
分区 4(扩展分区)

完成分区后,需对每个分区进行 逻辑格式化 (也称高级格式化)。逻辑格式化负责创建文件系统结构,使操作系统能够识别、组织和管理磁盘上的数据,主要包括生成文件系统的元数据、分配表和目录结构等。

注意

物理格式化和逻辑格式化对比

物理格式化(低级格式化)是在磁盘物理层面创建磁道、扇区和控制信息的过程,通常由制造商出厂时完成。它直接处理磁盘的硬件结构,擦除所有数据并标记坏扇区,为数据存储提供物理基础。

逻辑格式化(高级格式化)是在物理格式化基础上创建文件系统(如 NTFS、FAT32)的过程,由用户通过操作系统完成。它组织数据的逻辑结构,如文件分配表和目录,方便操作系统管理数据。

引导流程

ROM 固件
MBR 中的 bootloader
分区中启动扇区的引导程序
操作系统初始化程序

在计算机启动时,初始化硬件并加载操作系统的过程依赖于一系列引导程序。前文提到,磁盘存储文件前需分区,分区信息记录在主引导记录(MBR)的分区表中。启动流程具体如下:

  1. ROM:计算机加电后,ROM 中的固件(传统 BIOS 或现代 UEFI)首先运行。它初始化硬件,并寻找可启动设备(通常是磁盘)。ROM 中的小型自举代码指示磁盘控制器读取磁盘的第 0 号扇区(即 MBR)到内存。
  2. MBR 中的 Bootloader:MBR(主引导记录)位于磁盘的第一个扇区,包含引导代码、分区表和引导签名。MBR 的引导代码(即 Bootloader)被 ROM 加载并执行,它的任务是解析分区表,找到标有“活动分区”的引导分区,并加载该分区的第一个扇区。
  3. 分区的启动扇区(Boot Sector):活动分区的第一个扇区称为引导扇区(Boot Sector),包含特定于操作系统的引导代码(例如 Windows 的 NT Loader 或 Linux 的 GRUB 部分代码)。MBR 的 Bootloader 将控制权移交到引导扇区,引导扇区代码进一步加载操作系统内核和其他必要组件(如设备驱动程序),最终启动操作系统。
  4. 操作系统初始化程序:在分区的启动扇区中的引导代码执行结束后,控制权被转交给操作系统的初始化程序,该程序负责加载操作系统内核、加载设备驱动、初始化内存和硬件环境,然后将控制权传递给内核。

因此,启动流程可以概括为:ROM 中的固件 → MBR 中的 Bootloader → 分区启动扇区中的引导程序 → 操作系统的初始化程序,每一阶段都将控制权传递给下一阶段,直至操作系统完全运行。

坏块

随着时间的推移,物理磁盘上可能会出现无法读写的区域,这些区域被称为坏块。坏块可以是出厂时就存在的,也可以是由于磁盘的长期使用和磨损导致的。

对坏块的处理实质上就是使用某种机制使系统不去使用坏块。

机械硬盘调度算法

磁盘性能指标 我们知道 磁盘数据读取时间 包含寻道时间、旋转延迟以及传输时间。在一个时刻,磁盘可能有多个数据读写请求,这些数据可能分布在不同的磁道上,如何分配处理这些读写请求的顺序,也很大程度上影响了磁盘的性能。

注意

磁道的编号顺序:

在磁盘驱动器中,磁道编号通常是从外到内的。磁盘表面被划分为同心圆,这些同心圆称为磁道。最外面的磁道通常被赋予最小的编号(例如,0 号磁道),随着磁道向内圈逐渐增加,编号递增。这种编号方式允许磁盘的读写头更容易地定位到磁道的起始位置,因为磁盘的旋转通常是从外缘开始。

磁盘寻道调度算法包含以下几种:

FCFS

FCFS 即 First Come First Service,先来先服务算法。

FCFS 是一种最简单的磁盘调度算法,按照请求到达的先后顺序依次处理磁盘访问任务。

假设在当前时刻,磁道 55、58、39、18、90、160、150、38、184 分别先后到达,那么 FCFS 会有如下图所示的访问顺序:

0
0
18
18
38
38
39
39
55
55
58
58
90
90
100
100
150
150
160
160
184
184
200
200
FCFS
FCFS
Time
Time
Text is not SVG - cannot display

然而,由于不考虑磁头当前位置与请求位置的距离,磁头可能频繁长距离移动,导致平均寻道时间较长,尤其在请求分布不均时效率低下。

注意

注意该节提到的所有调度算法都是针对 机械硬盘 讨论的,对于 固态硬盘 的话,FCFS 调度策略非常高效,因为不用考虑寻道时间。

SSTF

SSTF 即 Shortest Seek Time First,最短寻道时间优先算法。

磁盘进行调度时每次都选择 距离当前磁头位置最近的请求 进行服务。 旨在最小化磁头的移动距离,从而降低平均寻道时间。它的核心思想是“贪心”,每次选择最优的下一步。

假设在当前时刻,磁道 55、58、39、18、90、160、150、38、184 正在等待服务,那么 SSTF 会有如下图所示的访问顺序:

0
0
18
18
38
38
39
39
55
55
58
58
90
90
100
100
150
150
160
160
184
184
200
200
SSTF
SSTF
Text is not SVG - cannot display

虽然 SSTF 在减少寻道时间上表现优异,但可能导致“饥饿”问题,即远离磁头的请求长时间得不到服务。SSTF 适用于请求分布较均匀的场景,但在请求密集或分布极不均的情况下可能不够公平。

SCAN

SCAN 即 电梯调度算法。

磁头从一个方向开始移动,直到该方向上没有更多的请求或达到边界,然后磁头改变方向并继续服务请求。因为磁头移动规律与电梯运行类似,所以这种算法也称为电梯调度算法。

假设在当前时刻,磁道 55、58、39、18、90、160、150、38、184 正在等待服务,磁头正在向内移动(向更高编号的磁道移动),那么 SCAN 会有如下图所示的访问顺序:

0
0
18
18
38
38
39
39
55
55
58
58
90
90
100
100
150
150
160
160
184
184
200
200
SCAN
SCAN
Text is not SVG - cannot display

SCAN 的优点是有效减少了磁头移动距离,同时避免了 SSTF 的饥饿问题,因为所有请求最终都会被处理。它在高负载场景下表现良好,但对于靠近磁盘边界或反向区域的请求可能等待时间稍长。 SCAN 广泛应用于需要平衡效率与公平性的场景。

C-SCAN

C-SCAN 即 Cycle Scan,循环扫描算法。

和 SCAN 相似,但进行了一些改进。在 C-SCAN 中,磁头始终沿一个方向移动(例如向外),处理沿途请求,到达磁盘边界后立即返回到另一端(例如最内侧)开始新一轮扫描,而不处理返回路径上的请求。

0
0
18
18
38
38
39
39
55
55
58
58
90
90
100
100
150
150
160
160
184
184
200
200
C-SCAN
C-SCAN
Text is not SVG - cannot display

C-SCAN 的优点是提供更均匀的等待时间,尤其对靠近磁盘两端的请求更公平,因为它避免了 SCAN 中反向移动时的偏向性。它的寻道效率略低于 SCAN,但适用于需要更高公平性和稳定性的场景,如实时系统。

对比

算法优点缺点
FCFS公平
简单
可能不是最优的,磁盘臂移动距离可能很长
SSTF通常比 FCFS 更高效
最小化磁盘臂的移动
可能导致某些请求长时间延迟或饿死
SCAN避免长时间等待磁盘两端可能经历不公平的等待时间
C-SCAN提供更均匀的等待时间中间部分的请求可能会被经过两次而不进行服务,直到磁头再次回来