Skip to content

文件的物理结构

考情分析

文件物理结构是文件管理章节的最高频考点,几乎每隔一两年就出现在真题中。连续分配、链接分配、索引分配的优缺点对比是选择题常客,混合索引的地址计算则是大题常见考法。🔥🔥🔥 高频核心。

文件的数据要分配到磁盘块上——连续放?链式放?建索引?每种方式都在空间利用率和访问速度之间做取舍,这也是本章出计算大题最密集的地方。

磁盘块与文件分配

磁盘被划分为大小相等的磁盘块(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 个块号:

索引级数可寻址的最大文件
一级256×1KB=256KB
二级2562×1KB=64MB
三级2563×1KB=16GB

混合索引(Unix 方案) 🔥🔥🔥

Unix inode 中使用混合索引方式,兼顾小文件效率和大文件容量:

inode 中的块指针:
├── 直接块指针 × 12     → 直接指向数据块
├── 一次间接块指针 × 1   → 指向索引块 → 数据块
├── 二次间接块指针 × 1   → 索引块 → 索引块 → 数据块
└── 三次间接块指针 × 1   → 索引块 → 索引块 → 索引块 → 数据块

计算示例:设磁盘块大小 4KB,块号占 4B:

  • 每个索引块可存储 4096/4= 1024 个块号
  • 直接块:12×4KB= 48KB
  • 一次间接:1024×4KB= 4MB
  • 二次间接:10242×4KB= 4GB
  • 三次间接:10243×4KB= 4TB

偏移量 → 磁盘 I/O 次数(反向例题)

在上面的 Unix 混合索引参数(4KB/块、4B/块号、12 直接 + 1 一次 + 1 二次 + 1 三次)下,访问文件偏移量 8 MB 处的一个字节需要多少次磁盘 I/O(假设 inode 已读入内存、不命中缓存)?

第一步:定位用哪条指针。

累计可寻址范围
直接块0 ~ 48 KB
+ 一次间接48 KB ~ 48 KB + 4 MB ≈ 4.05 MB
+ 二次间接4.05 MB ~ 4.05 MB + 4 GB

8 MB 落在 二次间接 范围内。

第二步:算 I/O 次数。

步骤读什么I/O
1读"二次间接索引块"(一级)1
2读"二级索引块"1
3读数据块(目标字节所在)1
合计3 次

通用规则(inode 已在内存):直接块 1 次 / 一次间接 2 次 / 二次间接 3 次 / 三次间接 4 次

综合题常见变形

  • inode 不在内存:所有数字 +1
  • 读取一个完整的 4 KB 数据块 vs 读取一个字节:磁盘 I/O 次数相同(块为最小单位)
  • 跨块连续读取 N 字节:要算多个数据块的 I/O,但中间索引块只读一次
  • 题目给 "每个块号占 8B":每个索引块可装 4096/8=512 个块号,重新算阈值

交互可视化

加载可视化中...

三种分配方式对比

分配方式顺序存取随机存取外部碎片文件增长适用场景
连续分配最快支持困难文件大小固定
隐式链接支持不支持方便顺序存取文件
显式链接(FAT)支持支持方便FAT 文件系统
索引分配支持支持方便Unix/Linux

考研高频考点

  • 🔥🔥🔥 混合索引的最大文件大小计算(给定块大小和块号字节数)
  • 🔥🔥🔥 三种分配方式各自是否支持随机存取
  • 🔥🔥🔥 隐式链接 vs 显式链接(FAT)的区别(随机存取能力)
  • 🔥🔥 连续分配的外部碎片问题
  • 🔥🔥 访问文件第 n 个块需要几次磁盘 I/O(不同分配方式下)
  • 🔥 索引分配中索引块本身的空间开销

文件分配到磁盘块上之后,用户还需要通过文件名找到文件——这就是目录的工作,下一篇展开。

真题练习

相关真题(8题)

2020Q24选择题2分

进程创建:用户登录和启动程序会创建新进程,设备分配不会

2016Q47综合题9分

综合题:FAT文件系统的目录结构、FAT表和文件访问路径

文件基本概念文件物理结构文件系统全局结构
2015Q29选择题2分

多级索引访问:直接索引访问1块,二级索引访问3块(2级索引+数据)

文件基本概念文件物理结构
2014Q46综合题7分

综合题:连续分配与链接分配方式下文件记录插入操作的对比

文件基本概念文件物理结构
2013Q24选择题2分

文件分配:CD-ROM只读且需随机访问,连续结构性能最好

文件基本概念文件物理结构
2012Q46综合题8分

### (1)纯直接索引:算块号位宽 + 最大文件长度

2010Q30选择题2分

SCAN电梯调度:先向增加方向扫描到尽头再折返

文件基本概念文件物理结构
2009Q28选择题2分

最佳适应算法:按分配释放顺序模拟,计算最大空闲分区

文件基本概念文件物理结构