操作系统 · 2027 考研计算机 408

第 4 章 文件管理

目标院校:四川大学 / 电子科技大学 | 建议用时:概念 4 小时 + 例题练习 5 小时 | 本章为操作系统分值最重的章节之一

本章地位:文件管理是 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 文件的属性与分类

定义文件(File)是以计算机硬盘为载体的、存储在计算机上的相关信息的集合(具有文件名的一组相关信息集合)。操作系统中负责管理文件的部分称为文件系统,它统一管理软件资源,实现对文件的「按名存取」。
文件属性① 名称:唯一易读的标识,由主名与扩展名组成;② 标识符/文件 ID:系统内部唯一数字编号(人不可读);③ 类型(扩展名或魔数标识,如 .txt、ELF);④ 大小:当前字节数;⑤ 位置:指向 FCB/inode 或文件所在设备及物理位置;⑥ 保护信息:读/写/执行权限;⑦ 时间:创建、修改、最后访问时间;⑧ 创建者/所有者。属性中最核心的映射是名称 → 物理位置(记录在 FCB 中)。
分类按用途:系统文件(不允许用户修改)、库文件(标准子程序/动态库)、用户文件;按组织形式(逻辑结构):无结构文件(流式文件,如二进制流)、有结构文件(记录式文件,又分定长/变长记录);按保护级别:只读、读写、可执行、无保护文件。
一句话记忆无结构文件 = 字节流(Unix 一切皆文件的思想源头);「按用途分类」别漏库文件;文件的逻辑结构在用户视角(记录怎么排),物理结构/物理结构在磁盘视角(块怎么放)——两者独立,是本章第一大辨析点。
练习 1

判断正误:(1) 文件名是文件系统内部唯一识别文件的依据;(2) 流式文件是无结构文件;(3) 按保护级别文件可分为只读、读写、可执行和无保护文件。

查看答案

(1) 错:文件名供用户使用且可能重名(不同目录下),系统内部靠标识符/文件 ID(如 inode 号)唯一识别;FCB 中同时记录两者。

(2) 对:流式文件按字节流组织、无记录边界,属无结构文件。

(3) 对:这是按保护级别的标准分类。

4.1.2 文件系统功能与层次结构

文件系统功能① 对外提供按名存取接口(create/delete/open/close/read/write);② 目录管理(FCB 组织、检索、共享);③ 文件逻辑结构与物理结构的转换;④ 存储空间(外存空闲块)的分配与回收;⑤ 文件保护与安全;⑥ 提供接口(命令、系统调用)与共享手段。
以 read(fd, 100, 512) 为例自顶向下过一遍: ① 用户接口(命令 / 系统调用) ② 文件目录系统:按名检索目录,找到 FCB / inode ③ 存取控制模块:校验权限(ACL / 口令),不合法则拒绝 ④ 逻辑文件系统与文件信息缓冲区:逻辑记录号 → 逻辑块号 ⑤ 物理文件系统:逻辑块号 → 物理块号(查索引表 / FAT / 链) ⑥ 辅助分配模块:分配 / 回收空闲盘块(位示图 / 成组链接) ⑦ 设备管理程序模块:块号 →(磁道、扇区),驱动磁盘 IO open 阶段 read 阶段 真正读盘 物理设备(磁盘)在最底层:整个层次结构就是「按名存取」逐级翻译成「按块存取」的过程
图 4-1 文件系统层次结构(自顶向下 7 层):一条 read 请求逐层下翻译,最终变成对具体盘块的 IO 指令
易错① 「逻辑文件系统」负责逻辑记录 ↔ 逻辑块的转换,「物理文件系统」负责逻辑块 ↔ 物理块——两层各管一次翻译,顺序题常在这里挖坑;
② 目录检索发生在第 ② 层,因此 open 之后 read 不再查目录(FCB 已在内存打开文件表中);
③ 分配空闲块(第 ⑥ 层)发生在写文件需要新块时,读文件不经过第 ⑥ 层。

4.2 文件的逻辑结构 高频考点

