磁盘
磁盘管理
磁盘初始化
一个新的磁盘只是一个磁性记录材料的空白盘。在磁盘可以存储数据之前,必须对其进行 物理格式化(也叫做低级格式化)。
物理格式化是指在磁盘的物理表面上创建磁道(track)、扇区(sector)、写入控制信息 以及 测试和标记坏扇区等过程。通过这一过程,磁盘被划分为可供读写头访问的物理存储单元,为数据存储和检索提供基础结构。
一般来说,现代硬盘在出厂时已完成物理格式化,并优化了磁道和扇区的布局。用户通常只需进行逻辑格式化即可使用。
分区
在使用磁盘存储文件之前,操作系统首先需要对磁盘进行分区,并且将每个分区的起始扇区和大小都记录在磁盘 主引导记录 (MBR,Master Boot Record)的分区表中。这一过程为磁盘划分出若干逻辑存储区域,每个分区可以独立格式化并使用不同的文件系统,为数据的组织和管理提供了基础。
分区表是存储在磁盘主引导记录(MBR)或 GUID 分区表(GPT)中的关键数据结构,用于描述磁盘的分区布局(简单了解即可):
- 在 MBR 结构中,分区表位于磁盘的第一个扇区(主引导记录),最多支持 4 个主分区或 3 个主分区加 1 个扩展分区,每个分区记录包含起始扇区、结束扇区、分区类型和大小等信息。
- GPT 结构使用更现代的设计,支持更多的分区(通常 128 个),并存储在磁盘的前几个扇区,提供更高的可靠性和大容量磁盘支持。分区表的存在使操作系统能够准确识别和访问各个分区,确保数据存储的有序性和兼容性。
下图是一个 MBR 分区表的结构:
完成分区后,需对每个分区进行 逻辑格式化 (也称高级格式化)。逻辑格式化负责创建文件系统结构,使操作系统能够识别、组织和管理磁盘上的数据,主要包括生成文件系统的元数据、分配表和目录结构等。
物理格式化和逻辑格式化对比
物理格式化(低级格式化)是在磁盘物理层面创建磁道、扇区和控制信息的过程,通常由制造商出厂时完成。它直接处理磁盘的硬件结构,擦除所有数据并标记坏扇区,为数据存储提供物理基础。
逻辑格式化(高级格式化)是在物理格式化基础上创建文件系统(如 NTFS、FAT32)的过程,由用户通过操作系统完成。它组织数据的逻辑结构,如文件分配表和目录,方便操作系统管理数据。
引导流程
在计算机启动时,初始化硬件并加载操作系统的过程依赖于一系列引导程序。前文提到,磁盘存储文件前需分区,分区信息记录在主引导记录(MBR)的分区表中。启动流程具体如下:
- ROM:计算机加电后,ROM 中的固件(传统 BIOS 或现代 UEFI)首先运行。它初始化硬件,并寻找可启动设备(通常是磁盘)。ROM 中的小型自举代码指示磁盘控制器读取磁盘的第 0 号扇区(即 MBR)到内存。
- MBR 中的 Bootloader:MBR(主引导记录)位于磁盘的第一个扇区,包含引导代码、分区表和引导签名。MBR 的引导代码(即 Bootloader)被 ROM 加载并执行,它的任务是解析分区表,找到标有“活动分区”的引导分区,并加载该分区的第一个扇区。
- 分区的启动扇区(Boot Sector):活动分区的第一个扇区称为引导扇区(Boot Sector),包含特定于操作系统的引导代码(例如 Windows 的 NT Loader 或 Linux 的 GRUB 部分代码)。MBR 的 Bootloader 将控制权移交到引导扇区,引导扇区代码进一步加载操作系统内核和其他必要组件(如设备驱动程序),最终启动操作系统。
- 操作系统初始化程序:在分区的启动扇区中的引导代码执行结束后,控制权被转交给操作系统的初始化程序,该程序负责加载操作系统内核、加载设备驱动、初始化内存和硬件环境,然后将控制权传递给内核。
因此,启动流程可以概括为:ROM 中的固件 → MBR 中的 Bootloader → 分区启动扇区中的引导程序 → 操作系统的初始化程序,每一阶段都将控制权传递给下一阶段,直至操作系统完全运行。
坏块
随着时间的推移,物理磁盘上可能会出现无法读写的区域,这些区域被称为坏块。坏块可以是出厂时就存在的,也可以是由于磁盘的长期使用和磨损导致的。
对坏块的处理实质上就是使用某种机制使系统不去使用坏块。
机械硬盘调度算法
在 磁盘性能指标 我们知道 磁盘数据读取时间 包含寻道时间、旋转延迟以及传输时间。在一个时刻,磁盘可能有多个数据读写请求,这些数据可能分布在不同的磁道上,如何分配处理这些读写请求的顺序,也很大程度上影响了磁盘的性能。
磁道的编号顺序:
在磁盘驱动器中,磁道编号通常是从外到内的。磁盘表面被划分为同心圆,这些同心圆称为磁道。最外面的磁道通常被赋予最小的编号(例如,0 号磁道),随着磁道向内圈逐渐增加,编号递增。这种编号方式允许磁盘的读写头更容易地定位到磁道的起始位置,因为磁盘的旋转通常是从外缘开始。
磁盘寻道调度算法包含以下几种:
FCFS
FCFS 即 First Come First Service,先来先服务算法。
FCFS 是一种最简单的磁盘调度算法,按照请求到达的先后顺序依次处理磁盘访问任务。
假设在当前时刻,磁道 55、58、39、18、90、160、150、38、184
分别先后到达,那么 FCFS 会有如下图所示的访问顺序:
然而,由于不考虑磁头当前位置与请求位置的距离,磁头可能频繁长距离移动,导致平均寻道时间较长,尤其在请求分布不均时效率低下。
SSTF
SSTF 即 Shortest Seek Time First,最短寻道时间优先算法。
磁盘进行调度时每次都选择 距离当前磁头位置最近的请求 进行服务。 旨在最小化磁头的移动距离,从而降低平均寻道时间。它的核心思想是“贪心”,每次选择最优的下一步。
假设在当前时刻,磁道 55、58、39、18、90、160、150、38、184
正在等待服务,那么 SSTF 会有如下图所示的访问顺序:
虽然 SSTF 在减少寻道时间上表现优异,但可能导致“饥饿”问题,即远离磁头的请求长时间得不到服务。SSTF 适用于请求分布较均匀的场景,但在请求密集或分布极不均的情况下可能不够公平。
SCAN
SCAN 即 电梯调度算法。
磁头从一个方向开始移动,直到该方向上没有更多的请求或达到边界,然后磁头改变方向并继续服务请求。因为磁头移动规律与电梯运行类似,所以这种算法也称为电梯调度算法。
假设在当前时刻,磁道 55、58、39、18、90、160、150、38、184
正在等待服务,磁头正在向内移动(向更高编号的磁道移动),那么 SCAN 会有如下图所示的访问顺序:
SCAN 的优点是有效减少了磁头移动距离,同时避免了 SSTF 的饥饿问题,因为所有请求最终都会被处理。它在高负载场景下表现良好,但对于靠近磁盘边界或反向区域的请求可能等待时间稍长。 SCAN 广泛应用于需要平衡效率与公平性的场景。
C-SCAN
C-SCAN 即 Cycle Scan,循环扫描算法。
和 SCAN 相似,但进行了一些改进。在 C-SCAN 中,磁头始终沿一个方向移动(例如向外),处理沿途请求,到达磁盘边界后立即返回到另一端(例如最内侧)开始新一轮扫描,而不处理返回路径上的请求。
C-SCAN 的优点是提供更均匀的等待时间,尤其对靠近磁盘两端的请求更公平,因为它避免了 SCAN 中反向移动时的偏向性。它的寻道效率略低于 SCAN,但适用于需要更高公平性和稳定性的场景,如实时系统。
对比
算法 | 优点 | 缺点 |
---|---|---|
FCFS | 公平 简单 | 可能不是最优的,磁盘臂移动距离可能很长 |
SSTF | 通常比 FCFS 更高效 最小化磁盘臂的移动 | 可能导致某些请求长时间延迟或饿死 |
SCAN | 避免长时间等待 | 磁盘两端可能经历不公平的等待时间 |
C-SCAN | 提供更均匀的等待时间 | 中间部分的请求可能会被经过两次而不进行服务,直到磁头再次回来 |