Appearance
题目
(本题满分 8 分)
文件系统的目录项包括文件名和索引节点号。磁盘包含索引节点表、位图、目录、文件数据等元数据。设:
- 盘块大小 = 4 KB,盘块号占 4 B
- 索引节点表存放系统所有文件,从 0 开始编号,存放在盘块号 100 开始连续的 4096 个盘块中
- 索引节点占用 128 B,包含直接地址项 5 个 + 一级间接地址项、二级间接地址项、三级间接地址项各 1 个
- 磁盘位示图 / 索引节点位示图分别记录磁盘 / 索引节点的使用情况,0 = 未使用、1 = 已使用
目录结构与各文件的索引节点号如下图所示,file 文件占 30 KB。
(1)file 的索引节点所在的盘块号是多少?若 file 的索引节点已经读取到内存,要访问 file 文件中偏移地址 21460 的一个字节数据,则最多需要读多少个盘块?如果文件系统中有足够的磁盘空间,则最多可以存放多少个文件?(3 分)
(2)如果要删除目录 dir1,则需要对元数据进行哪些操作?(5 分)
解析
(1)三小问拆解
① file 的索引节点所在盘块号
每个盘块能装多少个索引节点?
索引节点表从盘块号 100 开始,inode 编号从 0 开始。inode 1000 在第几个盘块?
也就是说 inode 1000 是第 31 个盘块的第 8 个 inode(块内编号从 0 开始)。所以盘块号是:
编者注(易错点):1000 mod 32 = 8 是块内的偏移编号,不是字节偏移。要换成字节偏移得乘 128,即第 8 × 128 = 1024 字节起。这一步不影响答盘块号,但若题目还问"在该盘块的第几个字节"就要算清楚。
② 访问偏移 21460 的字节最多读几个盘块
Step 1:偏移 21460 在 file 的第几个逻辑块?
所以是 file 的逻辑块 5(从 0 开始编号)。
Step 2:逻辑块 5 该走哪一级寻址?
| 逻辑块号区间 | 走哪级寻址 | 取数据要读几个盘块 |
|---|---|---|
| 0 ~ 4 | 直接地址项(5 个) | 1(数据块) |
| 5 ~ 5+1024-1 | 一级间接 | 2(一级间接表块 + 数据块) |
| 5+1024 ~ 5+1024+1024² | 二级间接 | 3 |
| 更高 | 三级间接 | 4 |
逻辑块 5 正好是一级间接的第 0 项——前 5 个块(0~4)已经被直接地址项管完了,第 6 块(编号 5)必须经过一级间接索引。
Step 3:题面说 inode 已在内存 → inode 那一步不用读盘。但一级间接表块仍在磁盘上,必须读出来才能查到逻辑块 5 对应的实际盘块号;接着再读数据块本身。
最终:最多需要读 2 个盘块(一级间接表块 + 数据块)。
编者注(易错点):
- 不要漏算"读一级间接表块"——它本身也是磁盘上的盘块。inode 在内存只是省了"读 inode"那一步
- 也不要多算 inode——题面说了它在内存里
- "最多"两个字也很关键。如果一级间接表所在盘块碰巧也已在内存,那只需 1 个;题目问的是 worst case
③ 最多可存放多少个文件
每个文件(含目录)占 1 个 inode。inode 总数:
所以最多可存放 131072 个文件。
编者注(易错点):题面问的是"文件总数"上限,受 inode 表容量约束(每个文件至少 1 个 inode),不受数据空间约束(题目说"足够的磁盘空间")。看到"足够磁盘空间"几个字立刻知道瓶颈在 inode 数量,别去算簇能装下多少 4 KB 文件。
(2)删除目录 dir1 要做哪些元数据操作
dir1 是非空目录(里面还有 file),所以先递归删除内部文件,再删自己。
Step 1:删除 file(inode 号 1000)
| 操作 | 影响的元数据 |
|---|---|
| 释放 file 的所有数据块(5 个直接块 + 间接块本身 + 间接块指向的数据块) | 磁盘位示图 对应位 1→0 |
| 注销 inode 1000 | 索引节点位示图 第 1000 位 1→0 |
| 把 dir1 目录里"file → 1000"那一项删掉 | dir1 的目录数据块 改写 |
Step 2:删除 dir1(inode 号 201)
| 操作 | 影响的元数据 |
|---|---|
| 释放 dir1 自身的目录数据块(存目录项的那些块) | 磁盘位示图 对应位 1→0 |
| 注销 inode 201 | 索引节点位示图 第 201 位 1→0 |
| 把 dir 目录里"dir1 → 201"那一项删掉 | dir 的目录数据块 改写 |
编者注(易错点 / 答题套路):
- 递归删除是关键。若答"直接删 dir1"会丢分——目录非空时要先把孩子清空。这也是 Unix
rm默认禁止删非空目录的原因(rm -r才行)。- 三类元数据要同时考虑:
- 数据块归还(磁盘位示图)
- inode 归还(索引节点位示图)
- 父目录里的目录项删除(数据块改写) 漏掉任意一类都会扣分,建议答题时按这三大类逐项展开。
- "间接块本身"不要忘——它也占着盘块,删 file 时要一并归还。同理,二级 / 三级间接还要释放更多层级的间接块。