第 4 章 文件管理
本章地位:文件管理是 408 操作系统的「半壁江山」——几乎每年 3~5 道选择题,且大题(混合索引最大文件、位示图互算、文件访问流程)反复从本章出。主线只有两条:① 用户眼里的文件(逻辑结构、目录、按名存取)→ ② 磁盘上的文件(物理结构、空闲空间、按块存取)。把「逻辑块号 → 物理块号」这条转换链吃透,本章就通了。所有计算(混合索引、位示图、FAT、目录瘦身)均代具体数值逐步验证。
| 考点 | 常考题型 | 热度 | 掌握标准 |
|---|---|---|---|
| 文件的逻辑结构(顺序/索引/散列) | 选择题 | ★★★ | 辨析串结构与顺序结构、ISAM/VSAM 概念 |
| FCB、索引结点与目录结构 | 选择题 | ★★★★ | 说清目录项瘦身为何减少启动磁盘 IO |
| 物理结构:连续/链接/索引 | 选择 + 大题 | ★★★★★ 必考 | 三种分配全对比;FAT 大小、隐式链接 IO 次数会算 |
| Unix 混合索引 | 大题 | ★★★★★ 必考 | 块 4KB 指针 4B:48KB+4MB+4GB+4TB 逐级推导 |
| 存储空间管理(位示图/成组链接) | 选择 + 大题 | ★★★★ | 字号-位号-盘块号双向互算,成组链接分配回收流程 |
| open/read 流程与文件共享保护 | 选择题 | ★★★★ | 两张打开文件表、fd、硬链接 count 语义 |
4.1 文件与文件系统
4.1.1 文件的属性与分类
判断正误:(1) 文件名是文件系统内部唯一识别文件的依据;(2) 流式文件是无结构文件;(3) 按保护级别文件可分为只读、读写、可执行和无保护文件。
查看答案
(1) 错:文件名供用户使用且可能重名(不同目录下),系统内部靠标识符/文件 ID(如 inode 号)唯一识别;FCB 中同时记录两者。
(2) 对:流式文件按字节流组织、无记录边界,属无结构文件。
(3) 对:这是按保护级别的标准分类。
4.1.2 文件系统功能与层次结构
② 目录检索发生在第 ② 层,因此 open 之后 read 不再查目录(FCB 已在内存打开文件表中);
③ 分配空闲块(第 ⑥ 层)发生在写文件需要新块时,读文件不经过第 ⑥ 层。
4.2 文件的逻辑结构 高频考点
4.2.1 顺序文件:串结构与顺序结构
串结构:记录间顺序与关键字无关(按存入时间先后排列);顺序结构:所有记录按关键字有序排列。
两种结构的最大区别在检索:串结构只能从头到尾逐条比较;顺序结构可利用关键字有序做二分检索(要求定长记录且可随机访问)。
4.2.2 索引文件与索引顺序文件
ISAM(索引顺序存取方法):为磁盘设计的静态三级索引——主索引 → 柱面索引 → 磁道索引,数据按磁道存放,为插入操作预留溢出区(磁道满则进溢出区)。索引结构固定,文件增长后溢出链变长、性能下降,需定期重组。
VSAM(虚拟存储存取方法):采用B+ 树动态索引,无需溢出区,通过叶子结点的顺序集支持随机与顺序存取,文件可动态增长/收缩。
某文件共有 10000 条定长记录。(1) 若为顺序文件(顺序结构),平均检索一条记录要比较多少次?(2) 若改为索引顺序文件,分成 100 组、每组 100 条,先查组索引再在组内顺序找,平均比较多少次?
查看解答
(1) 顺序检索平均比较 \(\frac{N}{2}=\frac{10000}{2}=5000\) 次。
(2) 组索引 100 条平均比较 \(\frac{100}{2}=50\) 次;组内 100 条平均再比较 \(50\) 次,共 \[ \frac{\sqrt{N}}{2}+\frac{\sqrt{N}}{2}=\sqrt{N}=100 \text{(次)} \]
效率提升 \(5000\div100=50\) 倍。一般结论:\(N\) 条记录分 \(\sqrt N\) 组、每组 \(\sqrt N\) 条时平均比较次数为 \(\sqrt N\)——这就是「分组取平方根」的经典结论。
套路总结:看到「索引顺序文件平均查找次数」,直接想 \(\sqrt N\);若再问最多次数,则是 \(\sqrt N+\sqrt N=2\sqrt N\)(每组都查到末条)。
4.2.3 直接文件与散列文件
关于文件逻辑结构,判断正误:(1) 索引文件能为变长记录文件实现随机存取;(2) 顺序文件的串结构支持二分查找;(3) 散列文件支持顺序存取。
查看答案
(1) 对:索引表本身是定长且有序的,先折半查索引表再按指针直达记录。
(2) 错:串结构记录无序,二分查找失效;只有顺序结构(关键字有序)且定长记录可随机定位时才能二分。
(3) 错:散列地址无序,只能按 key 点查,不支持顺序存取和范围查找。
4.3 文件目录
4.3.1 FCB、索引结点与目录瘦身
① 磁盘 inode(静态):文件大小、所有者、权限、时间、链接计数 count、地址索引项(直接/间接地址);
② 内存 inode(动态):打开文件时把磁盘 inode 复制进内存,另加:状态标志、引用计数、所属文件系统挂载点等动态信息。
瘦身的收益:目录项变小 → 一个盘块装下更多目录项 → 检索目录需读入的盘块数减少 → 启动磁盘(IO)次数减少。
某目录文件中共有 256 个目录项,盘块大小 1KB。(1) 若目录项为完整 FCB,占 128B;(2) 若瘦身为「文件名 + inode 号」,占 32B。分别求检索一个文件平均需要启动磁盘多少次(假设目录信息不在内存)。
查看解答
(1) 每块容纳 \(\frac{1024}{128}=8\) 个 FCB,256 个目录项共占 \(\frac{256}{8}=32\) 块。目标目录项均匀落在第 1~32 块,平均需读入 \(\frac{1+32}{2}=16.5\) 块,即平均约 17 次启动磁盘(按块依次读入查找)。
(2) 每块容纳 \(\frac{1024}{32}=32\) 个目录项,共占 \(\frac{256}{32}=8\) 块,平均读入 \(\frac{1+8}{2}=4.5\) 块 ≈ 5 次启动磁盘。
瘦身后平均检索 IO 从 16.5 次降到 4.5 次,减少约 73%。找到目录项后还要再启动一次磁盘读 inode(若 inode 不在内存),但总数仍远小于 (1)——这就是 Unix 引入 inode 的动机。
易错:目录项数 ÷ 每块目录项数 = 目录文件块数;「平均」按 \(\frac{\text{首块}+\text{末块}}{2}\) 计,若题目问「最多」就是全部块数。
4.3.2 目录结构:单级 → 两级 → 树形 → 无环图
- 单级目录:整个系统一张目录表。实现简单,但不允许重名、查找慢、无法实现共享——只适合单用户。
- 两级目录:主文件目录(MFD)+ 各用户的用户文件目录(UFD)。解决了重名与保护问题,但用户间难以共享、缺乏灵活性(用户不能自建子目录分组)。
- 树形目录:主流结构。目录/文件都是结点,从根到叶唯一路径。绝对路径从根 / 出发;相对路径从当前目录(工作目录)出发。引入当前目录的第二个理由:缩短检索路径 → 减少读盘次数。缺点:文件不能属于多个用户/目录(不便共享)。
- 无环图目录:允许不同目录项指向同一结点实现共享(需维护共享计数,删除到计数为 0 才真正回收;可能形成环则需特别处理,故限定「无环」)。
② 绝对路径长、逐级检索读盘多——「当前目录 + 相对路径」是为减少 IO,不是为了安全;
③ 无环图共享的结点删除要看共享计数;形成环会造成遍历死循环,故名「无环」。
4.3.3 目录查询技术:线性 vs Hash
用户当前目录为 /home/ty,其中要访问的文件为 doc/a.txt,文件的绝对路径是什么?相比直接使用绝对路径逐级检索,使用当前目录的好处是什么?
查看答案
绝对路径为 /home/ty/doc/a.txt。好处:相对路径短,从当前目录出发直接进入 doc 检索,省去从根开始的逐级读盘(每读一级目录至少一次磁盘 IO),显著减少检索文件的启动磁盘次数。
4.4 文件的物理结构 高频考点
4.4.1 连续分配
② 扩展困难:文件末尾之后的块若被占用,只能整体迁移到更大的连续区域;因此文件长度不宜动态增长;
③ 适合一次写入、不再修改的介质(CD-ROM、蓝光)与对顺序访问速度敏感的场合;
④ 「连续分配支持随机访问」的前提是定长物理块 + 记录位置可计算——变长记录的连续文件不能随机定位第 i 条记录。
某文件采用连续分配,FCB 记录起始块号为 100、长度为 10 块,盘块大小 4KB。求文件内逻辑地址 5000B(从 0 开始)所在物理块号及块内偏移。
查看答案
逻辑块号 \(=\Big\lfloor\frac{5000}{4096}\Big\rfloor=1\),块内偏移 \(=5000\bmod 4096=904\)B。物理块号 \(=100+1=101\)。即访问第 101 号盘块内偏移 904B 处——一次计算完成定位,这正是连续分配支持随机访问的体现。
4.4.2 链接分配:隐式链接与显式链接(FAT)
① 只能顺序访问:访问第 \(i\) 块必须从首块起顺链读前 \(i-1\) 块才能拿到指针;
② 指针占用少量块内空间;③ 一块中指针损坏则链断(可靠性差,可双向链或每块存「块号+指针」校验缓解)。
① 查 FAT 不需要启动磁盘:给出逻辑块号,顺着内存中的 FAT 链走 \(i-1\) 步即得物理块号 → 支持随机(直接)访问;
② 无外部碎片、易扩展;
③ 代价:FAT 占内存,其大小与磁盘块数成正比(见例 3)——大磁盘时代 FAT 表可能数百 MB,这是显式链接的致命短板。
某磁盘容量 400GB,物理块大小 4KB,FAT 中每个表项至少要能表示所有盘块号。(1) 每个表项至少多少位?(2) 若表项按 4B 组织,FAT 共占多少空间?把整个 FAT 常驻内存是否现实?
查看解答
(1) 盘块数 \(\frac{400\text{GB}}{4\text{KB}}=\frac{400\times2^{30}}{2^{12}}=100\times2^{20}\approx1.05\times10^{8}\) 块。表示 \(1.05\times10^{8}\) 个编号需要 \(\lceil\log_2(1.05\times10^{8})\rceil=\lceil26.64\rceil=27\) 位,至少 27 位(取整字节则 4B)。
(2) FAT 大小 \(=100\times2^{20}\) 项 \(\times\ 4\text{B}=400\times2^{20}\text{B}=400\text{MB}\)(约 400MiB)。
常驻内存要吃掉约 400MB 内存,仅一张表就如此庞大——这正说明 FAT 适合小磁盘(U 盘、早期 FAT12/16 分区),大磁盘上应改用「每个文件一张小索引表」的索引分配(4.4.3)。
套路总结:FAT 大小 = 盘块数 × 每项字节数;盘块数 = 磁盘容量 ÷ 块大小。别忘了「表项位数 ≥ ⌈log₂盘块数⌉」这一步。
某文件占 5 个盘块,分别采用隐式链接与显式链接(FAT 常驻内存)组织,FCB/inode 已在内存。分别求随机读取该文件第 5 块需启动磁盘多少次?
查看解答
隐式链接:指针在各盘块尾部,必须依次读第 1、2、3、4 块(各 1 次 IO,取得下一块指针),最后读第 5 块,共 \[ (5-1)+1=5 \text{(次)} \]
显式链接(FAT):沿内存中的 FAT 链走 4 步算出第 5 块物理块号(0 次 IO),直接读第 5 块,共 1 次。
一般化:隐式链接读第 \(n\) 块需 \(n\) 次 IO;FAT 常驻内存时只需 1 次(若 FAT 不在内存则再加 1 次读 FAT)。
易错:题目若说「FCB 尚未读入」,隐式链接还要加检索目录的成本;但「FAT 常驻内存」这句话就是出题人给的免 IO 通行证,务必看清。
4.4.3 索引分配与 Unix 混合索引 大题必考
12 个直接块 + 1 个一次间接 + 1 个二次间接 + 1 个三次间接。设物理块 4KB、块指针 4B:
每个索引块可存 \(\frac{4\text{KB}}{4\text{B}}=\frac{4096}{4}=1024\) 个块指针。
① 直接:\(12\times4\text{KB}=48\text{KB}\);
② 一次间接:\(1024\times4\text{KB}=2^{10}\times2^{12}=4\text{MB}\);
③ 二次间接:\(1024^{2}\times4\text{KB}=2^{20}\times2^{12}=4\text{GB}\);
④ 三次间接:\(1024^{3}\times4\text{KB}=2^{30}\times2^{12}=4\text{TB}\)。
最大文件 \(\approx 48\text{KB}+4\text{MB}+4\text{GB}+4\text{TB}\approx4\text{TB}\)。读写成本:直接块 1 次 IO;一次间接块最多 2 次(索引块+数据块);二次 3 次;三次 4 次——块越大级数越少 IO 越少,但小文件也用不满,混合索引就是这种折中。
某 Unix 文件系统物理块 4KB,块指针 4B,inode 含 12 个直接地址项、1 个一次间接、1 个二次间接、1 个三次间接地址项。(1) 求最大文件长度;(2) 文件大小为 5MB 和 5GB 时,读其最后一块分别至少要读多少个盘块(inode 已在内存)?
查看解答
(1) 每个索引块存 \(\frac{4096}{4}=1024\) 个指针:
直接:\(12\times4\text{KB}=48\text{KB}\);一次间接:\(1024\times4\text{KB}=4\text{MB}\);二次间接:\(1024^2\times4\text{KB}=4\text{GB}\);三次间接:\(1024^3\times4\text{KB}=4\text{TB}\)。
\[ L_{\max}=48\text{KB}+4\text{MB}+4\text{GB}+4\text{TB}\approx4\text{TB} \](2) 5MB 文件:直接块用完 48KB 后剩余 \(5\text{MB}-48\text{KB}\) 落在一次间接区(一次间接容量 4MB > 5MB−48KB≈4.95MB?注意 5MB−48KB = 5120KB−48KB = 5072KB = 4.95MB > 4MB!)——直接 48KB + 一次间接 4MB = 4MB+48KB ≈ 4.047MB < 5MB,因此末块已进入二次间接区:需读二级索引块 + 一级索引块 + 数据块 = 3 块。
5GB 文件:48KB + 4MB + 4GB ≈ 4.004GB < 5GB,末块在二次间接区中部:同样 3 块(2 个索引块 + 1 数据块)。
易错:判断「最后一块落在哪一档」要拿文件大小与累计容量 48KB / 48KB+4MB / +4GB 逐一比较,而不是只看文件超过 4MB 就答一次间接。
4.4.4 三种分配方式对比
| 特性 | 连续分配 | 隐式链接 | 显式链接(FAT) | 索引分配 |
|---|---|---|---|---|
| 随机(直接)访问 | 支持(算地址) | 不支持 | 支持(查内存 FAT) | 支持(查索引块) |
| 顺序访问速度 | 最快(磁头几乎不移动) | 慢(顺链逐块读) | 较快(FAT 在内存) | 较快(需先读索引块) |
| 文件扩展 | 难(可能整体迁移) | 方便 | 方便 | 方便(多级/混合索引) |
| 碎片 | 外部碎片(需紧凑) | 无 | 无 | 无 |
| 额外空间开销 | 无 | 每块一个指针 | 整张 FAT(与盘块数成正比,常驻内存) | 每文件一个/多个索引块 |
| FCB 记录 | 起始块号 + 长度 | 首块号(末块号) | 首块号 | 索引块地址 |
4.5 文件存储空间管理
4.5.1 空闲表与空闲链表
4.5.2 位示图 大题必考
正推(位 → 块):\[ b=(n-1)\times D+m \]
反推(块 → 位):\[ n=\Big\lfloor\frac{b-1}{D}\Big\rfloor+1,\qquad m=b-(n-1)\times D \]
若题干约定字号、位号、盘块号都从 0 开始,则简化为 \(b=n\times D+m\),\(n=\Big\lfloor\frac{b}{D}\Big\rfloor\),\(m=b\bmod D\)。
某磁盘用位示图管理空闲块,字长 32 位,字号、位号、盘块号均从 1 开始。(1) 第 2 字第 5 位对应的盘块号是多少?(2) 盘块号 100 对应的字号、位号?(3) 该磁盘共 16384 块,位示图至少占多少字?
查看解答
(1) \(b=(2-1)\times32+5=37\)。
(2) \(n=\Big\lfloor\frac{100-1}{32}\Big\rfloor+1=\lfloor3.09\rfloor+1=4\),\(m=100-(4-1)\times32=100-96=4\)。验证:\((4-1)\times32+4=100\) ✓。
(3) \(\frac{16384}{32}=512\) 字(每字管 32 块,正好整除;若不整除要向上取整)。
套路总结:正推一代入乘加;反推「先减 1、除 D 取整加 1」,最后用正推回代自检。
4.5.3 成组链接法(Unix)
每组的第一个块(栈底方向)登记着下一组的 100 个空闲块号及数量;最后一组不足 100 且其中登记的块号 0 表示空闲块用尽的结尾标志。
分配:从栈顶弹出一个块号分配(计数减 1);当栈中只剩最后一个块号(它是登记下一组信息的块)时,须先把该块内容读入内存栈(下一组 100 个块号成为新栈),再把该块本身分配出去。
回收:栈未满(计数 < 100)→ 块号直接压栈;栈已满(计数 = 100)→ 把栈中 100 个块号及计数写入新回收的块,该块号作为新栈的第一项入栈、计数置 1(它成为新的「组头」)。
分配:
if (S.count == 0) // 栈空:所有空闲块用完
error("无空闲块");
else if (S.count == 1) { // 只剩组头块:块内登记着下一组
将 S.free[1] 号块内容读入栈 S; // 下一组 100 个块号成为新栈
分配该组头块给用户; // 组头块本身也交出去
S.count = 100;
} else {
分配 S.free[S.count] 给用户; // 弹出栈顶块号
S.count = S.count - 1;
}
回收 blockNo:
if (S.count == 100) { // 栈满:先成组写回磁盘
将栈中 100 个块号及计数写入 blockNo 号块;
S.count = 1; S.free[1] = blockNo; // 它成为新组头
} else {
S.count = S.count + 1;
S.free[S.count] = blockNo; // 直接压栈
}
采用成组链接法(每组 100 块),当前内存栈中计数为 1,仅剩栈底块号 401。(1) 此刻申请一个空闲块,系统要做哪些动作?(2) 若改为回收一个盘块 501,栈如何变化?
查看答案
(1) 栈中只剩 401,它是登记下一组(301..400)信息的组头块:先启动磁盘把 401 号块内容读入内存栈(栈变为 301..400,计数 100),然后才把 401 号块本身分配给申请者。共 1 次额外读盘。
(2) 此时栈中仅 1 项(未满 100),501 直接入栈:计数变 2,无需任何磁盘 IO。
易错:「弹到组头块必须先读盘再分配」是成组链接法最常考的一步;回收则在「栈满 100」时才触发写盘成组。
4.6 文件的基本操作
- create:为新文件分配外存空间,在目录中建立 FCB(建立的是「文件存在」这个事实,内容还要靠 write 写入);
- delete:检索目录找到 FCB → 回收磁盘块(位示图/成组链接)→ 删除目录项;有共享(硬链接)时先减计数;
- open:检索目录,把 FCB(inode)副本调入内存,登记到「打开文件表」,向用户返回文件描述符 fd;
- close:删除进程中该表项,系统表打开计数减 1;减到 0 说明无人再用,写回修改过的 FCB、回收其内存副本;
- read:按 fd 找到打开文件表项 → 由系统级表项中的 FCB 信息把「逻辑地址 → 逻辑块号 → 物理块号」→ 启动磁盘读;
- write:同上定位后写入;需要新块时调存储空间管理程序分配。
open 之后 read 不再查目录的原因:open 已把 FCB(含物理位置)搬进内存打开文件表,read 只需沿 fd → 进程表 → 系统表直达元数据——省掉的是每读一次就检索一遍目录的磁盘 IO。
int fd = open("/home/ty/a.txt", O_RDONLY);
// 内核五步:检索目录 -> 验权限 -> FCB 入系统打开文件表
// -> 进程打开文件表登记 -> 返回 fd
for (int i = 0; i < 100; i++)
read(fd, buf, 512); // 每次只查两张表 + 读数据块,不再检索目录
close(fd); // 删进程表项;打开计数减 1,减到 0 才真正清系统表项
用户进程首次执行 open("/home/ty/a.txt") 时,系统内部各步骤的正确顺序是:
① 将 FCB/inode 副本调入系统打开文件表;② 检索目录,找到 a.txt 的目录项与 inode 位置;③ 校验用户对此文件的存取权限;④ 返回文件描述符 fd 给进程;⑤ 在进程打开文件表中建立表项并指向系统级表项。
A. ②③①⑤④ B. ②①③⑤④ C. ③②①⑤④ D. ②③⑤①④
查看解答
A。流程:先检索目录(②,找到 FCB 在盘上的位置)→ 检查权限(③,不通过直接报错,避免无谓读盘)→ FCB 副本进系统级打开文件表(①)→ 进程级表建立表项并指向系统级表项(⑤)→ 返回 fd(④)。
常见干扰项辨析:B 错在先调入后验权(安全上不允许:未验证就复制元数据);D 错在进程级表项建立时系统级表项必须已存在,① 必须先于 ⑤。
套路总结:排序题抓「找目录 → 验权限 → 进系统表 → 进进程表 → 给 fd」五步骨架;close 是逆过程(删进程表项 → 计数减 1 → 为 0 才真正清系统表项)。
4.7 文件共享与保护
4.7.1 基于索引结点的硬链接与符号链接(软链接)
② 软链接删除源后链接悬空,硬链接删除源后其他名字照常访问;
③ 软链接访问成本更高(要多次检索目录);
④ 硬链接的 count 存在 inode 中,不是目录项中。
文件 F 的 inode 链接计数 count = 3(a.txt、b.txt、c.txt 三个目录项均指向它)。依次执行:rm a.txt → rm b.txt → rm c.txt。问每一步之后 F 的数据与 inode 的状态。
查看解答
rm a.txt:count \(3-1=2\),仅删除 a.txt 目录项;F 的数据块、inode 均保留,b.txt、c.txt 正常访问。
rm b.txt:count \(=1\),F 实体仍完好,仅剩 c.txt 一个名字。
rm c.txt:count \(=0\),此时才真正删除:F 的全部数据块被回收(进入空闲块管理结构),inode 也被回收。
套路总结:硬链接删除 = 「先减计数,减到 0 才收尸」;若题目再问「进程仍打开着该文件」,Unix 语义下 inode 要等最后一个进程 close 后才真正释放(打开计数与链接计数独立)。
4.7.2 文件保护:口令、加密与访问控制
② 加密:内容以密文存储,密钥在用户手里——保密性最强,但加/解密要耗费大量 CPU 时间;
③ 访问控制(ACL):每个文件一张访问控制表,登记「用户/用户组 → 读/写/执行权限」,检查灵活精细;表占空间且管理开销大,可按组压缩。现代系统还用简化版 rwx 三类用户(属主/同组/其他)位。
将「口令、加密、访问控制(ACL)」与下列描述一一对应:(1) 保密性强但加解密费时;(2) 空间最省、验证快,但口令本身存在系统内易泄露;(3) 按「用户—权限」逐条登记,粒度最细、便于灵活授权。
查看答案
(1) 加密;(2) 口令;(3) 访问控制 ACL。
延伸:ACL 是访问矩阵「按列」存储的实现;能力表则是「按行」的实现。
4.8 文件系统全局结构与 VFS
① 物理格式化(低级格式化):划分扇区、检测坏扇区并用备用扇区替换坏扇区;
② 逻辑格式化(高级格式化):创建文件系统——初始化超级块、空闲块管理结构(位示图/成组链接的栈)、inode 区、根目录、数据区,将整块物理块分组为簇等分配单元。
引导块:计算机启动时,固化在 ROM 的自举程序先读入磁盘主引导记录 MBR(含分区表与引导程序),再由它定位活动分区的引导块(分区第一块附近固定位置),把操作系统内核载入内存——即使分区无操作系统,引导块位置也是保留的。
超级块:存放文件系统全局参数(总块数、空闲块数、空闲块指针、inode 区大小等),开机后与位图等一起被缓存进内存。
① 向上提供统一系统调用接口(open/read/write/close),用户程序无需关心底层是 ext4、NTFS 还是 FAT32;
② 向下要求各文件系统实现统一的对象与操作函数(VFS 四大核心对象:超级块对象、索引结点对象、目录项对象、文件对象);
③ 文件系统必须先挂载(mount)到 VFS 树上才能被访问;对网络文件系统(NFS),VFS 还把请求转发给远程服务程序,实现「本地操作远端文件」的透明性。
4.9 章末自测 真题风格
限时 60 分钟,先做后看答案。难度:★★ 基础 / ★★★ 强化 / ★★★★ 冲刺。所有计算题代具体数值验证后再选/填。
下列关于文件逻辑结构与物理结构的叙述中,正确的是( )
A. 顺序文件是一种文件的物理结构 B. 文件的逻辑结构对用户是透明的 C. 文件的物理结构对用户是透明的 D. 流式文件是记录式文件的一种
查看答案
C。A 错:顺序文件(串结构/顺序结构)是逻辑结构,连续分配才是对应的物理结构;B 错:逻辑结构用户直接可见(决定记录如何组织);C 对:逻辑块如何映射到盘块由文件系统负责,用户无感知;D 错:流式文件即无结构文件,与记录式相对。
用户进程发出 read 系统调用后,请求在文件系统内部自顶向下的传递顺序是( )
A. 用户接口 → 文件目录系统 → 存取控制 → 逻辑文件系统 → 物理文件系统 → 设备管理
B. 用户接口 → 存取控制 → 文件目录系统 → 物理文件系统 → 逻辑文件系统 → 设备管理
C. 用户接口 → 文件目录系统 → 逻辑文件系统 → 存取控制 → 物理文件系统 → 设备管理
D. 用户接口 → 逻辑文件系统 → 文件目录系统 → 存取控制 → 物理文件系统 → 设备管理
查看答案
A。先检索目录找到 FCB(文件目录系统),再验权限(存取控制),然后「逻辑记录 → 逻辑块」(逻辑文件系统),再「逻辑块 → 物理块」(物理文件系统),最后交给设备驱动。记忆锚点:先找人(目录)再验身份(权限),两次翻译(逻辑→逻辑块→物理块)后交给驱动。
关于文件分配表 FAT 的叙述中,错误的是( )
A. 整个物理磁盘只维护一张统一的 FAT B. FAT 的表项数与磁盘盘块数相同 C. 开机后 FAT 整体读入内存并常驻,查表不需要启动磁盘 D. FAT 方式下文件支持随机访问
查看答案
A。FAT 是每个分区一张,不是整盘一张(不同分区可装不同文件系统)。B 对:表项序号即盘块号,一一对应;C 对:这是显式链接相比隐式链接的核心优势;D 对:在内存 FAT 上顺链即可直接定位第 i 块。补充:隐式链接因指针藏在盘块尾部,只查指针就要启动磁盘,故不支持随机访问。
Unix 采用混合索引(直接地址 + 多级间接地址)的主要目的是( )
A. 消除外部碎片 B. 小文件访问快,同时又能支持很大的文件 C. 节省磁盘空间 D. 便于实现文件共享
查看答案
B。绝大多数文件是小文件,直接地址项使其访问只需 1 次 IO;偶发的巨型文件再逐级启用间接地址扩充容量——两级目标兼顾才是动机。A、C 不是混合索引的目的(链接/索引分配本就无外部碎片);D 与共享无关(共享靠 inode 硬链接/软链接)。
(2009 真题原型)某文件系统物理块大小 1KB,盘块号占 4B;某文件的索引结点中有 4 个地址项:2 个直接地址索引、1 个一次间接地址索引、1 个二次间接地址索引。该文件最大长度是 ______ KB(约合 ______ MB)。
查看答案
每个索引块容纳 \(\frac{1024\text{B}}{4\text{B}}=256\) 个盘块号:
直接:2 块;一次间接:\(256\) 块;二次间接:\(256^{2}=65536\) 块。合计 \(2+256+65536=65794\) 块,
\[ L_{\max}=65794\times1\text{KB}=65794\text{KB}\approx64.25\text{MB} \](\(65794\div1024=64.25\) ✓)
进程已成功 open 某文件并多次 read。下列说法错误的是( )
A. 每次 read 都需要重新检索目录 B. fd 是进程打开文件表的索引 C. 系统级打开文件表中有 FCB 副本和打开计数 D. 多个进程独立 open 同一文件时各有自己的读写指针
查看答案
A。open 已把 FCB 调入内存打开文件表,read 沿 fd → 进程表 → 系统表直接定位,不再查目录——这正是 open 存在的意义。B、C、D 均正确:父子进程共享系统级表项才共享读写指针。
用户 ty 建立了指向文件 F 的硬链接 h.txt 与符号链接 s.txt。之后 F 的原目录项被删除。下列叙述正确的是( )
A. 通过 h.txt 和 s.txt 都能继续访问 F B. 只有 h.txt 能继续访问 F,s.txt 变为悬空链接 C. 只有 s.txt 能继续访问 F D. 两者都失效
查看答案
A。硬链接 h.txt 与原目录项指向同一 inode,删除原目录项只是 count 减 1(仍 > 0),数据完好;符号链接 s.txt 存的是路径名——只要硬链接 h.txt 还在,该路径仍有效,s.txt 也能访问。若没有任何名字指向 F(count = 0),数据被回收后 s.txt 才悬空。易错点:删除的是「目录项」还是「整个文件实体」,务必分开。
磁盘块用位示图管理,字长 32 位,字号、位号、盘块号均从 1 开始编号。(1) 第 4 字第 12 位对应的盘块号是 ______;(2) 盘块号 165 对应的字号是 ______、位号是 ______。
查看答案
(1) \(b=(4-1)\times32+12=96+12=108\)。
(2) \(n=\Big\lfloor\frac{165-1}{32}\Big\rfloor+1=\lfloor5.125\rfloor+1=6\),\(m=165-(6-1)\times32=165-160=5\)。验证:\((6-1)\times32+5=165\) ✓。
某文件系统物理块 2KB,块指针 4B;inode 含 4 个直接地址项、1 个一次间接、1 个二次间接地址项。(1) 求最大文件长度;(2) 文件恰好达到最大长度时,读文件最后一个盘块共需启动磁盘几次(inode 已在内存)?
查看解答
(1) 每个索引块容纳 \(\frac{2048}{4}=512\) 个指针:
直接 \(4\) 块 + 一次间接 \(512\) 块 + 二次间接 \(512^{2}=262144\) 块 = \(4+512+262144=262660\) 块,
\[ L_{\max}=262660\times2\text{KB}=525320\text{KB}\approx512.8\text{MB}\quad(525320\div1024=512.8) \](2) 末块落在二次间接区:先读二级索引块、再读其中的一级索引块、最后读数据块,共 3 次启动磁盘(若在直接区为 1 次、一次间接区为 2 次)。
某文件占 100 个盘块,FCB 已在内存。分别采用:① 连续分配;② 隐式链接;③ FAT(常驻内存);④ 单级索引分配(索引块不在内存)。求随机读第 50 块各需启动磁盘多少次?紧接着再读第 51 块又各需多少次?
查看解答
读第 50 块:① 连续:起始块号 + 49 一次算出,读数据 1 块 → 1 次;② 隐式链接:顺链读第 1~49 块取指针(49 次)+ 读第 50 块 → 50 次;③ FAT:沿内存 FAT 链走 49 步(0 次 IO)+ 读数据 → 1 次;④ 索引:读索引块 1 次 + 读数据块 1 次 → 2 次。
再读第 51 块:① 连续 1 次;② 隐式链接:第 50 块尾部指针已指明第 51 块(刚才读过)→ 1 次;③ FAT:1 次;④ 索引:索引块已在内存 → 1 次。
结论:随机访问能力 连续 = FAT ≥ 索引 ≫ 隐式链接;但隐式链接紧跟上一次访问位置的顺序读效率并不差(1 次)——「只能顺序访问」指的是不能跳读任意块。
4.10 本章考点总结
| 考点 | 常考题型 | 热度 | 核心方法/结论 |
|---|---|---|---|
| 逻辑结构(顺序/索引/索引顺序/散列) | 选择 | ★★★ | 串结构无序不可二分;索引顺序文件平均比较 \(\sqrt N\) 次;散列不支持顺序/范围查找 |
| FCB / inode / 目录结构 | 选择 + 计算 | ★★★★ | 目录项瘦身 → 每块目录项更多 → 启动磁盘次数减少;树形目录 + 当前目录减少检索 IO |
| 连续 / 链接 / FAT | 选择 + 计算 | ★★★★★ | 隐式链接读第 n 块 n 次 IO;FAT 大小 = 盘块数 × 表项字节(400GB/4KB → 400MB) |
| 索引分配与混合索引 | 大题 | ★★★★★ | 4KB 块 4B 指针:直接 48KB、一级 4MB、二级 4GB、三级 4TB;读末块 IO = 间接级数 + 1 |
| 存储空间管理 | 选择 + 大题 | ★★★★ | 位示图 \(b=(n-1)D+m\) 双向互算;成组链接「栈剩组头先读盘再分配、栈满回收先写盘」 |
| 基本操作与打开文件表 | 选择 | ★★★★ | open:找目录 → 验权限 → 入系统表 → 入进程表 → 返回 fd;open 后 read 不查目录 |
| 共享与保护 | 选择 | ★★★ | 硬链接 count 减到 0 才删实体;软链接存路径、可跨文件系统、源删则悬空 |
| 全局结构与 VFS | 选择 | ★★ | 物理格式化管扇区、逻辑格式化建文件系统;VFS 向上统一接口、向下适配差异 |