分类按逻辑结构,文件分为有结构文件(记录式)——由一个个记录组成(定长记录 / 变长记录),如数据库表;无结构文件(流式)——字节序列,如源代码、图像。逻辑结构是用户看到的结构,与文件在磁盘上怎么存(物理结构)无关。按记录组织方式,有结构文件又分为顺序文件、索引文件、索引顺序文件、散列文件。

4.2.1 顺序文件:串结构与顺序结构

定义记录按顺序(定长或变长)连续排列成文件。按关键字是否有序分两种:
串结构:记录间顺序与关键字无关(按存入时间先后排列);顺序结构:所有记录按关键字有序排列。
两种结构的最大区别在检索:串结构只能从头到尾逐条比较;顺序结构可利用关键字有序做二分检索(要求定长记录且可随机访问)。
适用与局限顺序文件是磁带这种顺序存取设备上唯一可用的文件组织形式;对存储在磁盘上的顺序文件也可顺序存取。定长记录的顺序文件若同时物理上连续存放,才能支持随机检索——「逻辑有序 + 物理连续/可随机定位」是二分检索的前提。变长记录无法直接计算第 i 条记录偏移,不能随机定位。

4.2.2 索引文件与索引顺序文件

索引文件为变长记录文件建立一张索引表(定长:键 + 指针),索引表按键(或序号)排序。检索时先查索引表(定长、有序 → 可折半查找),再按指针直接读记录 → 实现随机存取。索引表本身小,可整块调入内存,检索快。代价:索引表占额外空间,增删记录要同步维护索引表。
索引顺序文件索引文件 + 顺序文件的折中:记录分组,先建组索引,组内顺序存取。两大经典实现:
ISAM(索引顺序存取方法):为磁盘设计的静态三级索引——主索引 → 柱面索引 → 磁道索引,数据按磁道存放,为插入操作预留溢出区(磁道满则进溢出区)。索引结构固定,文件增长后溢出链变长、性能下降,需定期重组。
VSAM(虚拟存储存取方法):采用B+ 树动态索引,无需溢出区,通过叶子结点的顺序集支持随机与顺序存取,文件可动态增长/收缩。
例 1 方法 索引顺序文件的检索效率(√N 技巧)

某文件共有 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 直接文件与散列文件

定义直接文件:由记录的关键字直接得到记录的物理地址;散列(Hash)文件是典型实现——用散列函数 \(H(\text{key})\) 计算记录所在地址。优点:存取快、无需索引表;缺点:冲突(不同 key 映射到同一地址)与散列函数选择困难,且不支持顺序存取、不支持按关键字范围查找。
易错散列文件的「冲突」不可彻底避免,只能通过开放定址、链地址等方法处理;它是逻辑结构与物理寻址合二为一的组织方式,考试常把「索引文件」和「散列文件」放在选项里混考——索引文件靠索引表检索(可范围查找),散列文件靠计算检索(只能点查)。
练习 2 易错

关于文件逻辑结构,判断正误:(1) 索引文件能为变长记录文件实现随机存取;(2) 顺序文件的串结构支持二分查找;(3) 散列文件支持顺序存取。

查看答案

(1) 对:索引表本身是定长且有序的,先折半查索引表再按指针直达记录。

(2) 错:串结构记录无序,二分查找失效;只有顺序结构(关键字有序)且定长记录可随机定位时才能二分。

(3) 错:散列地址无序,只能按 key 点查,不支持顺序存取和范围查找。

4.3 文件目录

4.3.1 FCB、索引结点与目录瘦身

