首页/操作系统/04-file/文件系统实现 🔗 在 Obsidian 中打开
操作系统 · 04-file

文件系统实现

重要度 ⭐⭐⭐⭐⭐ 难度 ⭐⭐⭐考查频率 低 操作系统/文件管理磁盘调度FAText4NTFS分配方式
速查
磁盘访问时间 = 寻道时间 + 旋转延迟 + 传输时间,其中寻道时间最耗时,故磁盘调度主要优化寻道。分配方式:连续 / 链接(FAT)/ 索引(ext4)。日志文件系统先写日志再写实际数据以保证崩溃一致性。

速查

项目
核心概念文件系统实现(磁盘结构 + 调度 + 分配 + 目录 + 层次)
关键公式总时间 = 寻道时间 + 旋转延迟 + 传输时间
考查频率⭐⭐⭐⭐

磁盘物理结构与访问时间

  • 组成:盘片、磁道、扇区、柱面;磁头由磁臂驱动移动。
  • 寻址:CHS(柱面-磁头-扇区)或现代 LBA(逻辑块地址)。
  • 访问时间:总时间 = 寻道时间 + 旋转延迟 + 传输时间。
    • 寻道时间:磁头移到目标磁道,最耗时(几 ms)。
    • 旋转延迟:等待目标扇区转到磁头下(平均 = 转一圈 / 2)。
    • 传输时间:读写数据的时间。

文件分配方式

方式随机访问外部碎片文件增长代表
连续困难ISO9660
链接(FAT)慢(FAT 可缓存在内存)容易FAT32
索引容易ext4

索引分配中 inode 的 i_block[] 含直接指针 + 各级间接指针,数据块指针分散在索引块中。

目录实现

方式说明
线性列表简单但查找慢(O(n)),适合小目录
哈希表查找快(O(1)),需处理冲突
B+ 树(HTree)ext4 采用,适合大目录,查找 O(log n)

文件系统层次

从应用到硬件分为多层(见下方交互动画):用户应用程序 → 逻辑文件系统(目录管理、权限检查)→ 文件组织模块(逻辑块→物理块)→ 基本文件系统(发 I/O 请求)→ 设备驱动程序(控制设备控制器)→ 设备控制器(控制硬件)。

常见文件系统对比

文件系统最大文件最大卷特点
ext416TB1EBLinux 默认,日志
NTFS16EB256TBWindows 默认,ACL
FAT324GB8TB兼容性好
XFS8EB8EB高性能大文件
Btrfs16EB16EB快照、压缩

日志文件系统

写操作先记录到日志区,再写入实际位置;崩溃后可从日志重做 / 撤销,保证原子性与一致性。

模式说明性能安全
writeback只记录元数据
ordered元数据 + 数据顺序写
journal元数据和数据都记录

易错点

注意
  • 磁盘访问时间中寻道时间最耗时,调度算法优化的是寻道。
  • FAT 是链接分配的改进,不是独立分配方式。
  • SCAN 到端点反向,C-SCAN 回到起点(不是反向)。
  • ext4 目录用 B+ 树(HTree)索引,不是线性列表。

核心结论

必背
  1. 磁盘访问时间 = 寻道 + 旋转延迟 + 传输,寻道最耗时。
  2. 索引分配(ext4)兼顾随机访问与无外碎片,最灵活。
  3. 文件系统分层:逻辑文件系统 → 文件组织 → 基本文件系统 → 设备驱动 → 硬件。
  4. 日志文件系统通过先写日志保证崩溃一致性。

记忆卡片

磁盘访问时间由哪几部分组成?哪个最耗时?
寻道时间 + 旋转延迟 + 传输时间。寻道时间最耗时(几 ms),调度算法主要优化寻道。
三种文件分配方式各有什么优缺点?
连续:快但有碎片且难扩展;链接:无碎片但只能顺序访问;索引:随机访问且无碎片但有索引开销。
FAT 文件系统原理?
链接分配的改进,将下一簇指针集中存于 FAT 表,FAT 可缓存在内存,支持随机访问。
日志文件系统如何保证崩溃一致性?
写操作先记录到日志,日志提交后再执行实际写入;崩溃后从日志重做或撤销,保证原子性。

交互动画 · 索引节点(inode)磁盘块定位

第 0 步
点击「播放」或「下一步」:逻辑块号 → inode · 索引表 → 物理磁盘块 的逐级定位
块大小 1 KiB、指针 4 B ⇒ 每个索引块存 256 个指针。
inode 的 i_block[] 含 12 个直接指针 + 单级 / 二级 / 三级间接指针,共同实现索引分配下的「逻辑块 → 物理块」映射。

相关知识点

inode-detail filesystem-impl-and-disk-org disk-scheduling-algorithm disk-storage

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。