Appearance
题目
某磁盘文件系统使用链接分配方式组织文件,簇大小为 4 KB。目录文件的每个目录项包括"文件名 + 文件的第一个簇号",其余簇号存放在文件分配表(FAT)中。
(1) 假定目录树结构与各文件占用的簇号顺序如下图所示(dir、dir1 是目录;file1、file2 是用户文件)。请给出所有目录文件的内容。
(2) 若 FAT 的每个表项仅存放簇号,占 2 个字节,则 FAT 的最大长度为多少字节?该文件系统支持的文件长度最大是多少?
(3) 系统通过目录文件和 FAT 实现对文件的按名存取,说明 file1 的 106、108 两个簇号分别存放在 FAT 的哪个表项中。
(4) 假设仅 FAT 和 dir 目录文件已读入内存,若需将文件 dir/dir1/file1 的第 5000 个字节读入内存,则要访问哪几个簇?
解析
(1)两个目录文件的内容
关键点:链接分配下,目录项里只存文件的"首簇号",剩余簇号链在 FAT 里。所以目录文件内容只关心"每个直接子项的名字 + 它的首簇号"。
从树结构看:
- dir 的直接子项只有 dir1(首簇号 48)
- dir1 的直接子项有 file1(首簇号 100)、file2(首簇号 200)
所以两个目录文件的内容如下:
dir 目录文件:
| 文件名 | 簇号 |
|---|---|
| dir1 | 48 |
dir1 目录文件:
| 文件名 | 簇号 |
|---|---|
| file1 | 100 |
| file2 | 200 |
编者注(易错点):题目给的"簇号(按顺序)"那一列里,file1 是「100、106、108」三个簇——但目录项里只写第一个簇 100,后两个簇的位置由 FAT 接力告诉你。这就是"链接分配"的精髓。把全部簇号一股脑塞进目录项,是读到题没看清"链接分配"四个字的常见错。
(2)FAT 最大长度 + 文件最大长度
- FAT 表项 = 2 B = 16 比特 → FAT 最多有 个表项
- 每个表项对应一个簇 → 文件系统最多管理 个簇
由此:
编者注(评分提示):考虑到 FAT 实际还要保留若干表项作"文件结束符"、"坏块标志"、"保留簇 0/1" 等,理论可用簇数会略小。题目明示"仅存放簇号"时按 算即可,但若你在答题中标注了这一点并按""计算,标准答案给"答案正确同样给分"。
(3)106 和 108 存在 FAT 哪个表项
链接分配的核心规则:
FAT[i] 的内容 = 文件中"i 号簇的下一个簇号"
file1 占用簇序列是 100 → 106 → 108:
| 在 file1 里的位置 | 簇号 | "下一个"簇号 | 写入 FAT 哪一格 |
|---|---|---|---|
| 第 1 簇 | 100 | 106 | FAT[100] = 106 |
| 第 2 簇 | 106 | 108 | FAT[106] = 108 |
| 第 3 簇(末簇) | 108 | EOF | FAT[108] = EOF |
所以:
- 簇号 106 存在 FAT 的 100 号表项中
- 簇号 108 存在 FAT 的 106 号表项中
编者注(易错点):很多同学把"簇号 106 存在 FAT[106]"这种"对号入座"思维带进来——错。FAT 是"上一格指向下一格"的链表,不是"哈希表"。FAT[N] 永远存的是"N 号簇之后该读哪一簇",不是 N 号簇本身。
(4)读取 dir/dir1/file1 第 5000 字节要访问哪些簇
题面已说"FAT 和 dir 目录文件已在内存",所以dir 自己的簇不用再读磁盘。剩下要做的:
- 找 dir1:在内存中的 dir 里查到 dir1 的首簇号 = 48 → 读磁盘 48 号簇 拿到 dir1 目录文件
- 找 file1:在 dir1 里查到 file1 的首簇号 = 100。注意:FAT 在内存,所以从 100 出发追链
100 → 106 → 108不用读磁盘,纯查表 - 定位第 5000 字节:簇大小 4 KB = 4096 B
- 余
- 即第 5000 字节落在 file1 的第 2 簇(编号从 0 算)—— 也就是簇号 106
- 读数据:读磁盘 106 号簇
最终需要访问的磁盘簇是 48 号簇(dir1 目录)和 106 号簇(file1 数据),共 2 个簇。
编者注(易错点):
- 不要算成 100 号簇——5000 > 4096 已经越过了第 1 簇
- 不要漏算"读 dir1"——题面只说 dir 在内存,dir1 仍要从磁盘读
- FAT 在内存所以追链不算盘 I/O,但 FAT 不在内存的题型(如 2022-26)就要把每次"看一格 FAT"也算成读磁盘