Appearance
题目
某文件系统空间的最大容量为 4 TB(),以磁盘块为基本分配单位。磁盘块大小为 1 KB。文件控制块(FCB)包含一个 512 B 的索引表区。请回答下列问题:
(1) 假设索引表区仅采用直接索引结构,索引表区存放文件占用的磁盘块号。索引表项中块号最少占多少字节?可支持的单个文件最大长度是多少字节?
(2) 假设索引表区采用如下结构:第 0~7 字节采用 <起始块号, 块数> 格式表示文件创建时预分配的连续存储空间(其中起始块号占 6 B、块数占 2 B);剩余 504 字节采用直接索引结构,一个索引项占 6 B。那么:
- 可支持的单个文件最大长度是多少字节?
- 为了使单个文件长度达到最大,请指出起始块号和块数分别所占字节数的合理值并说明理由。
解析
(1)纯直接索引:算块号位宽 + 最大文件长度
Step 1:磁盘块总数
Step 2:块号需要多少位 / 多少字节
要给 个块唯一编号,需 32 位:
Step 3:索引表区能装多少索引项
每项指向 1 个磁盘块。
Step 4:最大文件长度
编者注(易错点):
- 块号位宽取决于整个文件系统的总块数,不是单文件最大块数。即使单文件最多只有 128 块,块号仍要能区分整个 4 TB 上的 个块。
- 4 B = 32 位 → 恰好够编 个块。如果系统再大一倍到 8 TB,块号就要 33 位,向上取整成 5 B(实际工程里通常一步取到 8 B 留余量)。
(2)混合索引:连续区 + 直接索引
拆解索引表区结构
| 字节范围 | 字段 | 大小 | 用途 |
|---|---|---|---|
| 0 ~ 5 | 起始块号 | 6 B | 预分配连续区的起点块号 |
| 6 ~ 7 | 块数 | 2 B | 预分配连续区的块数 |
| 8 ~ 511 | 直接索引区 | 504 B = 84 项 × 6 B | 后续每块单独编址 |
Step 1:连续区的容量
- 起始块号 6 B = 48 bit → 可寻址 个块(远超 4 TB 总数 ,没问题)
- 块数 2 B = 16 bit → 一段连续区最大 块
Step 2:直接索引区的容量
- 索引区 504 B、每项 6 B → 项
- 每项指向 1 块
Step 3:混合后的单文件最大长度
Step 4:起始块号 / 块数 的字段如何分配能让"连续区"撑满 4 TB?
题给"起始块号 6 B + 块数 2 B"= 8 B 总预算。但目前的 2 B 块数只能管 块 = 64 MB——离 4 TB( 块)差 16 个 bit,瓶颈在块数字段。
调整方案:把 8 B 总预算对半分——起始块号 4 B、块数 4 B:
| 字段 | 字节数 | 可表示 | 说明 |
|---|---|---|---|
| 起始块号 | 4 B = 32 bit | 个块号 | 正好能寻址 4 TB 内任一块 |
| 块数 | 4 B = 32 bit | 块 | 单文件连续区可撑满整个 4 TB |
理由:起始块号 4 B 已经是寻址 4 TB 的最低需求——再少寻不到所有块;块数也 4 B → 连续区能从 0 一直占到 4 TB 末尾。两边都"刚好够",没有浪费、也没有不足。
调整后单文件最大长度 = (被整个文件系统容量约束)。
编者注(思路提炼):
- 这类"字段位宽优化"题的统一思路:找出哪个字段是当前的瓶颈,在不增加总预算的前提下重新分配。
- 本题瓶颈是"块数 2 B 只能管 64 MB"——不是"起始块号不够"。所以从起始块号那里"借" 2 B 给块数。
- 不能让块数超过 4 B。如果你激进地把"块数"扩到 6 B(块数 )、起始块号砍到 2 B(只能寻址 块 = 64 MB),那起始块号就寻不到整个文件系统了,反而退化。两个字段必须同时够大。
- 8 B 总预算下,4-4 分配是唯一最优解——这也是为什么本题可以"指出合理值"。