考研学习
解题方法操作系统

操作系统第 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
→ 找打开文件表
→ 根据偏移量定位数据
→ 读取数据

(docs.any1.tech)


四十六、2012 真题:read 系统调用

题目:

用户进程通过 read 读取磁盘文件。判断: I 数据不在内存时,进程可能进入睡眠/阻塞; II read 会使 CPU 从用户态进入核心态; III read 参数需要包含文件名。

答案:

III 错。

典型形式:

read(fd, buf, count);

核心参数是:

而不是文件名。

文件名在:

阶段已经解析了。(docs.any1.tech)


四十七、close 和 delete 千万不要混

这两个在 408 极爱做陷阱。

close(file)

含义:

这个进程不再打开文件。

可能:

但不会:

不会:

不会:

不会:


delete/unlink(file)

含义:

删除一个目录项/名字。

可能导致:

只有在合适条件下,最终才回收:

以及:


四十八、2023 真题:关闭文件

题目:

文件 F 只被进程 P 打开。P 关闭 F 时,文件系统需要完成什么?

答案:

不会:

不会:

也不会:

因为:

(docs.any1.tech)


四十九、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
FAT32

VFS 不负责取代具体文件系统。

具体的:

块怎么分、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

六十四、综合题真正的万能解题顺序

以后遇到文件管理大题,可以按照下面这条链分析,这是本章最值得记住的一套方法:

  1. 确定空间单位:扇区、磁盘块还是簇。
  2. 统一单位:KB、MB、GB 尽量写成 。
  3. 确定逻辑块号:偏移量用除法。
  4. 判断文件组织方式:连续、链接、FAT、索引。
  5. 若为索引,先算:
  1. 再画寻址范围:
  1. 判断目标块属于直接/一级/二级/三级。
  2. 如果问磁盘访问次数,列出哪些已经在内存。
  3. 如果涉及路径,再加目录访问。
  4. 如果涉及打开文件,再区分:

这是建议做这章题时始终写在草稿纸上的唯一一张“流程图”。


六十五、最容易失分的几个坑

这里集中列出:

  • 偏移量 通常从 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/delete2012、2014、2020、2023、2024
★★★★☆位图计算2014、2015、2024
★★★☆☆FCB/inode 基础2009、2013、2020
★★★☆☆FAT2016、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 这五组题尤其建议全部做到能脱离答案独立推导。

On this page

一、先建立整章的核心模型二、文件、FCB 与 inode1. FCB 到底存什么?2009 真题三、为什么要引入 inode?典型模拟题:引入 inode 为什么能加速目录检索?四、本章第一超级重点:文件物理结构五、题型 1:根据需求选择文件分配方式2009 真题六、连续分配2013 真题:CD-ROM 视频怎么组织最好?七、2011 综合题:什么时候连续分配反而最合适?八、链接分配九、FAT 本质上是“把链表指针集中起来”十、2016 真题:FAT + 目录综合题第一问:目录里放什么?第二问:FAT 有多少项?最大文件长度第三问:FAT 项放什么?十一、字节偏移量题的统一方法十二、本章第二超级重点:索引分配十三、混合索引:408 最喜欢考十四、混合索引万能公式十五、2010 真题:最大文件长度十六、为什么二级间接是 ?十七、索引题的第二类:判断某个字节使用哪级索引十八、2015 真题:磁盘要访问几次?偏移量 1234偏移量 307400十九、索引访问次数的速记法二十、模拟题进一步巩固“访问次数”二十一、2018 真题:混合索引综合题第一问:最大文件长度二十二、这道题第二问考的是“两个瓶颈取最小”二十三、2018 第三问:为什么 6KB 和 40KB 获取最后一块的速度不同?二十四、2022 真题:目录 + inode + 硬链接 + 混合索引二十五、2022 第三问:“打开+读入”到底要几次磁盘访问?二十六、2022 第四问:6MB 文件要用哪一级索引?二十七、2012 真题:块号字段要多少位?二十八、块号位数的统一公式二十九、模拟题:FAT 位数字段综合三十、连续分配 vs 链接分配的“插入”综合题2014 真题连续分配三十一、连续分配插入后 FCB 怎么变?三十二、链接分配插入三十三、链接分配中“真正可存数据的大小”三十四、目录:本质上就是特殊文件三十五、目录结构为什么需要多级?三十六、绝对路径与相对路径2010 真题三十七、本章第三超级重点:硬链接和软链接三十八、硬链接本质是什么?三十九、软链接本质是什么?四十、2009 真题:硬软链接引用计数四十一、硬链接计数 ≠ 打开次数四十二、2017 真题:两个硬链接分别被打开四十三、打开文件表是这一章另一个关键结构四十四、2020 真题:多个进程共享同一文件四十五、open 到底做什么?2014 真题四十六、2012 真题:read 系统调用四十七、close 和 delete 千万不要混close(file)delete/unlink(file)四十八、2023 真题:关闭文件四十九、2013 / 2021 真题:删除文件五十、文件数量上限题2020 真题五十一、本章第四超级重点:空闲磁盘空间管理五十二、位图万能公式五十三、2014 真题:10GB 磁盘位图多大?五十四、位图定位题:整除 + 取余模拟题五十五、2015 真题:位图还跨磁盘块怎么办?五十六、2024 真题:哪个空闲空间管理结构大小固定?五十七、簇、块、扇区不要混五十八、内部碎片也可能在文件系统出现五十九、文件访问速度优化2018 真题六十、文件系统布局六十一、物理格式化、分区、逻辑格式化六十二、VFS:模拟题补充,但很适合未来真题六十三、文件系统挂载六十四、综合题真正的万能解题顺序六十五、最容易失分的几个坑六十六、考场上建议直接背下来的 6 个公式六十七、按真题价值给这一章分层六十八、可能出现的新变式六十九、整章最后压缩成一张知识地图