FCB文件控制块(FCB)是操作系统为管理文件而设置的数据结构,存放管理文件所需的全部元数据:基本信息(文件名、物理位置——起始块号/索引表地址、类型、大小)、存取控制信息(所有者、权限)、使用信息(时间、共享计数)。目录就是一个文件,其内容是一个个目录项;最简单的目录项 = 一个完整 FCB。FCB 中「文件名 + 物理位置」是最核心的两项——实现按名存取的关键。
索引结点(inode)瘦身检索目录时只用得到文件名,其余元数据用不到。于是把「文件名之外」的信息单独抽出存为索引结点,目录项瘦身为「文件名 + inode 号」:
① 磁盘 inode(静态):文件大小、所有者、权限、时间、链接计数 count、地址索引项(直接/间接地址);
② 内存 inode(动态):打开文件时把磁盘 inode 复制进内存,另加:状态标志、引用计数、所属文件系统挂载点等动态信息。
瘦身的收益:目录项变小 → 一个盘块装下更多目录项 → 检索目录需读入的盘块数减少 → 启动磁盘(IO)次数减少。
例 2 高频考点 目录项瘦身后启动磁盘次数的计算

某目录文件中共有 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 目录结构:单级 → 两级 → 树形 → 无环图

演进
  1. 单级目录:整个系统一张目录表。实现简单,但不允许重名、查找慢、无法实现共享——只适合单用户。
  2. 两级目录:主文件目录(MFD)+ 各用户的用户文件目录(UFD)。解决了重名与保护问题,但用户间难以共享、缺乏灵活性(用户不能自建子目录分组)。
  3. 树形目录:主流结构。目录/文件都是结点,从根到叶唯一路径。绝对路径从根 / 出发;相对路径从当前目录(工作目录)出发。引入当前目录的第二个理由:缩短检索路径 → 减少读盘次数。缺点:文件不能属于多个用户/目录(不便共享)。
  4. 无环图目录:允许不同目录项指向同一结点实现共享(需维护共享计数,删除到计数为 0 才真正回收;可能形成环则需特别处理,故限定「无环」)。
易错① 树形目录中,绝对路径任何时候都有效;相对路径依赖当前目录——每进程有且只有一个当前目录(可用 chdir 修改);
② 绝对路径长、逐级检索读盘多——「当前目录 + 相对路径」是为减少 IO,不是为了安全;
③ 无环图共享的结点删除要看共享计数;形成环会造成遍历死循环,故名「无环」。

4.3.3 目录查询技术:线性 vs Hash

两种检索线性检索法:目录项逐个比较文件名——简单但慢(顺序表/链表都适用);Hash 检索法:文件名经散列函数直接定位目录项——一次计算即得,极快;但不能支持按前缀/范围查找(如列出所有 .c 文件),且要处理冲突。此外,目录项很多时可把目录文件本身组织成索引或 B+ 树(现代文件系统常用 B/B+ 树目录)。
练习 3

用户当前目录为 /home/ty,其中要访问的文件为 doc/a.txt,文件的绝对路径是什么?相比直接使用绝对路径逐级检索,使用当前目录的好处是什么?

查看答案

绝对路径为 /home/ty/doc/a.txt。好处:相对路径短,从当前目录出发直接进入 doc 检索,省去从根开始的逐级读盘(每读一级目录至少一次磁盘 IO),显著减少检索文件的启动磁盘次数。

4.4 文件的物理结构 高频考点

定义物理结构研究文件逻辑块怎么放到磁盘盘块上。磁盘被划分成等大的物理块(盘块),逻辑块大小 = 物理块大小(常为 4KB)。三种基本分配方式:连续分配、链接分配(隐式/显式 FAT)、索引分配。FCB/inode 中记录的信息由分配方式决定:连续 → 起始块号 + 长度;链接 → 首块号(+末块号);索引 → 索引块地址。
① 连续分配 起始块 20,长度 5 20 21 22 23 24 块 20+i 直接算出:支持随机访问 扩展难、有外部碎片 ② 隐式链接 指针藏在块尾 30 P 47 P 9 -1 块可离散:无外部碎片,但找第 i 块 必须顺链逐块读 → 只能顺序访问 ③ 索引分配(FAT 见 4.4.2) 索引块[72,15,88] 72 15 88 读索引块即得全部块号 → 支持随机 访问、易扩展;索引块占额外空间 三者共同点:都实现「逻辑块号 → 物理块号」的映射,差别在映射信息放在哪里(FCB / 盘块尾部 / FAT / 索引块)
图 4-2 三种物理分配方式对比:连续(算出来)、隐式链接(藏在链上)、索引(查表得到)

