Back to notebook

操作系统:外存、I/O 与持久化存储基础

This post is not yet available in English. Showing the original version.
Table of Contents
Table of Contents

操作系统课程中的“存储管理”主要聚焦于主存与虚拟内存管理;而外存(持久化存储)则构成了系统长期保存数据、支撑崩溃恢复的基石。本篇系统梳理 I/O 交互、物理磁盘访问模型、RAID 阵列技术以及文件系统崩溃一致性的核心原理,作为操作系统完整知识体系的拓展与深化。


一、操作系统存储体系的三层抽象

操作系统对存储的管理按照抽象层次和物理介质划分为三个主要维度:

讨论层次核心管理单元解决的核心问题关键元数据结构
用户态动态内存C 语言对象、堆内存空闲块堆内存的动态申请(malloc)与释放(free),如何分割与合并空间块头(Chunk Header)、空闲链表、大小类别(Size Classes)
内存虚拟化虚拟页面(VP)、物理页框(PF)进程私有线性地址向物理主存的透明映射,解决地址隔离与主存扩充页表项(PTE)、页目录(PDE)、TLB、存在位与脏位
外存持久化存储文件、索引节点(inode)、磁盘块系统掉电后数据如何持久可靠留存,目录层次组织与故障一致性保证目录项(dentry)、inode、数据块位图、事务日志(Journal)

三者虽在底层空间管理上存在类似的技术手段(如位图与空闲链表),但服务对象和容错边界截然不同:虚拟内存主要对抗有限的物理内存容量,而持久化存储必须能够防御突发断电与硬件崩溃。


二、I/O 硬件交互机制:轮询、中断与 DMA

CPU 与外部设备控制器(如磁盘、网卡)交互时,控制器内部通常暴露出三类基础寄存器:

2.1 交互范式演进与性能对比

flowchart TD
    A["轮询 (Polling)<br>CPU 在忙等死循环中反复查询状态寄存器<br>开销: CPU 占用率 100%"] --> B["中断驱动 (Interrupt-driven)<br>发起 I/O 后进程阻塞,CPU 调度其他任务;完成时硬件发中断<br>优势: 解除 CPU 忙等,实现任务并发"]
    B --> C["直接内存访问 (DMA)<br>专用 DMA 控制器直接接管外设与内存间的数据传输<br>优势: 解放 CPU 逐字节搬运负担,仅在批量完成时触发一次中断"]
交互机制核心工作方式减少的系统开销依然存在的代价适用场景
轮询(Polling)CPU 在死循环中轮询设备状态寄存器直至就绪无中断上下文切换开销严重浪费 CPU 周期,CPU 无法执行其他任务极高速设备(延迟只有几百纳秒)或短等待阶段
中断驱动(Interrupt-driven)发起 I/O 后将当前进程设为阻塞态,CPU 调度其他就绪进程;设备完成后触发硬件中断通知内核消除了长时间的 CPU 忙等中断分派、保存/恢复寄存器上下文开销通用中低速 I/O 操作(键盘、鼠标、普通磁盘)
直接内存访问(DMA)CPU 配置 DMA 控制器(源地址、目标物理地址、传输字节数)后启动传输,数据传输完全由 DMA 芯片硬件接管消除了 CPU 逐字逐块搬运数据的指令开销传输前后需配置总线与缓存一致性维护大数据量高速块设备传输(如磁盘读写、千兆网卡)

[!NOTE]
概念辨析:中断与 DMA 不能互相替代。中断解决的是“何时知晓设备已完成操作”,而 DMA 解决的是“由谁执行数据在主存与外设之间的物理搬运”。在现代系统中,DMA 负责高效搬运整个数据块,搬运完成后通过中断通知 CPU 内核。


三、机械磁盘(HDD)物理模型与访问耗时推导

传统的机械硬盘由高速旋转的磁盘盘片(Platter)和带有读写磁头的机械臂(Arm)构成。其物理寻址单位为扇区(Sector)(通常为 512 字节或 4KB)。

一次完整的磁盘 I/O 访问耗时(TI/OT_{\text{I/O}})由三个连续物理阶段累加构成:

