Appearance
文件的物理结构
考情分析
文件物理结构是文件管理章节的最高频考点,几乎每隔一两年就出现在真题中。连续分配、链接分配、索引分配的优缺点对比是选择题常客,混合索引的地址计算则是大题常见考法。🔥🔥🔥 高频核心。
文件的数据要分配到磁盘块上——连续放?链式放?建索引?每种方式都在空间利用率和访问速度之间做取舍,这也是本章出计算大题最密集的地方。
磁盘块与文件分配
磁盘被划分为大小相等的磁盘块(block),文件的物理结构就是解决一个问题:如何把文件的数据分配到磁盘块上?
连续分配
每个文件占用一组连续的磁盘块。目录项中记录起始块号和长度。连续分配就像在书架上给一本书预留一整排连续的格子——读起来最快,但中间插不进新书。
目录项: {文件名: "data.txt", 起始块: 5, 长度: 4}
磁盘块: ... | 5 | 6 | 7 | 8 | ...
└── data.txt ──┘交互可视化
优缺点
| 优点 | 缺点 |
|---|---|
| 支持顺序存取和随机存取 | 产生外部碎片 |
| 顺序读写速度最快(磁头不需要移动) | 文件不能动态增长 |
| 实现简单,只需起始块号+长度 | 必须预先知道文件大小 |
随机存取方式:要访问文件的第 i 个块,直接计算 起始块号 + i 即可。
链接分配
隐式链接
每个磁盘块中保留一个指针域,指向下一个磁盘块。目录项记录起始块和结束块。隐式链接就像寻宝游戏——每个线索只告诉你下一站在哪,想去第五站必须从第一站开始跑。
目录项: {文件名: "log.txt", 起始块: 2, 结束块: 10}
块2 块5 块8 块10
┌─────┬──┐ ┌─────┬──┐ ┌─────┬──┐ ┌─────┬────┐
│数据 │→5│→│数据 │→8│→│数据│→10│→│数据 │null│
└─────┴──┘ └─────┴──┘ └─────┴──┘ └─────┴────┘| 优点 | 缺点 |
|---|---|
| 无外部碎片 | 只能顺序存取,不支持随机存取 |
| 文件可动态增长 | 指针占用空间 |
| 无需预知文件大小 | 指针损坏会导致文件丢失 |
显式链接(FAT)
将所有磁盘块的链接指针集中存放在一张**文件分配表(FAT, File Allocation Table)**中。FAT 常驻内存。
FAT 表:
磁盘块号: 0 1 2 3 4 5 6 7 8 ...
指针值: -1 -1 5 -1 -1 8 -1 -1 10 ...
↓ ↓ ↓
起始块2 → 块5 → 块8 → 块10(结束)| 优点 | 缺点 |
|---|---|
| 支持随机存取(在内存中的 FAT 中查找) | FAT 需要占用内存空间 |
| 检索速度比隐式链接快得多 | 磁盘块越多,FAT 越大 |
隐式链接 vs 显式链接
这是选择题高频陷阱。隐式链接不支持随机存取(必须沿链逐块读取);显式链接(FAT)支持随机存取(FAT 在内存中,可以快速遍历链)。
交互可视化
索引分配
为每个文件建立一个索引块,索引块中存放该文件所有磁盘块的块号。
目录项: {文件名: "code.c", 索引块: 15}
索引块15
┌────────┐
│ 块号2 │ → 数据块2
│ 块号8 │ → 数据块8
│ 块号5 │ → 数据块5
│ 块号12 │ → 数据块12
└────────┘| 优点 | 缺点 |
|---|---|
| 支持随机存取 | 索引块本身占用磁盘空间 |
| 无外部碎片 | 小文件也需要一个索引块(浪费) |
| 文件可动态增长 | 大文件需要多级索引 |
大文件的索引组织
当一个索引块装不下所有块号时,有三种方案:
链接索引:将多个索引块通过指针串联起来。
多级索引:类似多级页表,使用间接索引。若每个磁盘块 1KB,块号占 4B,则一个索引块可存放 256 个块号:
| 索引级数 | 可寻址的最大文件 |
|---|---|
| 一级 | |
| 二级 | |
| 三级 |
混合索引(Unix 方案) 🔥🔥🔥
Unix inode 中使用混合索引方式,兼顾小文件效率和大文件容量:
inode 中的块指针:
├── 直接块指针 × 12 → 直接指向数据块
├── 一次间接块指针 × 1 → 指向索引块 → 数据块
├── 二次间接块指针 × 1 → 索引块 → 索引块 → 数据块
└── 三次间接块指针 × 1 → 索引块 → 索引块 → 索引块 → 数据块计算示例:设磁盘块大小 4KB,块号占 4B:
- 每个索引块可存储
1024 个块号 - 直接块:
48KB - 一次间接:
4MB - 二次间接:
4GB - 三次间接:
4TB
交互可视化
三种分配方式对比
| 分配方式 | 顺序存取 | 随机存取 | 外部碎片 | 文件增长 | 适用场景 |
|---|---|---|---|---|---|
| 连续分配 | 最快 | 支持 | 有 | 困难 | 文件大小固定 |
| 隐式链接 | 支持 | 不支持 | 无 | 方便 | 顺序存取文件 |
| 显式链接(FAT) | 支持 | 支持 | 无 | 方便 | FAT 文件系统 |
| 索引分配 | 支持 | 支持 | 无 | 方便 | Unix/Linux |
考研高频考点
- 🔥🔥🔥 混合索引的最大文件大小计算(给定块大小和块号字节数)
- 🔥🔥🔥 三种分配方式各自是否支持随机存取
- 🔥🔥🔥 隐式链接 vs 显式链接(FAT)的区别(随机存取能力)
- 🔥🔥 连续分配的外部碎片问题
- 🔥🔥 访问文件第 n 个块需要几次磁盘 I/O(不同分配方式下)
- 🔥 索引分配中索引块本身的空间开销
文件分配到磁盘块上之后,用户还需要通过文件名找到文件——这就是目录的工作,下一篇展开。