4.4.1 连续分配

机制文件占据磁盘上一段连续的盘块,FCB 只需记录起始块号 + 文件长度。第 \(i\) 个逻辑块的物理块号 = 起始块号 \(+\ i\),一次计算即得 → 支持随机访问;顺序访问时磁头几乎不移动,顺序读写速度最快。
易错① 外部碎片:文件删除后的空洞难以利用(多个小空洞拼不成大文件),需要紧凑(拼接)移动文件,代价大;
② 扩展困难:文件末尾之后的块若被占用,只能整体迁移到更大的连续区域;因此文件长度不宜动态增长;
③ 适合一次写入、不再修改的介质(CD-ROM、蓝光)与对顺序访问速度敏感的场合;
④ 「连续分配支持随机访问」的前提是定长物理块 + 记录位置可计算——变长记录的连续文件不能随机定位第 i 条记录。
练习 4

某文件采用连续分配,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)

隐式链接每个盘块尾部藏一个指向下一盘块的指针(末块存 -1),FCB 记录首块号(和末块号)。块可离散分布 → 无外部碎片、易扩展。代价:
① 只能顺序访问:访问第 \(i\) 块必须从首块起顺链读前 \(i-1\) 块才能拿到指针;
② 指针占用少量块内空间;③ 一块中指针损坏则链断(可靠性差,可双向链或每块存「块号+指针」校验缓解)。
显式链接(FAT)把所有盘块的链接指针集中抽出,建成一张文件分配表 FAT:表项序号 = 物理块号,表项内容 = 该文件的下一块号(-1 表文件末,其他特殊值表空闲/坏块)。FAT 在磁盘上每个分区一张,开机后整个读入并常驻内存 →
① 查 FAT 不需要启动磁盘:给出逻辑块号,顺着内存中的 FAT 链走 \(i-1\) 步即得物理块号 → 支持随机(直接)访问;
② 无外部碎片、易扩展;
③ 代价:FAT 占内存,其大小与磁盘块数成正比(见例 3)——大磁盘时代 FAT 表可能数百 MB,这是显式链接的致命短板。
例 3 真题风格 FAT 表大小计算

某磁盘容量 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₂盘块数⌉」这一步。

例 4 高频考点 隐式链接访问第 n 块的 IO 次数

某文件占 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 混合索引 大题必考

索引分配为每个文件建立一张索引表,第 \(i\) 项存放文件第 \(i\) 块的物理块号;FCB 中记录「索引块地址」。读文件时先读索引块,再按表定位 → 支持随机访问、易于扩展、无外部碎片。问题:小文件也要一个索引块(浪费);大文件一个索引块装不下所有块号 → 引出多级索引(索引块指向索引块)与混合索引。
Unix 混合索引inode 的地址项按文件大小分档:小文件走直接地址(快),大文件逐级启用间接地址(大):
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 越少,但小文件也用不满,混合索引就是这种折中。
inode(地址项区) 直接地址 0 … 11(12 项) 一次间接地址 二次间接地址 三次间接地址 数 据 块 ×12 12 × 4KB = 48KB(1 次 IO 达) 一级索引块(1024 个指针) 块 块 ×1024 1024 × 4KB = 4MB 二级索引块 一级索引块 ×1024 块 块 ×1024² 1024² × 4KB = 4GB 三级索引块 二级 → 一级索引块 块 块 ×1024³ 1024³ × 4KB = 4TB 块 4KB、指针 4B ⇒ 每索引块 1024 个指针;最大文件 = 48KB + 4MB + 4GB + 4TB 读块代价:直接块 1 次 IO;一次间接 2 次(1 索引 + 1 数据);二次 3 次;三次 4 次(inode 已在内存) 设计动机:绝大多数文件是小于 48KB 的小文件 → 直接地址 1 次 IO;极少数巨型文件才逐级启用间接地址
图 4-3 Unix 混合索引 inode:12 直接 + 一次间接 + 二次间接 + 三次间接,小文件快、大文件能装
例 5 高频考点 混合索引最大文件与 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 记录起始块号 + 长度首块号(末块号)首块号索引块地址
一句话记忆连续分配「算」地址、链接分配「找」地址、索引分配「查」表;随机访问能力:连续 = FAT = 索引 > 隐式链接;可靠性:索引(表独立存放)> 隐式链接(指针在链上,断一处全断)。