TI/O=Tseek+Trotation+Ttransfer.T_{\text{I/O}} = T_{\text{seek}} + T_{\text{rotation}} + T_{\text{transfer}}.
  1. 寻道时间(Seek Time, TseekT_{\text{seek}}):
    机械臂沿径向移动,将磁头定位到目标同心圆磁道(Track)所需的机械耗时。这是磁盘访问中耗时最长、代价最高的阶段(通常需 3 至 10 毫秒)。
  2. 旋转延迟(Rotational Latency, TrotationT_{\text{rotation}}):
    磁头到达目标磁道后,等待盘片旋转将目标扇区转至磁头正下方的等待时间。
    • 设盘片转速为 RR RPM(Revolutions Per Minute),则盘片旋转一整圈耗时为 60/R60 / R 秒;
    • 平均旋转延迟为半圈耗时:Trotation, avg=12⋅60R 秒T_{\text{rotation, avg}} = \frac{1}{2} \cdot \frac{60}{R} \text{ 秒}。
    • 例如 7200 RPM 磁盘的平均旋转延迟为 607200×2≈4.167 ms\frac{60}{7200 \times 2} \approx 4.167\text{ ms}。
  3. 数据传输时间(Transfer Time, TtransferT_{\text{transfer}}):
    磁头直接扫过目标扇区、读取电磁信号并转换为数字信号的时间。其开销取决于磁盘表面记录密度与旋转线速度,通常仅为微秒量级。

顺序 I/O 与随机 I/O 的性能悬殊分析


四、RAID(独立磁盘冗余阵列)技术

RAID(Redundant Array of Independent Disks)通过将多块独立的物理磁盘组合为单个逻辑块设备,利用并行数据条带化提升吞吐率,并利用镜像或奇偶校验提供容错能力。

设阵列由 NN 块容量均为 BB 的相同物理磁盘构成:

RAID 级别数据组织机制有效存储容量容错能力读写性能特征
RAID 0(条带化 Striping)将连续的数据块按条带大小(Stripe Size)轮流切分并轮转分散在 NN 块盘中N⋅BN \cdot B(100%)无容错。任意一块磁盘物理损坏,全阵列数据损毁并行读写性能最高(接近 NN 倍单盘性能)
RAID 1(镜像 Mirroring)每份数据在主盘和镜像盘上各写入一份完整副本N2⋅B\frac{N}{2} \cdot B(50%)允许任意互为镜像对中的一块盘损坏读性能接近双倍,写性能受限于单盘且开销翻倍
RAID 4(专用校验盘)数据块条带化分布于前 N−1N-1 块盘,第 NN 块盘专门存储前序数据块的按位异或校验和(P=D1⊕⋯⊕DN−1P = D_1 \oplus \dots \oplus D_{N-1})(N−1)⋅B(N - 1) \cdot B允许任意一块磁盘损坏并无损恢复读性能高;但专用校验盘成为所有小写操作的严重并发瓶颈(小写需先读旧数据与旧校验再更新)
RAID 5(分布式奇偶校验)将奇偶校验块均匀循环分布在所有 NN 块磁盘中,消除单一校验盘瓶颈(N−1)⋅B(N - 1) \cdot B允许任意一块磁盘损坏并依靠异或无损恢复读写吞吐均衡,兼顾容量利用率与可靠性,工业界广泛采用

五、文件系统元数据与崩溃一致性(Crash Consistency)

文件系统将数据划分为用户数据块(Data Blocks)与元数据(Metadata):

5.1 崩溃不一致性问题(Crash Inconsistency)

向文件追加写入一个新数据块时,系统必须更新三个不同的磁盘块:

  1. 更新数据块位图(标记新分配的数据块);
  2. 更新文件的 inode(文件大小增加,指针指向新数据块);
  3. 写入实际的新用户数据块。

由于磁盘控制器对不同物理扇区的写入不存在跨扇区原子性,若在上述写操作过程中系统突发掉电或内核崩溃,可能导致严重的不一致状态:

5.2 写前日志技术(Write-Ahead Logging / WAL / Journaling)

现代日志文件系统(如 Linux ext4、XFS)通过引入事务日志(Journal)机制彻底解决崩溃不一致性:

sequenceDiagram
    participant App as 应用程序
    participant FS as 文件系统内核
    participant Journal as 磁盘日志区 (Journal)
    participant Disk as 磁盘正式数据区
    
    App->>FS: write() 追加数据
    FS->>Journal: 1. Journal Write: 写入事务内容 (TxB, 数据与元数据)
    FS->>Journal: 2. Journal Commit: 写入提交标记 (TxE)
    Note over Journal: 事务已提交! 系统保证数据绝对不丢
    FS->>Disk: 3. Checkpointing: 刷回正式磁盘块 (Checkpoint)
    FS->>Journal: 4. Free: 释放该事务日志项
  1. 日志写入阶段(Journal Write):在修改正式文件系统结构前,内核先将待更新的元数据块和事务开始标记(TxB)作为一个整体写入专用的连续日志区域;
  2. 事务提交阶段(Journal Commit):写入一个 512 字节的事务结束块(TxE)。该提交标记成功落盘后,该事务即告正式提交(Committed);
  3. 检查点刷回阶段(Checkpointing):将变更真正写回正式的磁盘数据结构与位图中;
  4. 日志释放阶段(Free):在日志超级块中更新指针,回收日志空间。

崩溃恢复逻辑:
系统重启时,内核直接扫描日志区域:



0 / 2000
Loading comments...