一篇围绕文件系统硬件展开的学习笔记。
文件系统是对具体存储介质的抽象。本篇讨论文件系统背后的硬件基础:磁盘、SSD、磁带,以及它们如何影响连接方式、调度、格式化、引导和交换空间。
1. 磁盘分类
文件系统最典型的外存设备是机械磁盘。它可以看成是由盘片、磁道、柱面和扇区构成的物理结构。
| 对象 | 含义 |
|---|---|
| 盘片 | 用磁性材料保存数据的圆盘 |
| 磁道 | 盘片表面上的同心圆轨迹 |
| 柱面 | 多个盘片上同一半径的磁道集合 |
| 扇区 | 磁道上的更小划分,通常是最小传输单位的一部分 |
读写磁头附着在磁臂上,悬浮在盘片表面之上。磁盘 I/O 的主要延迟来自两部分:
| 延迟 | 含义 |
|---|---|
| 寻道时间 | 磁臂移动到目标柱面的时间 |
| 旋转延迟 | 盘片旋转到目标扇区下方的时间 |
机械磁盘之外,文件系统还会面对 SSD 和磁带。
| 设备 | 特点 |
|---|---|
| SSD | 没有机械运动部件,延迟更低,功耗更小,但容量、成本和寿命都有自己的权衡 |
| 磁带 | 容量大,适合备份和归档,但随机访问极慢 |
机械磁盘和 SSD 的差异,直接决定了后面的调度策略是否有意义。磁带则更像离线存储媒介,而不是常规文件系统的主战场。
磁盘旋转还涉及两种常见速度控制方式:
| 方式 | 含义 |
|---|---|
| CLV | Constant Linear Velocity,保持单位时间内经过磁头的扇区数量大致恒定 |
| CAV | Constant Angular Velocity,保持盘片角速度恒定 |
CD、DVD 一类介质更接近 CLV,而机械硬盘通常采用 CAV。在 CAV 下,外层磁道比内层磁道更长,因此往往能够容纳更多扇区。
从操作系统角度看,磁盘通常又会被抽象为逻辑块的一维数组。逻辑块是最小传输单位,常见大小为 512B ,也可能因设备和低级格式化方式不同而变化。文件系统最终面向的,是这组线性编号的逻辑块,而不是直接操作柱面、磁道和扇区。
2. 磁盘连接
磁盘通常有两种接入方式:主机连接存储和网络连接存储。
| 方式 | 含义 |
|---|---|
| 主机连接存储 | 通过 I/O 总线直接连接到主机 |
| 网络连接存储 | 通过网络远程访问存储设备 |
主机连接存储常见于本地磁盘、RAID 阵列和直接连接的外设,典型总线包括 ATA、SATA、USB 和 Fibre Channel 等。
网络连接存储则把存储看成远程服务,通过 NFS、CIFS 或 iSCSI 一类协议访问。它更灵活,但带来额外网络开销。
3. 磁盘调度
磁盘调度可以是操作系统的一部分,也可以是磁盘控制器的一部分,或者两者同时参与。
| 位置 | 更擅长处理什么 | 局限 |
|---|---|---|
| 操作系统 | 结合任务优先级、请求来源和系统负载做调度 | 难以完全掌握设备内部的物理细节 |
| 磁盘控制器 | 根据物理位置减少寻道和旋转延迟 | 难以判断请求服务于哪个应用、优先级多高 |
因此,两层调度关注的问题并不相同。操作系统更关心“哪些请求更应该先完成”,例如交换区访问可能比普通文件访问更紧急;控制器更关心“怎样按物理位置重排请求更省时间”。
磁盘调度解决的是“多个 I/O 请求按什么顺序服务更合适”。
磁盘访问时间由三部分相关因素决定:
| 因素 | 含义 |
|---|---|
| 寻道时间 | 头移动到目标柱面的时间 |
| 旋转延迟 | 盘片转到目标扇区的时间 |
| 传输时间 | 真正读写数据的时间 |
调度策略的核心目标是减少磁头移动、降低平均等待时间,并尽量提高磁盘带宽。
FCFS
先来先服务(First-Come First-Served)最简单,也最公平,但不关心请求在磁盘上的位置。
SSTF
最短寻道时间优先(Shortest-Seek-Time-First)总是选择离当前磁头最近的请求。它通常比 FCFS 更快,但可能导致远处请求长期得不到服务。
SCAN 与 C-SCAN
SCAN中,磁头在最内部磁道与最外部磁道间来回循环移动,处理沿途的请求。也被称为电梯算法。 C-SCAN(Circular SCAN)中,磁道从最内部磁道移动到最外部磁道,处理沿途的请求,但回程过程迅速且不处理任何请求。
LOOK 与 C-LOOK
在SCAN调度中,磁头在最内部磁道与最外部磁道之间来回运动。但LOOK调度只在当前任务序列覆盖 的最内部磁道与最外部磁道之间运动,即LOOK调度只遍历磁盘空间的子集
SCAN调度与C-SCAN调度, LOOK调度与C-LOOK调度解决了调度的饥饿问题,并且在请求位置随机分布的大负荷系统上表现优越。
对比
机械磁盘最适合这些调度算法,因为它们确实存在显著的机械延迟。SSD 没有磁头和旋转延迟,所以这类调度的收益大幅下降。
磁盘调度的效果还会受到文件系统布局影响。文件分配方式会改变请求目标在磁盘上的分布,因此也会改变磁头移动模式。
| 布局因素 | 对调度的影响 |
|---|---|
| 连续分配 | 文件数据更集中,顺序访问时磁头移动更少 |
| 链接分配与索引分配 | 数据块更容易分散,访问过程更可能跨越多个区域 |
| 目录与索引块的位置 | 路径解析和索引查找会引入额外 I/O |
文件访问通常不会直接从数据块开始。路径需要逐级解析目录,索引分配还可能先访问 inode 或间接块,再访问真正的数据块。因此,目录、索引块和数据块若相距较远,即使读的是一个小文件,也可能经历多次寻道和旋转延迟。
一般而言,机械磁盘更常使用 SSTF、LOOK 一类强调减少机械移动的策略;SSD 没有移动部件,FCFS 这类简单策略往往已经足够。
4. 磁盘格式化
磁盘格式化至少可以分成两层:低级格式化,以及分区后的逻辑格式化。
低级格式化
新磁盘最初只是可记录数据的物理介质,还不能直接供文件系统使用。低级格式化会把盘面划分成可寻址的扇区,并为每个扇区写入固定结构。
一个扇区通常包含下面几个部分:
| 部分 | 作用 |
|---|---|
| 头部 | 记录扇区标识等控制信息 |
| 数据区 | 存放真正的数据 |
| 尾部 | 保存纠错码等校验信息 |
低级格式化完成后,磁盘才具备最基本的读写单位。
分区与逻辑格式化
分区会把磁盘划分成多个连续区域。操作系统可以把每个分区视为一个独立的逻辑磁盘,再决定其用途。
| 步骤 | 作用 |
|---|---|
| 分区 | 划分磁盘边界,决定哪些区域属于哪个用途 |
| 逻辑格式化 | 在分区上建立文件系统,并写入初始元数据 |
逻辑格式化写入的并非用户文件,而是文件系统自己的起始结构,例如空目录、超级块、inode 区域或其他卷控制信息。
并不是每个分区都必须建立文件系统。交换区或某些原始分区可以跳过逻辑格式化,直接把该区域视为逻辑块数组使用。
5. 引导块
系统启动时,ROM 中的自举程序本身通常很小,它只能完成最基本的硬件初始化和定位工作。接下来,它需要从磁盘上找到更完整的引导程序,并把它装入内存执行。
引导块保存的就是这一步所需的信息或代码。它通常位于启动分区的开头,因此常被看成磁盘上最早被访问的结构之一。
启动过程通常包含如下步骤:
- 处理器启动后执行 ROM 中的自举代码。
- 自举代码定位可启动设备上的引导块。
- 引导块中的引导程序被读入内存并开始执行。
- 更完整的引导程序继续定位并加载操作系统内核。
这也是为什么启动分区和普通数据分区并不完全相同。前者不仅保存文件系统数据,还承担“把内核带起来”的责任。
6. 交换空间
交换空间可以放在两种地方:
| 形式 | 特点 |
|---|---|
| 文件系统中的特殊文件 | 管理方便,但访问路径更长 |
| 原始分区 | 直接使用块设备,性能更直接 |
交换区往往按块直接使用,数据结构由内存系统管理,因此原始分区是常见选择。