4.5 文件存储空间管理

4.5.1 空闲表与空闲链表

空闲表法建一张表记录每个空闲盘区(起始块号 + 连续长度),适合连续分配方式:分配时按首次适应/最佳适应找满足长度的盘区,回收时删除表项、相邻空闲区合并。表本身需按需排序维护。
空闲链表法① 空闲盘块链:以单个盘块为单位链成一条链——分配/回收一次一块,简单但逐块操作、效率低,适合逐块分配的链接/索引文件;② 空闲盘区链:以连续盘区(含块数)为结点链成链——一次分配一整区,配合连续分配。两者信息都在磁盘上,操作需读链(较慢)。

4.5.2 位示图 大题必考

机制用一位二进制表示一个盘块(0 空闲 / 1 已占用),所有位组成一张位示图。优点:位图紧凑、可常驻内存,找连续空闲块也方便(找连续 0 串)。大小估算:位图位数 = 盘块数。例如 1TB 磁盘、块 4KB:盘块数 \(2^{40}/2^{12}=2^{28}\) 个,位图 \(2^{28}\) bit \(=2^{25}\)B = 32MB——比 FAT(同盘约 1GB 量级)小得多。
位示图(字长 D = 32 位,示例只画前 3 行,列号 1..32) 字号1字号2字号3字号… 1 0 1 1 … 0 0 1 1 … 0 1 0 1 … 位号 m=3 字号 n=2 盘块号 b = 35 正推:b = (n−1)·D + m = (2−1)×32 + 3 = 35 解释:字号 2 之前的第 1 字已管完盘块 1..32,第 2 字从盘块 33 起数,数到第 3 位即 33、34、35。 反推:字号 n = ⌊(b−1)/D⌋ + 1,位号 m = b − (n−1)·D。如 b=100:n=⌊99/32⌋+1=4,m=100−3×32=4。 注意:公式依赖「字号、位号、盘块号是否从 0 或 1 开始」的约定,做题先看题干编号起点!
图 4-4 位示图与「字号—位号—盘块号」互算:字长 D、字号 n、位号 m,则盘块号 b=(n−1)D+m
公式设字长 \(D\)(每位示图字含 \(D\) 个二进制位)、字号 \(n\)、位号 \(m\)(均从 1 开始编号),盘块号 \(b\) 从 1 开始:
正推(位 → 块):\[ 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\)。
例 6 高频考点 位示图双向互算

某磁盘用位示图管理空闲块,字长 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 个表项 + 计数)。
每组的第一个块(栈底方向)登记着下一组的 100 个空闲块号及数量;最后一组不足 100 且其中登记的块号 0 表示空闲块用尽的结尾标志。
分配:从栈顶弹出一个块号分配(计数减 1);当栈中只剩最后一个块号(它是登记下一组信息的块)时,须先把该块内容读入内存栈(下一组 100 个块号成为新栈),再把该块本身分配出去。
回收:栈未满(计数 < 100)→ 块号直接压栈;栈已满(计数 = 100)→ 把栈中 100 个块号及计数写入新回收的块,该块号作为新栈的第一项入栈、计数置 1(它成为新的「组头」)。
// 成组链接法:分配与回收一个空闲盘块(S 为内存空闲盘块号栈)
分配:
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;     // 直接压栈
}
内存:空闲盘块号栈(超级块中) 栈顶:计数 S.count = 100 free[1]=500 ← 下次分配 free[2]=499 …(逐块弹出)… free[100]=401(组头) 401 号块中存放着第二组(301..400) 的全部块号与数量 分配到 401 时:先把 401 的内容 读入栈(成为新栈),再分配 401 盘块 401内容:301..400,n=100 盘块 301内容:201..300,n=100 盘块 201内容:101..200,n=100 第一组:401..500(在栈中,先分配) 第二组:301..400(登记在 401 号块) 第三组:201..300(登记在 301 号块)… 要点:空闲块信息大部分在盘上, 内存只常驻一小组 → 空间省、速度也快 回收栈满时反向操作:把 100 个块号 写进新回收块,形成新的组头
图 4-5 成组链接法:栈在内存、组在盘上;分完当前组之前先把下一组调入栈
练习 5 易错

