操作系统第 4 章:文件管理
408 操作系统「文件管理」复习:核心知识点、真题题型、通用解法与易错点。
Last updated on
本章依据本站 408 真题 → 操作系统 → 第 4 章 文件管理 整理,同时对照 408 模拟选择题 → 操作系统 → 第 4 章 文件管理 补充内容。本站也明确建议研究考研命题时采用“真题优先、模拟题补充”的顺序,所以以下会以真题形成主干,再用模拟题补齐 VFS、挂载、目录实现等真题覆盖较少的角落。(Any Docs)
这一章看起来知识点很散,实际上 408 的计算题几乎都围绕一条链:
只要把这条链真正弄懂,第 4 章绝大多数题都会变得机械。
从站内真题看,最重要的命题区域非常明显:文件物理结构与混合索引计算 > 目录/inode/硬软链接 > 文件打开、关闭、删除 > FAT 与位图等空间管理 > 文件系统基础概念。特别是 2010、2012、2014、2015、2016、2018、2022 都出现了很典型的计算或综合题。(Any Docs)
一、先建立整章的核心模型
假设程序执行:
fd = open("/home/a.txt", O_RDONLY);
read(fd, buf, 4096);不要把它想成“直接去磁盘找 a.txt”。
真正发生的大致是:
随后 read():
这也直接解释了 2024 真题:
2024 真题:
open()、read()、write()、close()中,哪个系统调用的实现包含“文件按名查找”?
答案是 open()。
因为 open() 接收路径名,需要逐级查目录;而 read()、write()、close() 已经拿到文件描述符,不再从文件名重新定位文件。(docs.any1.tech)
这是第 4 章极其重要的总纲。
二、文件、FCB 与 inode
1. FCB 到底存什么?
FCB(File Control Block,文件控制块)本质上就是:
操作系统描述和管理一个文件所需要的信息集合。
典型信息包括:
| 类型 | 内容 |
|---|---|
| 基本属性 | 文件大小、类型 |
| 权限 | 谁能读、写、执行 |
| 时间信息 | 创建、修改、访问时间 |
| 地址信息 | 数据块在哪里 |
| 共享信息 | 链接计数等 |
2009 真题
题目核心:
文件访问控制信息最适合存放在哪里? A 文件控制块;B 文件分配表;C 用户口令表;D 注册表。
答案:
因为权限属于文件自身的属性,当然应当跟文件的管理信息放在一起。(docs.any1.tech)
这里一定区分:
而
三、为什么要引入 inode?
如果目录项直接保存完整 FCB:
文件名 + 大小 + 权限 + 时间 + 地址 + ...那么每个目录项非常大。
查目录时,真正首先需要的只是:
没必要把权限、几十个块地址等全部扫一遍。
所以 Unix 类文件系统采用:
然后:
inode 再保存真正的文件属性和数据块地址。
这会让目录项显著变小。
典型模拟题:引入 inode 为什么能加速目录检索?
本站上的竟成模拟题:
磁盘块 512B,FCB 大小 64B,一个目录有 256 个文件。 第一版目录项直接存完整 FCB。 第二版目录项只保存 12B 文件名和 4B inode 号。 求平均查找一个文件要访问多少个磁盘块。
第一版:
一个磁盘块可以装:
个目录项。
256 个文件需要:
块。
顺序查找平均访问:
块。
第二版,一个目录项:
一块可以保存:
项。
所以目录只占:
块。
平均目录查找:
找到 inode 号后还需读 inode:
所以:
这类题真正考的是:
从而让一个磁盘块能装更多目录项。(Any Docs)
四、本章第一超级重点:文件物理结构
408 必须掌握三种:
| 分配方式 | 随机访问 | 文件扩展 | 外部碎片 | 额外指针 |
|---|---|---|---|---|
| 连续分配 | 很好 | 困难 | 有 | 少 |
| 链接分配 | 差 | 很容易 | 无 | 有 |
| 索引分配 | 很好 | 容易 | 无 | 索引块 |
一句话:
五、题型 1:根据需求选择文件分配方式
2009 真题
题目:
哪种文件物理结构既适合随机访问,又容易扩展?
连续分配支持随机访问,却难以扩展。
链接分配容易扩展,却不容易随机访问。
所以:
这其实是一道经典关键词匹配题:
看到:
“随机访问 + 动态增长”
几乎条件反射:
2009 和 2020 真题都考到了这个判断。(docs.any1.tech)
六、连续分配
若文件从物理块 开始,占 个连续块,则:
因此第 个逻辑块对应:
随机访问是:
所以非常快。
但是最大问题是:
后面没空间怎么办?
如果文件需要再增加一块,而末尾正好被其他文件占用,就可能要整体搬迁。
2013 真题:CD-ROM 视频怎么组织最好?
题目:
CD-ROM 中视频文件需要快速随机播放,哪种数据块组织方式性能最好?
答案:
为什么?
因为 CD-ROM 的文件通常写入以后基本不修改,所以“扩展困难”这个缺点不重要。
但连续分配可以:
随机播放和顺序播放都很快。(docs.any1.tech)
这类题千万不要机械背“索引最好”。
要看场景。
七、2011 综合题:什么时候连续分配反而最合适?
题目核心条件:
一级目录;文件数据一次性写入,以后不能修改,但可以不断创建新文件。 问连续、链接、索引哪一种更适合?FCB 需要保存什么?
因为:
一次写完 + 以后不修改
意味着文件长度在创建时就确定。
那么连续分配最大的缺点:
扩展困难
几乎消失。
而它的优势:
顺序访问快 + 随机访问快
全部保留。
因此:
FCB 至少需要保存:
以及
因为第 块:
题目第二问问:
FCB 集中存储好,还是跟每个文件的数据放一起好?
应集中存储。
因为查文件首先查目录/FCB,如果 FCB 分散在整个磁盘:
磁头可能疯狂移动。
集中后:
FCB FCB FCB FCB FCB ...可以显著减少磁盘寻道。(docs.any1.tech)
八、链接分配
链式结构是:
块7 → 块19 → 块4 → 块82 → ...每个磁盘块带一个指向下一块的指针。
优点是:
随便找一个空闲块就能接上。
所以扩展极其方便。
但如果找文件第 1000 块:
1 → 2 → 3 → ... → 1000通常不能直接跳过去。
因此随机访问差。
九、FAT 本质上是“把链表指针集中起来”
普通链接分配:
数据块100:
[data][106]
数据块106:
[data][108]FAT 则把指针拿出来:
FAT[100] = 106
FAT[106] = 108
FAT[108] = EOF数据块本身就不必放链接指针。
于是文件链:
实际上由 FAT 保存。
十、2016 真题:FAT + 目录综合题
这是文件管理非常值得反复做的一道题。
题目给:
簇大小 4KB。 目录项由“文件名 + 第一个簇号”构成。 后续簇号放在 FAT。
file1占簇 100、106、108。file2占簇 200、201、202。dir1的首簇号为 48。 FAT 每项 2B。 问目录内容、FAT 最大长度、最大文件长度、FAT 项以及读第 5000 字节需要访问哪些簇。(Any Docs)
第一问:目录里放什么?
目录项只需要:
所以 dir1 中大致是:
file1 → 100
file2 → 200目录不需要:
file1 → 100,106,108因为后面的链交给 FAT。
第二问:FAT 有多少项?
每项 2B:
能表示:
个簇号。
于是 FAT 最大大小:
最大文件长度
理论上一个文件最多链接:
个簇。
每个簇:
于是:
第三问:FAT 项放什么?
file1:
所以:
这是 FAT 题最容易写反的地方。
不是:
FAT 下标代表:
当前簇号。
FAT 内容代表:
下一簇号。
十一、字节偏移量题的统一方法
假设块大小为 。
如果题目说:
偏移量为
偏移从 0 开始,则逻辑块号:
如果题目说:
第 个字节
第一个字节编号为 1,则:
这两个千万不要混。
例如:
第 5000 个字节,簇大小 4096B
则:
也就是文件的第 2 个簇。
所以刚才 2016 真题中:
第 5000 字节位于:
号簇。若 FAT 已在内存,则不需要为了找 106 再读磁盘上的 FAT。题目给定 dir 已在内存,因此实际还要先读 dir1 的簇 48,再读数据簇 106。(Any Docs)
十二、本章第二超级重点:索引分配
可以把索引分配想象成:
inode
↓
索引表
├── 块47
├── 块18
├── 块99
└── 块6文件的第 个逻辑块:
所以支持随机访问。
十三、混合索引:408 最喜欢考
Unix 风格 inode 通常有:
直接地址
直接地址
...
一级间接
二级间接
三级间接这是整个文件管理章节最需要熟练计算的部分。
十四、混合索引万能公式
假设:
磁盘块大小:
每个块号/指针大小:
那么一个索引块能装:
个块号。
于是一个地址项的寻址能力为:
| 地址方式 | 可指向的数据块数 |
|---|---|
| 直接地址 | |
| 一级间接 | |
| 二级间接 | |
| 三级间接 |
如果 inode 中有 个直接地址、 个一级地址、 个二级地址、 个三级地址:
最大文件长度:
把这个公式吃透,整个第 4 章至少解决一大块计算题。
十五、2010 真题:最大文件长度
题目:
inode 有 7 个地址项:4 个直接、2 个一级间接、1 个二级间接。 地址项 4B。 索引块和数据块均为 256B。 求最大文件长度。
首先:
直接地址:
个数据块。
两个一级间接:
一个二级间接:
所以:
最大文件长度:
所以:
这道题是混合索引计算最标准的母题。(docs.any1.tech)
十六、为什么二级间接是 ?
很多人只是背公式,却不理解。
二级间接:
inode
↓
一级索引块
↓ ↓ ↓ ↓
二级索引块
↓ ↓ ↓ ↓
数据块第一个索引块有:
个指针。
每个指针又指向一个有:
个指针的索引块。
因此总共:
同理三级:
十七、索引题的第二类:判断某个字节使用哪级索引
核心步骤永远是:
十八、2015 真题:磁盘要访问几次?
题目:
inode 中有 10 个直接地址,1 个一级间接,1 个二级间接。 块大小 1KB。 地址项 4B。 inode 已在内存。 分别读取偏移量 1234 和 307400 所在的磁盘块,需要访问磁盘几次?
先算:
直接地址覆盖逻辑块:
一级间接覆盖:
偏移量 1234
逻辑块:
属于直接地址。
inode 已在内存。
所以直接得到数据块号,只需要:
次磁盘访问——读数据块。
偏移量 307400
逻辑块:
300 不属于:
也不属于:
所以进入二级间接。
要访问:
第一级索引块
↓
第二级索引块
↓
数据块因此:
次。
答案:
即 B。(docs.any1.tech)
十九、索引访问次数的速记法
前提:
inode 已在内存。
那么:
| 数据块寻址方式 | 磁盘读取次数 |
|---|---|
| 直接地址 | 1 |
| 一级间接 | 2 |
| 二级间接 | 3 |
| 三级间接 | 4 |
规律:
最后的那个 就是:
真正的数据块。
但要特别注意:
如果 inode 也不在内存,还要再加访问 inode 所在磁盘块的次数。
如果目录也不在内存,还可能继续加目录块。
这就是为什么综合题越来越喜欢问:
“哪些东西已经在内存?”
二十、模拟题进一步巩固“访问次数”
站内竟成模拟六:
inode 有 12 个直接地址,一级、二级、三级各 1 个;块 4KB;指针 4B;inode 已在内存。 读第 9876 字节和第 543210 字节,各访问磁盘多少次?
直接区大小:
9876 落在直接地址范围:
543210 所在逻辑块约为:
一级间接可再容纳:
块,因此第 132 块仍在一级间接范围。
于是:
答案:
和 2015 真题是同一套方法。(Any Docs)
二十一、2018 真题:混合索引综合题
这是这一章很重要的一道综合题。
题目核心:
簇 4KB。 inode 64B。 有 8 个直接地址,一级、二级、三级各 1 个。 每个地址项 4B。 求最大文件长度;再结合 inode 区和数据区容量判断最多能放多少个 5600B 图像文件;最后比较 6KB 文件和 40KB 文件获取最后一个簇号的时间。(docs.any1.tech)
第一问:最大文件长度
一个索引簇可保存:
个地址。
因此:
最大长度:
二十二、这道题第二问考的是“两个瓶颈取最小”
文件系统能放多少文件,不一定只受磁盘数据空间限制。
还可能受:
限制。
每个簇 4KB,一个 inode 64B:
个 inode。
inode 区有:
个簇。
inode 总数:
所以最多创建:
个文件。
5600B 文件需要:
个数据簇。
数据区有 512M 个簇:
因此从数据空间看,可以存:
个文件。
真正上限取:
也就是:
个文件。
这是一个非常重要的模型:
二十三、2018 第三问:为什么 6KB 和 40KB 获取最后一块的速度不同?
8 个直接地址,每簇 4KB。
直接地址最多覆盖:
F1 = 6KB:
所以最后一个簇号直接在 inode 中。
而 F2 = 40KB:
超出的部分已经需要一级间接地址。
所以如果 inode 已在内存:
F1:
F2:
因此:
注意题目问的是:
“获取最后一个簇号”
不一定要求真正读取数据块。
所以一定看清设问。
二十四、2022 真题:目录 + inode + 硬链接 + 混合索引
这道题已经非常接近现在 408 喜欢的综合方式:
块大小 4KB;inode 256B;10 个直接地址,一级、二级、三级各一个;地址 4B。
stu下有course和doc,course下有course1、course2。 题图给出了 inode 号和物理块号。 问目录项内容、某块号 、打开并读取文件需要几个块、6MB 文件需要哪几级间接地址。(Any Docs)
其中一个非常关键的信息:
doc 和 course1 inode 号相同。
因此:
于是它们:
也就:
所以题中:
二十五、2022 第三问:“打开+读入”到底要几次磁盘访问?
题目说:
course目录已经在内存。
因此:
不需要磁盘访问。
从目录可以得到:
接下来 inode 还没在内存。
所以先读取:
一次。
然后通过 inode 得到数据块号 30。
再读取:
一次。
合计:
这就是为什么做“访问次数题”时,第一步绝对不是计算,而是先列:
目录:内存 / 磁盘?
inode:内存 / 磁盘?
索引块:内存 / 磁盘?
数据块:内存 / 磁盘?
FAT:内存 / 磁盘?二十六、2022 第四问:6MB 文件要用哪一级索引?
文件块数:
10 个直接地址:
一级间接能力:
所以直接 + 一级:
但:
因此一级还不够。
剩余:
需要二级间接。
于是:
三级不需要。
这类题千万不要看到“6MB 很大”就直接猜二级或三级。
一定计算边界:
依次比较。
二十七、2012 真题:块号字段要多少位?
这一题很重要,因为它把计组里的“地址位数”思想拉到了文件系统。
题目:
文件系统最大容量 4TB。 块大小 1KB。 FCB 有 512B 索引表区。 若全部采用直接索引,块号至少需要多少字节?最大文件多长?(docs.any1.tech)
磁盘总块数:
因此块号至少需要:
即:
512B 索引区最多存:
个块号。
最大文件:
即:
二十八、块号位数的统一公式
磁盘/分区容量:
块大小:
块数:
块号所需位数至少:
如果题目按字节保存,则还需:
字节。
这个套路还会和 FAT 表项位数结合。
二十九、模拟题:FAT 位数字段综合
本站竟成模拟七:
块大小 4KB。 FAT 表项 32 位,其中 1 位表示已占用,1 位表示损坏,其余表示块号。 求最大分区容量以及 4GB 分区的 FAT 大小。
块号字段:
所以最大:
个块。
每块:
最大分区:
对于 4GB 分区:
个块。
每 FAT 项:
所以 FAT:
答案:
这其实和 2012 真题本质完全一样:
(Any Docs)
三十、连续分配 vs 链接分配的“插入”综合题
2014 真题
题目:
文件 F 有 200 条记录,每块放 1 条记录。 要在第 30 条位置插入新记录。 分别讨论连续分配和链接分配。(docs.any1.tech)
这题非常有区分度。
连续分配
原来:
1 2 3 ... 29 30 ... 200现在想:
1 2 ... 29 NEW 30 ... 200如果向后移动:
数量很多。
但题目说明:
文件前后都有足够空闲磁盘空间。
于是可以更聪明:
把前面的 1~29 条整体向前移动一块:
[空] 1 2 ... 29 30 ...
↓
1 2 ... 29 [空] 30 ...只移动:
条记录。
每条需要:
所以:
再把新记录写入:
总共:
次磁盘块访问。
这是典型的:
“最少”访问次数
看到“最少”,一定比较:
和
谁少。
三十一、连续分配插入后 FCB 怎么变?
因为整个文件向前扩了一块:
同时新增一条记录:
可能还有:
三十二、链接分配插入
链表:
1 → 2 → ... → 29 → 30 → ...需要插入:
29 → NEW → 30首先从头找第 29 块,需要读:
个磁盘块。
然后:
修改第 29 块的指针并写回:
写入新块:
总计:
次。
这道题很好地说明:
链接分配插入/扩展方便,但定位中间位置很慢。
三十三、链接分配中“真正可存数据的大小”
2014 真题又问:
每个块 1KB,其中 4B 保存链接指针。
那么每个块真正用于文件内容:
如果指针 4B,可以表示:
个块号。
理论最大数据量:
这里和 FAT 很不同。
普通链式分配的指针存在数据块里面,会占数据空间。
而 FAT 把指针统一搬到了 FAT 中,因此一个数据簇通常无需为链指针额外扣 4B。
三十四、目录:本质上就是特殊文件
目录真正做的事情:
Unix:
所以:
stu/
course → inode 2
doc → inode 10这就是一个目录文件的核心内容。
三十五、目录结构为什么需要多级?
早期:
所有文件都放在根目录那么不能方便地允许:
张三/report.txt
李四/report.txt因为同一个目录里不能有同名目录项。
多级目录后:
/home/zhang/report.txt
/home/li/report.txt路径不同即可。
站内模拟题也直接考:
不同文件可能同名,通常依靠什么保证按名存取不冲突?
答案:
(Any Docs)
三十六、绝对路径与相对路径
绝对路径从根开始:
/home/user/docs/a.txt相对路径从当前工作目录开始:
docs/a.txt因此“当前工作目录”的作用主要是:
缩短路径解析,减少每次都从根目录重新逐级查找。
2010 真题
题目:
设置当前工作目录的主要目的是什么?
答案:
而不是:
加快磁盘数据块本身的读写速度。
这是一个经典陷阱。(Any Docs)
三十七、本章第三超级重点:硬链接和软链接
这是选择题非常爱考的部分。
先记住最核心区别:
| 特征 | 硬链接 | 软链接 |
|---|---|---|
| 是否共享 inode | 是 | 否 |
| 是否是独立文件 | 否,本质是新目录项 | 是 |
| 保存什么 | 同一个 inode 号 | 目标路径 |
| 删除原文件名后 | 仍可访问 | 可能失效 |
| 是否影响目标硬链接计数 | 是 | 否 |
| 通常能否跨文件系统 | 否 | 可以 |
| 目标移动后 | 仍正常 | 可能失效 |
三十八、硬链接本质是什么?
原来:
F1 → inode 100创建硬链接 F3:
F1 → inode 100
F3 → inode 100所以:
链接计数:
删除 F1 后:
F3 → inode 100计数:
文件仍然存在。
三十九、软链接本质是什么?
创建软链接 F2:
F2 → inode 200
↓
保存 "F1" 路径它自己就是一个独立文件。
所以:
访问 F2:
如果 F1 被删除:
F2 → "F1"
↓
不存在于是 F2 成为:
四十、2009 真题:硬软链接引用计数
题目:
F1 当前引用计数为 1。 先建立 F1 的符号链接 F2,再建立硬链接 F3,最后删除 F1。 问 F2 和 F3 的引用计数。
创建软链接 F2:
F2 是独立文件:
目标 F1:
不变。
创建硬链接 F3:
删除目录项 F1:
留下 F3。
所以:
(Any Docs)
四十一、硬链接计数 ≠ 打开次数
这是大坑。
inode 中硬链接计数描述的是:
不是:
站内王道模拟题也专门考了这个区别。(Any Docs)
例如:
a.txt → inode 10
b.txt → inode 10即:
即使一个进程都没打开。
反之,一个文件只有一个名字:
但可能被 50 个进程打开。
四十二、2017 真题:两个硬链接分别被打开
题目:
f2 是 f1 的硬链接。 两个进程分别打开 f1、f2,获得 fd1、fd2。 判断: I 两者读写指针始终相同; II 共享同一个内存 inode; III fd1、fd2 各自指向各进程自己的打开文件表项。
结论:
为什么 I 错?
硬链接意味着:
但两个进程分别调用 open() 时,通常可以建立独立的打开文件表项。
因此:
P1 fd1 → open-file-entry A → inode100
offset=100
P2 fd2 → open-file-entry B → inode100
offset=900所以:
(Any Docs)
四十三、打开文件表是这一章另一个关键结构
可以用三层理解:
进程
|
fd
↓
进程打开文件表
|
↓
系统打开文件表
|
↓
内存 inode
|
↓
磁盘 inode / 数据块考试里经常问:
某项应该保存在哪里?
大致可这样区分:
| 信息 | 常见位置 |
|---|---|
| 文件名 | 目录项 |
| inode 号 | 目录项 |
| 文件权限 | inode/FCB |
| 数据块地址 | inode/FCB |
| 硬链接计数 | inode |
| 文件描述符 fd | 进程打开文件表 |
| 当前读写偏移 | 打开文件表 |
| 当前打开引用 | 内存运行时结构 |
四十四、2020 真题:多个进程共享同一文件
题目:
多个进程共享文件 F,哪项正确?
站内答案:
系统打开文件表中有包含 F 属性的共享表项。
这题主要想考:
进程自己的 fd 可以不同,但底层可以关联到共享的文件管理结构。只有当相应引用全部结束后,系统才回收对应内存结构。(docs.any1.tech)
四十五、open 到底做什么?
2014 真题
题目:
一个文件首次被用户进程打开时,操作系统需要做什么?
答案:
不是:
把整个文件读入内存。
这是非常重要的区别:
一般是:
open:
路径查找
→ 找 inode
→ 权限检查
→ 建打开文件表
→ 返回 fd之后:
read:
fd
→ 找打开文件表
→ 根据偏移量定位数据
→ 读取数据四十六、2012 真题:read 系统调用
题目:
用户进程通过
read读取磁盘文件。判断: I 数据不在内存时,进程可能进入睡眠/阻塞; IIread会使 CPU 从用户态进入核心态; IIIread参数需要包含文件名。
答案:
III 错。
典型形式:
read(fd, buf, count);核心参数是:
而不是文件名。
文件名在:
阶段已经解析了。(docs.any1.tech)
四十七、close 和 delete 千万不要混
这两个在 408 极爱做陷阱。
close(file)
含义:
这个进程不再打开文件。
可能:
但不会:
不会:
不会:
不会:
delete/unlink(file)
含义:
删除一个目录项/名字。
可能导致:
只有在合适条件下,最终才回收:
以及:
四十八、2023 真题:关闭文件
题目:
文件 F 只被进程 P 打开。P 关闭 F 时,文件系统需要完成什么?
答案:
不会:
不会:
也不会:
因为:
四十九、2013 / 2021 真题:删除文件
2013 真题问:
删除某文件时,系统不可能因为这个操作而执行什么?
答案是:
删除一个文件:
dir/
├── a
├── b
└── c删除 a:
dir/
├── b
└── c当然不能把 dir 整个删了。(docs.any1.tech)
2021 真题则问:
删除
dir/file1时,内核不必完成什么?
答案是:
因为符号链接是独立文件。
删除目标:
file1 ×
link → file1链接可以留下,只不过变成悬空链接。(Any Docs)
五十、文件数量上限题
这是另一个看起来简单但很容易被文件名字段骗到的题。
2020 真题
题目:
目录项 64B,其中 inode 号 4B,文件名 60B。文件名由小写字母组成。问文件系统最多可以创建多少个文件?
inode 号是:
所以最多表示:
个不同 inode 编号。
所以理论文件数量上限:
不是看 60B 文件名能组合多少字符串。(docs.any1.tech)
看到:
“最多有多少文件?”
优先检查:
看到:
“单个文件最大多长?”
才去看:
这两个经常故意混淆。
五十一、本章第四超级重点:空闲磁盘空间管理
常见方法:
| 方法 | 核心思想 |
|---|---|
| 空闲表 | 记录空闲区起点和长度 |
| 空闲链表 | 空闲块串起来 |
| 位图 | 每块对应 1 bit |
| 成组链接 | 空闲块分组组织 |
408 最爱计算:
五十二、位图万能公式
如果磁盘容量:
块大小:
则磁盘块数:
每块对应 1 bit,所以位图:
换成字节:
如果问位图本身占几个磁盘块:
注意这里第二个 是每磁盘块的字节数。
五十三、2014 真题:10GB 磁盘位图多大?
题目:
分区 10GB,簇 4KB,每簇用 1 bit 表示是否分配。位图需要几个簇?
簇数:
位图:
换成字节:
即:
每簇:
需要:
所以:
个簇。(Any Docs)
五十四、位图定位题:整除 + 取余
这是必须做到秒杀的。
若位图每行 位,物理块号为 :
模拟题
本站竟成模拟六:
位图 1024 行、32 列,编号均从 0 开始。块号 4567 对应哪行哪列?
所以:
(Any Docs)
五十五、2015 真题:位图还跨磁盘块怎么办?
题目:
位图存放于磁盘 32~127 号块。 每块 1024B。 要释放磁盘块 409612。 问对应位位于位图哪个磁盘块、块内哪个字节。
一个位图磁盘块:
位。
因此:
说明对应位在:
位图的第 50 个块。
但位图从磁盘块 32 开始,所以实际块号:
余数 12 表示位图块里的第 12 bit。
所在字节:
所以:
这类题统一拆成三级:
(Any Docs)
五十六、2024 真题:哪个空闲空间管理结构大小固定?
题目:
文件系统需要占外存记录空闲块位置。位图、空闲表、成组链接、空闲链表中,哪个结构占用空间大小与当前空闲块数量无关?
答案:
因为磁盘有 个块:
无论现在空:
块,还是:
块,位图长度不变。(Any Docs)
五十七、簇、块、扇区不要混
这是本章另一个常见陷阱。
可以简单理解:
例如题目:
扇区 512B,簇 1KB,文件 1026B。
虽然 1026B 只比 1KB 多 2B,也不能分 1026B。
最小分配单位是:
所以需要:
个簇。
实际占:
这是 2017 真题。(Any Docs)
五十八、内部碎片也可能在文件系统出现
假设:
文件:
需要:
簇。
实际分配:
浪费:
这种最后一个簇未用满的空间就是空间浪费。
因此簇越大:
优点是 FAT 项数减少、管理开销降低;
缺点则是小文件可能浪费更多空间。
站内王道模拟题也专门考察了:
所以簇越大:
两者是反比关系。(Any Docs)
五十九、文件访问速度优化
2018 真题
题目给出:
I 提前读 II 给文件分配连续簇 III 延迟写 IV 磁盘高速缓存
问哪些可以提高文件访问速度。
答案:
四个都可以。(docs.any1.tech)
理解如下。
提前读利用:
连续簇降低:
延迟写:
多次修改先在缓存中合并,减少频繁磁盘写。
高速缓存:
命中后甚至无需访问真实磁盘。
六十、文件系统布局
这一部分真题相对少,但模拟题可以补足。
一个典型文件系统分区可以粗略画成:
+------------------+
| 引导块 |
+------------------+
| 超级块 |
+------------------+
| inode 位图 |
+------------------+
| 数据块位图 |
+------------------+
| inode 区 |
+------------------+
| 文件数据区 |
+------------------+其中超级块保存全局信息,例如:
文件系统大小、块大小、空闲块信息、inode 信息等。
六十一、物理格式化、分区、逻辑格式化
模拟题问:
文件系统全局信息第一次写入磁盘发生在哪一步?
答案:
因为逻辑格式化就是:
此时才真正建立:
超级块
根目录
空闲空间结构
inode结构
...而物理格式化更偏向底层磁盘扇区结构。(Any Docs)
六十二、VFS:模拟题补充,但很适合未来真题
本站王道模拟题:
VFS 的主要作用是什么?
答案:
例如:
应用程序
↓
open/read/write
↓
VFS
┌────┬────┬────┐
EXT4 NTFS FAT32 ...程序只看到:
open()
read()
write()
close()不需要知道底层到底是:
EXT4
NTFS
FAT32VFS 不负责取代具体文件系统。
具体的:
块怎么分、inode 怎么存、目录怎么组织
仍由实际文件系统负责。(Any Docs)
这类概念未来完全有资格进入 408 选择题。
六十三、文件系统挂载
模拟题:
一个光盘文件系统内部有
/usr/bin/vim,把这个光盘挂载在/media/disk,那么统一目录树里 vim 的路径是什么?
挂载相当于:
光盘根 /接到:
/media/disk因此:
(Any Docs)
理解挂载最好不要死背,而是想象:
原系统:
/
├── home
├── usr
└── media
└── disk ← 挂载点另一个文件系统:
/
└── usr
└── bin
└── vim挂进去:
/
└── media
└── disk
└── usr
└── bin
└── vim六十四、综合题真正的万能解题顺序
以后遇到文件管理大题,可以按照下面这条链分析,这是本章最值得记住的一套方法:
- 确定空间单位:扇区、磁盘块还是簇。
- 统一单位:KB、MB、GB 尽量写成 。
- 确定逻辑块号:偏移量用除法。
- 判断文件组织方式:连续、链接、FAT、索引。
- 若为索引,先算:
- 再画寻址范围:
- 判断目标块属于直接/一级/二级/三级。
- 如果问磁盘访问次数,列出哪些已经在内存。
- 如果涉及路径,再加目录访问。
- 如果涉及打开文件,再区分:
这是建议做这章题时始终写在草稿纸上的唯一一张“流程图”。
六十五、最容易失分的几个坑
这里集中列出:
- 偏移量 通常从 0 起:
而“第 字节”通常:
- inode 已在内存时,直接索引访问数据仍要读数据块,因此不是 0 次,而是:
- 二级索引不是读 2 次,而通常是:
- FAT 中:
表示的是:
第 簇之后的下一簇号。
- 硬链接:
软链接:
-
inode 的链接计数是硬链接数,不是打开次数。
-
close():
open():
-
文件最大长度看索引能力;文件总数量看 inode/FCB 数量,二者不要混。
-
位图大小由:
决定,不由当前空闲块数决定。
六十六、考场上建议直接背下来的 6 个公式
第一,块数:
第二,偏移对应逻辑块:
第三,索引块地址数:
第四,混合索引最大数据块数:
第五,最大文件长度:
第六,位图:
只要这 6 个公式熟练,再加硬链接/软链接与打开文件表概念,这章基本就稳定了。
六十七、按真题价值给这一章分层
结合站内真题和模拟题,建议复习优先级这样看:
| 优先级 | 题型 | 典型题 |
|---|---|---|
| ★★★★★ | 混合索引最大文件长度 | 2010、2018 |
| ★★★★★ | 偏移量→索引级数→磁盘访问次数 | 2015、2018、2022 |
| ★★★★★ | 目录 + inode + 数据块综合追踪 | 2016、2022 |
| ★★★★☆ | 连续/链接/索引比较 | 2009、2011、2013、2014、2020 |
| ★★★★☆ | 硬链接、软链接 | 2009、2017、2022 |
| ★★★★☆ | open/read/close/delete | 2012、2014、2020、2023、2024 |
| ★★★★☆ | 位图计算 | 2014、2015、2024 |
| ★★★☆☆ | FCB/inode 基础 | 2009、2013、2020 |
| ★★★☆☆ | FAT | 2016、2019 |
| ★★☆☆☆ | VFS、挂载 | 当前主要见模拟题 |
从命题趋势看,最值得警惕的是跨知识点综合:2022 真题已经不是单独问“inode 是什么”,而是把 目录项、inode、硬链接、磁盘访问次数、混合索引 一次塞在一道题里。(Any Docs)
六十八、可能出现的新变式
一种很有价值的预测题是:
某文件系统块大小 4KB,inode 有 12 个直接地址、1 个一级间接、1 个二级间接,每个地址项 4B。目录
/a/b已在内存,但目标文件 inode 不在内存。现在读取该文件第 5MB 处的 1B 数据,问至少访问多少个磁盘块。
这种题会一次考:
解题时:
直接容量:
一级间接容量:
所以直接 + 一级只能覆盖:
5MB 已经进入二级间接。
若目录已在内存、inode 不在内存,则至少需要:
次读 inode 所在块,
次读二级间接的两层索引块,
以及:
次读真正数据块。
总共:
这种题非常符合 408 现在把多个知识点结合起来考的风格。
六十九、整章最后压缩成一张知识地图
复习第 4 章时,建议在脑中保留下面这棵知识树:
文件管理
│
├─ 文件是什么
│ ├─ 逻辑结构
│ ├─ FCB
│ └─ inode
│
├─ 文件放在哪里
│ ├─ 连续分配
│ ├─ 链接分配
│ │ └─ FAT
│ └─ 索引分配
│ ├─ 直接
│ ├─ 一级
│ ├─ 二级
│ └─ 三级
│
├─ 文件怎么找到
│ ├─ 目录
│ ├─ 路径
│ ├─ 当前工作目录
│ └─ inode号
│
├─ 文件怎么共享
│ ├─ 硬链接
│ └─ 软链接
│
├─ 文件怎么操作
│ ├─ open
│ ├─ read/write
│ ├─ close
│ └─ delete/unlink
│
├─ 空闲块怎么管
│ ├─ 位图
│ ├─ 空闲表
│ ├─ 空闲链
│ └─ 成组链接
│
└─ 文件系统整体
├─ 超级块
├─ inode区
├─ 数据区
├─ VFS
└─ 挂载其中真正需要做到“看到题马上会算”的,是这一条:
这就是操作系统第 4 章文件管理最核心的解题主线。真题里 2010、2015、2018、2022 基本已经把这条链从基础到综合完整考了一遍,而 2016 的 FAT 综合题和 2014 的连续/链接插入题,则负责覆盖另外两类重要的文件物理组织问题。(Any Docs)
如果按照冲刺复习价值排序,2010 → 2015 → 2016 → 2018 → 2022 这五组题尤其建议全部做到能脱离答案独立推导。