文件系统与磁盘
文件系统把“按名字访问文件”落实为“找到并读写若干磁盘块”。目录、inode、索引块和位图各自保存不同的信息;磁盘调度则决定这些块按什么顺序访问。先知道要经过哪些结构,容量和访盘次数才有依据。
这个板块包含哪些知识
在存储系统图谱中,文件系统位于持久化数据这一侧;向下连接输入输出系统。本页展开以下内容:
- 文件与目录:目录项、FCB / inode、路径解析、打开文件表与硬链接。
- 空间分配:连续、链式、FAT、索引与混合索引;逻辑块号怎样映射到物理块号。
- 空间管理:数据块和 inode 的分配回收、位示图、元数据更新。
- 磁盘组织与访问:扇区、簇、磁道和柱面,调度算法、访问时间、格式化与引导。
沿一次读取来看:先通过目录找到文件,再由元数据找到目标逻辑块对应的盘块,最后发出设备请求。目录查找、索引查找和数据读取是不同环节,哪些已经在内存,要从题设中逐项扣除。
删除、扩展文件还会修改元数据,不能只计算数据块的变化。
常见考点与题型
综合题可能组合下面几类小问。先看要求求什么,再确定需要调用哪些知识。
| 题型 | 题干中的线索 | 解题思路 |
|---|---|---|
| 容量与索引覆盖范围 | 块大小、指针长度、各级索引项数 | 先算每块索引项数,再按各级能覆盖的数据块累计容量 |
| 偏移定位与访盘次数 | 字节偏移、inode 号、缓存条件 | 字节偏移转逻辑块号,画到目标数据块的路径,逐块检查是否需 I/O |
| 结构选型与文件修改 | 随机读、顺序读、插入、增长 | 按定位成本、搬移和元数据更新比较,结合题目约束选择 |
| 位图、链接与删除 | 空间回收、同 inode、目录树 | 分别记录目录项、链接计数、inode 和块的变化;按题设位图约定改位 |
| 磁盘调度与时间 | 请求序列、方向、转速、扇区数 | 先排服务次序和磁头路径,再分项累计寻道、旋转和传输时间 |
| 格式化与引导 | 操作排序、创建哪类结构 | 区分物理格式化、分区、逻辑格式化和启动加载各自的任务 |
解题前要弄清的关系
一、按路径名读取文件的一般过程
路径名 → 目录文件(一个个目录项) → inode / FCB → 数据块号 → 数据块
需要读取的盘块才计入访盘;一个目录可能跨多个块,多条元数据也可能位于同一块,已经缓存的块不重复读取。目录项和 inode 的分工见 目录概念、inode 表、文件元信息。
二、物理结构决定「块号从哪来」,也就决定了一切计算
| 结构 | 块号怎么得到 | 能随机访问吗 | 见 |
|---|---|---|---|
| 连续分配 | 起始块号 + 逻辑块号 | 能 | 连续分配 |
| 链式分配 | 顺着每块末尾的指针走 | 不能 | 链式分配 |
| FAT | 在内存的表里顺着簇号跳 | 仍需沿 FAT 链查找,但表在内存时不必为每一跳读数据块 | 文件分配表 |
| 索引 / 混合索引 | 查索引块 | 能 | 索引分配、混合索引 |
三、空闲空间管理:重点掌握位图计算
位图一位对应一块,所以「位图占多大」= 块数 ÷ 8 字节,见 位图法。其余三种(空闲表法、空闲链表法、成组链接法)也应理解分配与回收机制,本页重点展开位图题。
四、磁盘是独立的一段:先算距离,再算时间
调度算法只数磁头移动的磁道数,见 机械硬盘调度算法;时间四项齐全,见 磁盘性能指标。CHS 换算属于驱动程序的活,见 CHS 地址。
五、格式化与引导是两串固定顺序
制盘:物理格式化(划分扇区) → 分区 → 逻辑格式化(建引导记录、FAT/inode 区、根目录、数据区) → 装操作系统
引导:ROM 引导程序 → 磁盘引导程序 → 分区引导程序 → 操作系统初始化
各类题的解法
前四条围着索引和位图转,最后一条的磁盘部分和它们没有关系,按小问挑着用。
先算「一块能放几个地址项」
这个数(记作 N)是索引类题目的全部起点:
N = 块大小 ÷ 地址项长度
2018#46 与 2022#45 都是 4KB ÷ 4B = 1024。反过来问「索引项至少几字节」,就先由 总容量 ÷ 块大小 得块总数 M,再取 ⌈log₂M / 8⌉ 字节;若有保留编码还需计入——2012#46 由此得 4B。
最大文件长度按级数拆开写
最大长度 = (直接项数 + 一级间接项数×N + 二级间接项数×N² + 三级间接项数×N³) × 块大小
分级写、不要合成一个数,2018#46 的答案就写成 32KB + 4MB + 4GB + 4TB。另外两种结构各有自己的算法:
- 链接分配要扣掉指针:每块可用
块大小 − 指针长度,2014#46 是 1024 − 4 = 1020B,答 4G × 1020B; - FAT 表项位宽给出可编码簇号的上限;最大文件还受实际数据簇数、保留编码和文件长度字段约束,而 FAT 自身长度 = 表项数 × 表项字节,两个别混(2016#47)。
问「用到哪几级索引」就把文件块数夹进前缀和之间:2022#45 的 6MB 是 1536 块,10 + 1024 < 1536 < 10 + 1024 + 1024²,所以用到一级和二级。
访盘次数按路径逐层数
先列需要访问的目录、inode、索引和数据块,再结合缓存条件数次数;修改题将读与写分开记录:
| 场景 | 怎么数 | 出处 |
|---|---|---|
| 连续分配中间插一条记录 | 每搬一条 = 读 1 + 写 1,再加写入新记录 1 次 | 2014#46:29 × 2 + 1 = 59 |
| 链接分配中间插一块 | 顺链找到前驱(只读)+ 写新块 1 + 改前驱指针写回 1 | 2014#46:29 + 2 = 31 |
| 给了字节偏移读一个字节 | 先算逻辑块号,再看它落在第几级索引 | 2026#46:一级间接 1 + 数据块 1 = 2 |
| 目录已在内存 | 只数 inode 所在块 + 数据块 | 2022#45:2 块 |
逻辑块号 = ⌊字节偏移 ÷ 块大小⌋,块内偏移 = 字节偏移 mod 块大小
inode 所在盘块号 = inode 区起始块号 + ⌊inode 号 ÷ (块大小 ÷ inode 大小)⌋
FAT 题还要记住一句:下一簇号存在当前簇号的表项里。2016#47 里簇 106 的号存在 100 号表项中。
删除与回收:分别检查目录项、inode 和块位图
对题设要求递归删除、对象无其他硬链接且不再被打开的场景,按“先删子文件,再删自己”分析。若位图以 1 表示已分配,需要分别处理(2026#46):
- 释放它的数据块(间接索引块本身也要释放),在磁盘位示图里清零;
- 它的 inode 在 inode 位示图里清零;
- 在父目录的数据块里删掉这一条目录项。
位图自身的大小:位图字数 = 块数 ÷ 字长,2010#45 是 16384 ÷ 32 = 512 字 = 2KB,正好装得下。要定位某一块在位图的第几个字第几位,用
所在盘块号 = 起始块号 + ⌊块号 ÷ (每块字节数 × 8)⌋
块内字节号 = ⌊(块号 mod (每块字节数 × 8)) ÷ 8⌋
若要求块内位号,取 块号 mod (每块字节数×8);若已定位字节,要该字节内位号则取 块号 mod 8。两种位号的基准不同,编号起点也要按题设确认。
磁盘时间三段分行写
移动时间 = 移动磁道总数 × 单磁道时间
旋转延迟 = 请求数 × (60 ÷ 转速) ÷ 2
传输时间 = 请求数 × 一转时间 ÷ 每道扇区数
2010#45 的 C-SCAN 走了 170 个磁道,加 4 个请求的 20ms 旋转延迟和 0.4ms 传输,合计 190.4ms。在该题只比较机械寻道优化收益的模型中,换成闪存后可说明:没有寻道和旋转延迟,按磁道距离调度失去原有收益,FCFS 更简单。不能由此推成所有 SSD 场景都应使用 FCFS。
簇号型的调度题要先把当前柱面折算成簇号区间再比距离:2019#44 每柱面 1000 个簇,85 号柱面就是簇 85000~85999。CHS 换算三行:
柱面号 = ⌊簇号 ÷ 每柱面簇数⌋
磁道号 = ⌊(簇号 mod 每柱面簇数) ÷ 每磁道簇数⌋
扇区号 = (柱面内余数 × 每簇扇区数) mod 每磁道扇区数
分配结构选型:按访问方式比较代价
连续分配容易按逻辑块号直接定位,也便于顺序访问,但文件增长可能需要搬移。链式分配便于追加,定位中间块却要沿链寻找;FAT 把链放在表中,表驻内存时减少找链的磁盘 I/O,但没有把链查找变成数组直接索引。索引分配便于定位,代价是索引空间和可能的额外访盘。
插入题先确定移动单位是记录还是整块,再分别列出“查找前驱、搬移旧数据、写新数据、修改元数据”。若允许使用缓存,同一块内的多个修改未必对应多次磁盘写入,应按题设 I/O 模型计数。
硬链接与删除:名字消失不等于数据立即释放
两个目录项指向同一 inode 时,访问的是同一个文件。删除其中一个名字,通常先删目录项并减少链接计数;仍有其他硬链接时,不能把数据块也释放。即使链接计数已为 0,若文件仍被打开,实际回收还可能推迟到最后一次关闭。
因此列修改清单前,要确认题目是否涉及硬链接、打开文件和递归删除,不能对每个目录项都重复释放同一组块。
历年题索引
上面这几条覆盖了绝大多数小问,下面这张表用于按考点选题和对照不同问法。
| 真题 | 主线 | 这一年特别问了什么 |
|---|---|---|
| 2010#45 | 位图管理 + 磁盘调度 | 2KB 内存能不能管 16384 块;C-SCAN 总时间;闪存该用 FCFS |
| 2011#46 | 物理结构选型 + FCB | 一次写入不可改,该选哪种结构;FCB 要加什么字段 |
| 2012#46 | 索引分配的最大文件长度 | 索引项最少几字节;<起始块号, 块数> 混合结构怎么划分最优 |
| 2014#46 | 插入记录的访盘次数 | 插第 30 条各要访盘几次;链接式的最大文件长度 |
| 2016#47 | FAT + 目录文件内容 | 写出目录文件的内容;某簇号存在哪个 FAT 表项里 |
| 2018#46 | 混合索引 + inode 数量 | 最大长度的表达式;能存几个 5600B 的文件 |
| 2019#44 | 磁盘容量 + SSTF + CHS | 簇号转 CHS,以及这个转换由谁完成 |
| 2021#46 | 引导流程 + 磁盘格式化 | 四个操作的正确顺序;扇区划分和根目录各在哪一步 |
| 2022#45 | 目录项 + 硬链接 + 间接索引 | 两个目录项 inode 号相同求块号;6MB 用到哪几级 |
| 2026#46 | inode 定位 + 位示图 + 删目录 | inode 号推盘块号;删一个目录要改哪些元数据 |
2021#46 的第 1 问其实是系统引导,2019#44 的第 3 问跨到组成原理的 CHS 与 I/O 软件层次,两处都在上面的框架第四、五条里。
易错清单
- 链接分配忘了扣指针。每块可用 1020B 而不是 1024B,2014#46 的评分说明写明按 1024 算只给 1 分。
- 访盘次数把读写混算。搬一条记录是 2 次(读 + 写),顺链查找只算读,改指针写回只算 1 次。
- FCB 的变化写不全。2014#46 要求同时点名起始块号和文件长度,少写一项不给分。
- 文件个数只看一个上限。要同时受 inode 总数和数据块数限制、取小者,且文件大小要向上取整成整簇(2018#46)。
- 索引项字节数和索引项个数弄混。前者由磁盘总块数推出,后者由索引表区大小推出(2012#46)。
- 两个目录项 inode 号相同还另算一遍块号。那就是硬链接、同一个文件,块号照抄(2022#45)。
- 位图定位时该要位号却除了 8。除以 8 得到的是字节号。