采用成组链接法(每组 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 文件的基本操作

六个系统调用
  1. create:为新文件分配外存空间,在目录中建立 FCB(建立的是「文件存在」这个事实,内容还要靠 write 写入);
  2. delete:检索目录找到 FCB → 回收磁盘块(位示图/成组链接)→ 删除目录项;有共享(硬链接)时先减计数;
  3. open:检索目录,把 FCB(inode)副本调入内存,登记到「打开文件表」,向用户返回文件描述符 fd;
  4. close:删除进程中该表项,系统表打开计数减 1;减到 0 说明无人再用,写回修改过的 FCB、回收其内存副本;
  5. read:按 fd 找到打开文件表项 → 由系统级表项中的 FCB 信息把「逻辑地址 → 逻辑块号 → 物理块号」→ 启动磁盘读;
  6. write:同上定位后写入;需要新块时调存储空间管理程序分配。
两张打开文件表进程级(每进程一张):表项 = fd → 指向系统级表项的指针 + 读写指针(本进程自己的位置);系统级(整个 OS 一张):表项 = FCB 副本 + 打开计数器(多少进程打开了它)+ 共享方式。父进程与子进程可共享同一系统级表项(共享读写指针),而两个进程独立 open 同一文件则各有读写指针。
open 之后 read 不再查目录的原因:open 已把 FCB(含物理位置)搬进内存打开文件表,read 只需沿 fd → 进程表 → 系统表直达元数据——省掉的是每读一次就检索一遍目录的磁盘 IO。
// 用户视角的一条完整链路(体会「open 一次、多次 read」的收益)
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 才真正清系统表项
例 7 真题风格 open 系统调用的正确流程排序

用户进程首次执行 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 才真正清系统表项)。

逻辑地址 → 物理块号完整流程① 由字节偏移算逻辑块号:\(\text{逻辑块号}=\lfloor\text{偏移}/\text{块大小}\rfloor\),\(\text{块内偏移}=\text{偏移}\bmod\text{块大小}\);② 按物理结构映射成物理块号:连续分配「起始块号 + 逻辑块号」;隐式链接「顺链走 n−1 步」;FAT「沿内存 FAT 链走」;索引「查索引表(多级则逐级查)」;③ 由设备驱动把物理块号换算为磁道、扇区,启动 IO。

4.7 文件共享与保护

4.7.1 基于索引结点的硬链接与符号链接(软链接)

硬链接多个目录项的「文件名 → inode 号」指向同一个 inode,inode 中维护链接计数 count。删除文件(unlink/rm)时 count 减 1:减完仍 > 0,只删本目录项、数据不动;减到 0 才真正回收磁盘块和 inode。特点:共享同一份实体、count 一致;但不能跨文件系统(inode 号只在本文件系统内有意义)、一般不能链接目录(防环)。
符号链接(软链接)link 型文件内容是目标的路径名(类似 Windows 快捷方式)。访问时先读 link 文件、得到路径,再按路径重新检索目录(多一次甚至多次目录检索/读盘)。源文件被删除后 link 仍存在但指向落空 → 悬空链接。优点:可跨文件系统、可链接目录、可链接网络上其他主机的文件。
易错① 删除「硬链接的源文件」这种说法本身有误导:硬链接无主从,删任一名字只是 count 减 1,只要 count > 0 文件实体完好;
② 软链接删除源后链接悬空,硬链接删除源后其他名字照常访问;
③ 软链接访问成本更高(要多次检索目录);
④ 硬链接的 count 存在 inode 中,不是目录项中。
例 8 高频考点 链接计数 count 的删除语义

