Appearance
文件系统:数叶子得最大文件,数层数得读几次盘(专题总纲)
Intro
这一类题的题面几乎长成一个样子:给你簇大小、地址项长度、几个直接地址项加几级间接,配一张目录树的图,然后问最大文件多大、读某个字节要访问几个盘块。
参数很多,但它们描述的是同一样东西——整张图上只叠着两棵树:
目录树——按名字找到索引节点;索引树——按偏移找到数据块。
要算个数出来的小问,大多在这两棵树上做同一件事:
- 数叶子 → 这棵树最多能挂多少个数据块 → 最大文件长度
- 数层数 → 从根走到那片叶子要落几次盘 → 访问一次要读几个盘块
这两个动作撑起七道真题里的绝大多数小问。参数再多,也只是在决定树有多宽、有多高。
(「簇」和「盘块」在这一章里是同一个东西,只是各年题面用词不同:2016、2018 说簇,2026 说盘块。本文跟着被引的那道题走。)
剩下的是不用算的那一类——选哪种组织方式、删一个目录要动哪些元数据。它们问的是这两棵树该长成什么样、改一处要跟着改哪几处,本文最后一节单独说。
三种分配方式,是同一棵树的三种形状
教材把连续、链接、索引并列成三种"方式",但放到这两个动作下面看,它们只是树的三种形状:
| 分配方式 | 树长什么样 | 随机访问第 |
|---|---|---|
| 连续 | 没有树,起始块号加 | 0 步,地址是算出来的 |
| 链接 / FAT | 一条链,深度等于逻辑块号 | 沿链走 |
| 索引(混合) | 一棵矮而宽的树,深度最多 4 | 走到第几级看 |
连续分配随机访问最快、插入最贵;链接分配插入最便宜、随机访问最贵——2014 年那道题把两者摆在一起问同一个插入操作,考的就是这个权衡。
索引分配的宽度由一个除法定出来:
2018 年那道是
数叶子:最大文件长度
把四段的簇数加起来乘簇大小就是答案。2018 年那道的四段拆开看,量级差得很悬殊:
| 来源 | 簇数 × 4 KB | 大小 |
|---|---|---|
| 直接地址项(8 个) | 32 KB | |
| 一级间接 | 4 MB | |
| 二级间接 | 4 GB | |
| 三级间接 | 4 TB |
三级间接一项就压倒了前三段之和。这也解释了 UNIX 类文件系统为什么这样分段:绝大多数文件小到只用直接地址项、一次间接都不必走,而少数巨大文件靠最后一级兜住。
换成链接分配,树退化成一条链,能挂多少块由指针宽度决定而不是索引项个数。2014 年那道每块 1 KB、其中 4 B 放指针,块号 4 B 就能编
换成 FAT,上限由表项宽度决定。2016 年那道表项 2 B,所以最多
数层数:一次访问要落几次盘
这是这类题真正拉开分差的地方。做法只有一步:把这次访问经过的每一环列出来,一个都别漏。
2026 年那道问「inode 已在内存,访问偏移 21460 的一个字节最多读几个盘块」:
偏移 21460 ÷ 4096 = 5 余 980 → 逻辑块 5
逻辑块 0~4 归 5 个直接地址项管 → 5 不在里面
逻辑块 5 是一级间接的第 0 项 → 走一级间接
① 读一级间接表块 ← 这一块自己也在磁盘上
② 读数据块
共 2 个盘块第 ① 步是最常丢的那一分。 间接表块不是凭空存在的索引,它自己就是一个盘块,要读进来才能查。inode 在内存只省掉了「读 inode」那一步,省不掉它。
必错点
题面说什么已经在内存,就少数一环。 这句前提换着位置出现在题面各处,而它直接改答案:
| 年份 | 题面给的前提 | 因此不计 |
|---|---|---|
| 2016 | FAT 和 dir 已在内存 | 追整条簇号链都不落盘,只读 dir1 和数据簇 |
| 2018 | 只问「获取最后一个簇号」 | 不含读数据块那一次 |
| 2026 | inode 已读入内存 | 不含读 inode 那一次,但间接表块照读 |
FAT[N] 存的是「N 号簇之后该读哪一簇」。 不是 N 号簇本身。2016 年那道问 106、108 两个簇号存在哪个表项里,答案是 FAT[100] 和 FAT[106]——链是往前指的,按号入座会全错。
判落在第几级,要拿累计边界比,不是拿簇数比。 2018 年那道的 F2 是 40 KB:先看
两个目录项的索引节点号相同,就是同一个文件。 2022 年那道给的表里 doc 和 course1 的索引节点号都是 10,这是硬链接——同一份数据两个名字,所以问 doc 占的磁盘块号,直接抄 course1 的 30。这一问不用算,看出来就得分。
编号起点会变。 inode 编号常从 0 起,盘块号有的题从 1 起。2026 年那道算 inode 1000 在哪块:
一道题的答卷长什么样
以 2026 年那道的第 (1) 问为例。三小问各写三到四行,把中间量都摆出来——这类题给分点几乎都落在中间量上。
① inode 1000 在哪个盘块
每块装的 inode 数 = 4096 / 128 = 32
1000 / 32 = 31 余 8 ← 商是块偏移,余数是块内序号
盘块号 = 100 + 31 = 131② 访问偏移 21460 最多读几个盘块(inode 已在内存)
21460 / 4096 = 5 余 980 → 逻辑块 5
直接项管 0~4,逻辑块 5 落一级间接的第 0 项
读一级间接表块 1 次 + 读数据块 1 次 = 2 个盘块③ 最多能存多少个文件
inode 表占 4096 个盘块 × 每块 32 个 inode = 131072 个 inode
每个文件至少占 1 个 inode → 最多 131072 个文件⚠️ 第 ③ 问这一档还要看题面有没有给数据区大小——给了就要两个上限取小。2018 年那道就是这个形态:inode 数量算出 64 M 个、数据空间算出 256 M 个,取小的 64 M。只算一边是这一问最常见的失分。
第 (2) 问「删掉一个目录要动哪些元数据」,分值比上面三小问加起来还高,而它考的是同一件事的反面:两棵树上摘掉一个节点,两张位示图都要跟着对账。
答法是按「自底向上、每一层三件事」逐层写。删 dir1 要先删它里面的 file:
先删 file(inode 1000):
① 释放它的数据块和间接块 → 改磁盘位示图
② 注销 inode 1000 → 改索引节点位示图
③ 删掉 dir1 里的 file 目录项
再删 dir1(inode 201):
① 释放 dir1 的目录数据块 → 改磁盘位示图
② 注销 inode 201 → 改索引节点位示图
③ 删掉 dir 里的 dir1 目录项三件事一件都不能少,两层都要写。 只写「改位示图、删目录项」而不分两层、不区分两张位示图,这一问就拿不满——它给的分正是按「每一层三件事」摊开的。
真题的两种形态
第一组 · 算容量与访盘次数(2012-46、2014-46、2016-47、2018-46、2026-46)——给参数,问最大文件长度、访问某个位置要读几个盘块、最多能存多少文件。做法就是上面那两个动作。
第二组 · 定性与读目录树(2011-46、2016-47(1)、2022-45)——给一张目录树的图,问目录项里装什么、按名存取要读哪几个盘块、某个块号是多少。这一组的关键是记住目录本身也是文件:读目录就是读它的数据块,所以路径有几层就多几次读盘。(2022 年那道的第 (4) 问「6 MB 要用到哪几级间接」其实是第一组的动作,混编在同一道题里。)
2011 年那道是唯一一道纯定性题:一次性写入、写完不改、一级目录,问三种组织方式选哪个。这类题的答法是拿题面给的每个约束逐条对照三种方式的代价——不可修改就不怕连续分配的插入代价,一级目录就不需要多级检索,于是连续分配的顺序访问优势全留下了。
交卷前扫一眼
先算「每块装几个地址项」· 数叶子求容量、数层数求访盘 · 间接表块自己也要读一次 · 题面说谁在内存就少数一环 · 问「最多存几个文件」时两个上限取小
配套内容
考纲要求、但这 7 道真题没有正面考过的(专题的巩固栏里配了题):
- 位示图与块号之间的双向换算——2026 年那道提到删除时要改位示图,但没让算过「第
字第 位对应哪个块号」 - 磁盘全局布局的五个区各占多少块——引导块、超级块、位示图、索引节点表、数据区怎么分,真题没考过
- 硬链接的链接计数怎么增减——2022 年那道只用硬链接推了一个块号;2026 年那道问了删除目录要动哪些元数据,擦到了边,但计数何时归零、归零后才真正释放数据块,没考过
- 内存映射文件——七道真题里一次都没出现
- 三种分配方式在访盘次数上的量化横向对比——2011 年那道让三选一,但看的是「一次性写入、不可修改」这类使用场景,不是数出来的访问次数;2014 年那道则只单独问了连续和链接各自的插入代价
逐题精讲(建设中)——真题作答与 AI 判分入口见站内大题专题。