Appearance
题目
某文件系统为一级目录结构,文件的数据一次性写入磁盘,已写入的文件不可修改,但可多次创建新文件。请回答以下问题:
(1) 在连续、链式、索引三种文件的数据块组织方式中,哪种更合适?要求说明理由。为定位文件数据块,需要在 FCB 中设计哪些相关描述字段?
(2) 为快速找到文件,对于 FCB,是集中存储好,还是与对应的文件数据块连续存储好?要求说明理由。
解析
(1)选哪种文件分配方式?
答:选连续分配(连续结构)。
三种方式对比
| 方式 | 优点 | 缺点 | 是否适合本题 |
|---|---|---|---|
| 连续分配 | 顺序访问 / 随机访问都很快、磁头移动少 | 易产生外碎片、文件难扩展 | ✅ |
| 链式分配 | 无外碎片、易扩展 | 随机访问慢(要追链)、可靠性差(指针损坏链断) | ❌ |
| 索引分配 | 无外碎片、随机访问快 | 索引块本身占空间、小文件浪费 | ❌ |
为什么连续分配最合适?
题面给了三个关键约束:
- 数据一次性写入 → 文件创建时就知道完整大小 → 可一次性算出需要多少块、定位连续空间,避免连续分配最大的痛点(不知道扩多大)
- 写完不可修改 → 不会再追加 → 不存在"扩展时连续区不够"的问题
- 可多次创建新文件 → 每次新文件都从空闲区找一段连续 → 长期使用会产生外碎片,但碎片可通过"紧凑(Compaction)"或"按文件大小排序分配"缓解
链式 / 索引分配的"易扩展"优势在本题完全用不上(不修改),它们的"随机访问慢 / 索引块开销"反而成为净劣势。
FCB 需要哪些字段?
定位连续区只需两个数:起点 + 长度。两种等价写法:
- 方案 A:
<起始块号, 块数>—— 长度直观 - 方案 B:
<起始块号, 结束块号>—— 边界直观
任选其一即可。其它通用 FCB 字段(文件名、文件类型、创建时间、保护位等)题目没问,不用列。
编者注(答题套路):
- 选择题问"哪种分配方式适合 X"时,先看是否需要扩展、是否随机访问、文件大小是否已知这三点。WORM(Write Once Read Many)类系统、CD-ROM、备份介质几乎一律答连续分配。
- 列字段时只列"定位用"的最小集合——不要把"创建时间、保护权限"全列上去显得啰嗦,反而抓不住考点。
(2)FCB 集中存储 vs 与文件数据连续存储?
答:集中存储(FCB 表区独立)更好。
两种方案对比
方案 A:所有 FCB 集中放在磁盘的某个固定区域(FCB 表区)
- 查找文件名时:只需读 FCB 表区——磁头集中在一小段连续磁道、I/O 次数极少
- 找到 FCB 后再去访问对应的文件数据
方案 B:每个 FCB 紧挨着自己的文件数据块
- 查找文件名时:要么扫描整个磁盘上的所有 FCB(磁头大范围跳跃),要么维护一个全局索引(索引本身又是个集中表——绕回方案 A)
- I/O 次数和寻道时间显著增加
数量级感知
假设文件系统有 N 个文件、每个 FCB 占 64 B:
| 方案 | 查找一个文件名的成本 |
|---|---|
| A:FCB 集中 | 读 N × 64 B 的连续区域(如 1000 个文件 = 64 KB ≈ 16 个磁盘块) |
| B:FCB 散落 | 平均要跳到 N/2 个不同的物理位置上读 64 B |
A 方案在文件数较多时优势压倒性。所以一级目录结构里,FCB 集中存储几乎是默认选择。
编者注(推广):
- 这个思路在 Unix 文件系统里就是 inode 表:所有 inode 集中放在分区的固定区域,目录项只存"文件名 + inode 号"。
- 文件数据按需散落到数据块区。
- 这种"元数据(metadata)集中、数据(data)分散"的设计是 OS 文件系统的通用最佳实践,2016-47、2022-45、2026-46 三道大题考的都是基于这种结构。
- 反例是 FAT 文件系统:FCB 散落在目录文件里——这种结构在 N 大时性能就退化(要遍历整个目录)。