文件 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 文件保护:口令、加密与访问控制

三种方案① 口令:FCB 中存口令,验证开销小、空间省;但口令存在系统内,易被窃取/破译(系统管理员可见);
② 加密:内容以密文存储,密钥在用户手里——保密性最强,但加/解密要耗费大量 CPU 时间;
③ 访问控制(ACL):每个文件一张访问控制表,登记「用户/用户组 → 读/写/执行权限」,检查灵活精细;表占空间且管理开销大,可按组压缩。现代系统还用简化版 rwx 三类用户(属主/同组/其他)位。
保护域与访问矩阵形式化模型:行 = 域(主体,如进程),列 = 对象(资源,如文件),矩阵元素 = 该域对该对象的访问权集合。按列实现即 ACL(每对象一张表),按行实现即能力表(权能表)(每域一张可访问对象清单)。切换域(进程切换身份)对应访问矩阵的行切换。
练习 6

将「口令、加密、访问控制(ACL)」与下列描述一一对应:(1) 保密性强但加解密费时;(2) 空间最省、验证快,但口令本身存在系统内易泄露;(3) 按「用户—权限」逐条登记,粒度最细、便于灵活授权。

查看答案

(1) 加密;(2) 口令;(3) 访问控制 ACL。

延伸:ACL 是访问矩阵「按列」存储的实现;能力表则是「按行」的实现。

4.8 文件系统全局结构与 VFS

从裸盘到可用分区:磁盘先被划分为一个或多个逻辑分区(卷)。每个分区内:
① 物理格式化(低级格式化):划分扇区、检测坏扇区并用备用扇区替换坏扇区;
② 逻辑格式化(高级格式化):创建文件系统——初始化超级块、空闲块管理结构(位示图/成组链接的栈)、inode 区、根目录、数据区,将整块物理块分组为簇等分配单元。
引导块:计算机启动时,固化在 ROM 的自举程序先读入磁盘主引导记录 MBR(含分区表与引导程序),再由它定位活动分区的引导块(分区第一块附近固定位置),把操作系统内核载入内存——即使分区无操作系统,引导块位置也是保留的。
超级块:存放文件系统全局参数(总块数、空闲块数、空闲块指针、inode 区大小等),开机后与位图等一起被缓存进内存。
VFS(虚拟文件系统)Linux 等系统在真实文件系统之上加一层 VFS:
① 向上提供统一系统调用接口(open/read/write/close),用户程序无需关心底层是 ext4、NTFS 还是 FAT32;
② 向下要求各文件系统实现统一的对象与操作函数(VFS 四大核心对象:超级块对象、索引结点对象、目录项对象、文件对象);
③ 文件系统必须先挂载(mount)到 VFS 树上才能被访问;对网络文件系统(NFS),VFS 还把请求转发给远程服务程序,实现「本地操作远端文件」的透明性。
一句话记忆物理格式化管扇区(硬件层),逻辑格式化管文件系统(软件层);VFS = 「向上统一接口、向下适配差异」,它只是软件层,本身不存数据。

4.9 章末自测 真题风格

限时 60 分钟,先做后看答案。难度:★★ 基础 / ★★★ 强化 / ★★★★ 冲刺。所有计算题代具体数值验证后再选/填。

自测 1(选择 · ★★)

下列关于文件逻辑结构与物理结构的叙述中,正确的是( )
A. 顺序文件是一种文件的物理结构 B. 文件的逻辑结构对用户是透明的 C. 文件的物理结构对用户是透明的 D. 流式文件是记录式文件的一种

查看答案

