Skip to content

2011年 408 操作系统 第 46 题

操作系统2011年综合题7分

题目

某文件系统为一级目录结构,文件的数据一次性写入磁盘已写入的文件不可修改,但可多次创建新文件。请回答以下问题:

(1) 在连续、链式、索引三种文件的数据块组织方式中,哪种更合适?要求说明理由。为定位文件数据块,需要在 FCB 中设计哪些相关描述字段?

(2) 为快速找到文件,对于 FCB,是集中存储好,还是与对应的文件数据块连续存储好?要求说明理由。

解析

(1)选哪种文件分配方式?

答:选连续分配(连续结构)。

三种方式对比

方式优点缺点是否适合本题
连续分配顺序访问 / 随机访问都很快、磁头移动少易产生外碎片、文件难扩展
链式分配无外碎片、易扩展随机访问慢(要追链)、可靠性差(指针损坏链断)
索引分配无外碎片、随机访问快索引块本身占空间、小文件浪费

为什么连续分配最合适?

题面给了三个关键约束:

  1. 数据一次性写入 → 文件创建时就知道完整大小 → 可一次性算出需要多少块、定位连续空间,避免连续分配最大的痛点(不知道扩多大)
  2. 写完不可修改 → 不会再追加 → 不存在"扩展时连续区不够"的问题
  3. 可多次创建新文件 → 每次新文件都从空闲区找一段连续 → 长期使用会产生外碎片,但碎片可通过"紧凑(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 大时性能就退化(要遍历整个目录)。

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题