C。A 错:顺序文件(串结构/顺序结构)是逻辑结构,连续分配才是对应的物理结构;B 错:逻辑结构用户直接可见(决定记录如何组织);C 对:逻辑块如何映射到盘块由文件系统负责,用户无感知;D 错:流式文件即无结构文件,与记录式相对。

自测 2(选择 · ★★★)

用户进程发出 read 系统调用后,请求在文件系统内部自顶向下的传递顺序是( )
A. 用户接口 → 文件目录系统 → 存取控制 → 逻辑文件系统 → 物理文件系统 → 设备管理
B. 用户接口 → 存取控制 → 文件目录系统 → 物理文件系统 → 逻辑文件系统 → 设备管理
C. 用户接口 → 文件目录系统 → 逻辑文件系统 → 存取控制 → 物理文件系统 → 设备管理
D. 用户接口 → 逻辑文件系统 → 文件目录系统 → 存取控制 → 物理文件系统 → 设备管理

查看答案

A。先检索目录找到 FCB(文件目录系统),再验权限(存取控制),然后「逻辑记录 → 逻辑块」(逻辑文件系统),再「逻辑块 → 物理块」(物理文件系统),最后交给设备驱动。记忆锚点:先找人(目录)再验身份(权限),两次翻译(逻辑→逻辑块→物理块)后交给驱动。

自测 3(选择 · ★★★ 高频考点)

关于文件分配表 FAT 的叙述中,错误的是( )
A. 整个物理磁盘只维护一张统一的 FAT B. FAT 的表项数与磁盘盘块数相同 C. 开机后 FAT 整体读入内存并常驻,查表不需要启动磁盘 D. FAT 方式下文件支持随机访问

查看答案

A。FAT 是每个分区一张,不是整盘一张(不同分区可装不同文件系统)。B 对:表项序号即盘块号,一一对应;C 对:这是显式链接相比隐式链接的核心优势;D 对:在内存 FAT 上顺链即可直接定位第 i 块。补充:隐式链接因指针藏在盘块尾部,只查指针就要启动磁盘,故不支持随机访问。

自测 4(选择 · ★★★)

Unix 采用混合索引(直接地址 + 多级间接地址)的主要目的是( )
A. 消除外部碎片 B. 小文件访问快,同时又能支持很大的文件 C. 节省磁盘空间 D. 便于实现文件共享

查看答案

B。绝大多数文件是小文件,直接地址项使其访问只需 1 次 IO;偶发的巨型文件再逐级启用间接地址扩充容量——两级目标兼顾才是动机。A、C 不是混合索引的目的(链接/索引分配本就无外部碎片);D 与共享无关(共享靠 inode 硬链接/软链接)。

自测 5(填空 · ★★★★ 真题风格)

(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\) ✓)

自测 6(选择 · ★★★ 高频考点)

进程已成功 open 某文件并多次 read。下列说法错误的是( )
A. 每次 read 都需要重新检索目录 B. fd 是进程打开文件表的索引 C. 系统级打开文件表中有 FCB 副本和打开计数 D. 多个进程独立 open 同一文件时各有自己的读写指针

查看答案

A。open 已把 FCB 调入内存打开文件表,read 沿 fd → 进程表 → 系统表直接定位,不再查目录——这正是 open 存在的意义。B、C、D 均正确:父子进程共享系统级表项才共享读写指针。

自测 7(选择 · ★★★)

用户 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 才悬空。易错点:删除的是「目录项」还是「整个文件实体」,务必分开。

自测 8(填空 · ★★★)

磁盘块用位示图管理,字长 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\) ✓。

自测 9(解答 · ★★★★ 冲刺)

某文件系统物理块 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 次)。

自测 10(解答 · ★★★★ 冲刺)

某文件占 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 向上统一接口、向下适配差异
下一步本章过关标准:能白板推导混合索引四级容量(48KB/4MB/4GB/4TB)与读块 IO 次数;位示图正反互算 30 秒内出结果;能口述 open 五步与两张打开文件表;三种物理分配的对比表能默写。然后进入 第 5 章 输入/输出(I/O)管理——设备独立性与磁盘调度算法是下一站的两个制高点。