在操作系统的文件管理模块中,如何高效、可靠地将文件存储到磁盘上是一个核心问题。这涉及到文件的外存分配方式,它直接决定了文件的物理结构、访问性能以及磁盘空间的利用率。掌握这些基础知识,对于理解更复杂的文件系统工作原理至关重要。本文将从计算机科学的基础知识体系角度出发,详细剖析顺序、链式、索引这三种经典分配方式的机制、优劣及适用场景。
核心要点与记忆口诀
在深入细节前,我们可以先通过一个简表把握整体脉络:
- 顺序/连续分配:适合顺序访问、大文件,速度快,但必须预知长度、要求连续空间,易产生外碎片,不利于动态增长。
- 链式分配:离散分配、无外碎片,方便文件动态增长,但只适合顺序访问,随机访问效率低(特指隐式链接)。
- 索引分配:支持随机访问、无外碎片,文件扩展方便,但索引表本身占用额外空间,访问数据前可能需要多次读索引块。
一、顺序/连续分配(Sequential / Continuous Allocation)
1. 基本思想
这种分配方式的思想非常直观:
- 为每个文件分配一组连续的磁盘块(盘块号相邻),相当于在磁盘上划出一块完整的“自留地”给文件。
- 文件的逻辑块号与物理块号呈线性关系:若起始块号为
b,则逻辑块 i 的物理块号为 b + i。无需额外查表,直接计算即可。
- 在目录项(FCB,文件控制块)中,只需记录两个关键信息:
- 起始块号:文件占用的第一个磁盘块编号。
- 文件长度(块数):文件总共占用多少个连续磁盘块。
2. 优点
- 顺序访问容易且速度最快
- 访问逻辑块
i 时,直接通过公式 b + i 计算物理块号,无需查表,效率极高。
- 关键点:连续分配在顺序读写时,磁头移动距离最小,无需频繁跳转,因此是三种方式中顺序访问速度最高的。
- 支持直接(随机)访问
- 给定逻辑块号
i,可直接算出物理块号 b+i。因此它既支持像播放视频那样的顺序访问,也支持像跳转文档页码那样的直接访问。
3. 缺点
- 要求连续存储空间,产生外碎片
- 创建文件时,必须在磁盘上找到一块足够大的连续空闲区。即使磁盘总空闲空间足够,但没有合适的连续区,文件也无法创建。
- 随着文件反复创建和删除,磁盘会被切割成许多无法被小文件利用的“碎块”,即外部碎片,导致磁盘空间利用率降低。
- 必须事先知道文件长度,不利于动态增长
- 创建文件时需要预先估计大小。估计过小,文件无法扩展;估计过大,又会浪费空间。
- 对于像日志文件、实时更新的文档这类动态增长的文件非常不友好。
4. 适用场景
适合长度固定、顺序访问为主的文件。例如:CD-ROM镜像文件、视频/音频流媒体文件、系统镜像文件等。
不适合:随机访问频繁、文件大小变化大的场景,如办公文档、数据库文件。
二、链式/链接分配(Linked Allocation)
1. 基本思想
这种方式放弃了“连续”的要求,更加灵活:
- 文件可以占用一组离散的磁盘块(盘块号不相邻)。每个磁盘块中存放两部分内容:
- 文件的实际数据。
- 指向下一个磁盘块的指针(最后一个块的指针为空或特殊标记,标识文件结束)。
- 目录项(FCB)中只需记录:起始块号、结束块号(可选,方便快速定位文件末尾)。
根据指针的存放和管理方式,链式分配主要分为两种类型:
- 隐式链接(Implicit Linked)
- 指针直接存放在每个数据磁盘块中。
- 缺点:访问逻辑块
i 时,必须从起始块开始,沿指针依次读入前 i-1 块,因此只支持顺序访问,不支持随机访问。
- 显式链接(Explicit Linked)——FAT方式
- 将所有磁盘块的指针集中存放在一张文件分配表(FAT) 中。系统启动时,整张FAT表被读入内存并常驻。
- 目录项中只记录起始块号,通过内存中的FAT表可实现“逻辑块号→物理块号”的直接转换,因此支持随机访问。
2. 优点
- 消除外部碎片,空间利用率高:采用离散分配,不要求连续空间,所有空闲块都能被利用。
- 方便文件动态增长:文件扩展时,只需找到一个空闲块,将其挂到文件链尾并修改指针即可,无需事先知道文件大小。
- 增删改操作方便:插入或删除文件中的某些记录时,只需修改对应块的指针,无需移动大量数据。
3. 缺点
- (隐式链接)不支持随机访问:访问第
i 块必须顺序遍历,效率极低。
- 指针开销:每个磁盘块都要分出一部分空间存放指针,降低了磁盘的有效数据容量。
- 可靠性问题:若某个磁盘块的指针损坏,会导致后续所有数据块无法访问。
- (FAT方式)内存占用:整个FAT表需要常驻内存,对于大容量磁盘,FAT表会非常庞大,占用宝贵的内存资源。
4. 适用场景
适合文件大小变化大、顺序访问为主的场合。典型代表:FAT32文件系统(采用显式链接)、日志文件、实时写入的数据流文件。
三、索引分配(Indexed Allocation)
1. 基本思想
索引分配为每个文件建立了一张“地图”:
- 为每个文件建立一张索引表,表中记录了“逻辑块号→物理块号”的映射关系。
- 索引表本身存放在索引块中,文件的实际数据存放在数据块中,两者独立。
- 目录项(FCB)中只需记录:索引块号(通过它找到索引表,再通过索引表找到数据块)。
扩展场景(混合索引):当文件很大,一个索引块放不下所有索引项时,有三种常见解决方案,其中混合索引最为经典(如UNIX的inode结构):
- 若干直接地址项:直接指向数据块,访问最快。
- 若干一级间接索引项:指向一个一级索引块,该块再指向多个数据块。
- 若干二级间接索引项:指向一个二级索引块,该块指向多个一级索引块,最后指向数据块。
2. 优点
- 支持随机访问:只要索引表在内存中,通过逻辑块号可直接查表获得物理块号,效率高。
- 无外部碎片:数据块离散分配,空间利用率高。
- 文件扩展方便:只需分配新数据块并在索引表中增加索引项即可。
3. 缺点
- 索引表占用额外空间:每个文件都需要一个索引块。对于小文件,可能索引块比数据还大,造成空间浪费。
- 访问延迟可能增加:若索引表不在内存,需先读索引块;对于多级索引,可能需要多次读盘(如先读二级索引块,再读一级索引块)。
4. 适用场景
适合大中型文件、需要随机访问的系统。例如:UNIX/Linux文件系统(inode结构)、数据库系统、办公文档系统。
四、三种分配方式对比简表
| 分配方式 |
是否连续分配 |
是否支持随机访问 |
| 连续/顺序分配 |
是 |
支持 |
| 链式分配(隐式链接) |
否 |
不支持 |
| 索引分配 |
否 |
支持 |
五、典型例题解析
例题1:简述优缺点
题目:“简述文件的外存分配中的连续分配、链接分配和索引分配各自主要的优、缺点。”
参考答案:
- 连续分配
- 优点:可以随机访问,访问速度快。
- 缺点:要求有连续的存储空间,容易产生碎片,降低磁盘空间利用率,并且不利于文件的增长扩充。
- 链接分配
- 优点:不要求连续的存储空间,能更有效地利用磁盘空间,并且有利于扩充文件。
- 缺点:只适合顺序访问,不适合随机访问;链接指针占用一定的空间,降低了存储效率,可靠性也差。
- 索引分配
- 优点:既支持顺序访问又支持随机访问,查找效率高,便于文件删除。
- 缺点:索引表会占用一定的存储空间。
例题2:不利于动态增长
题目:“在下列文件的外存分配方式中,不利于文件长度动态增长的文件物理结构是( )。”
- A. 连续分配
- B. 链接分配
- C. 索引分配
答案:A
解析:连续分配要求文件占用连续空间且需预知长度,扩展困难。链接和索引分配采用离散分配,易于扩展。
例题3:不适合直接存取
题目:“以下不适合直接存取的外存分配方式是( )。”
- A. 连续分配
- B. 链接分配
- C. 索引分配
- D. 以上答案都适合
答案:B(链接分配,特指隐式链接)
解析:连续分配可通过公式计算支持直接存取;索引分配通过索引表支持直接存取;隐式链接必须顺序遍历。
例题4:混合索引计算(高频考点)
题目:某文件系统采用索引节点法。索引节点中有8个地址项 iaddr[0]~iaddr[7],每个4字节。iaddr[0]~iaddr[4]为直接地址索引,iaddr[5]~iaddr[6]是一级间接地址索引,iaddr[7]是二级间接地址索引。磁盘索引块和数据块大小均为1KB。问访问逻辑块号分别为1、518时,系统应分别采用( )。
- A. 直接地址索引、直接地址索引
- B. 直接地址索引、一级间接地址索引
- C. 直接地址索引、二级间接地址索引
- D. 一级间接地址索引、二级间接地址索引
答案:C
解析要点:
- 计算指针数:每块大小1KB=1024B,每个地址项4B,故每索引块可存放
1024 / 4 = 256 个指针。
- 划分范围:
- 直接索引:5个 (
iaddr[0]~iaddr[4]),对应逻辑块号 0–4。
- 一级间接索引:2个 (
iaddr[5]~iaddr[6]),每个对应256块。
- 第一个一级间接:块号 5–260。
- 第二个一级间接:块号 261–516。
- 二级间接索引:1个 (
iaddr[7]),对应 256 × 256 = 65536 块,块号从 517 开始。
- 判断归属:
- 逻辑块号 1 在 0–4 内,属于直接地址索引。
- 逻辑块号 518 ≥ 517,属于二级间接地址索引。
六、应试与理解要点
要牢固掌握这部分内容,可以抓住三条主线:
- 两条核心区分线(选择题关键):
- 支持随机访问:连续分配、索引分配(链式分配中的隐式链接不支持)。
- 有外碎片:只有连续分配;链式和索引分配基本没有。
- 链式分配的隐式/显式要分清:
- 隐式链接:默认只支持顺序访问。
- 显式链接(FAT):支持随机访问,但FAT表占内存。
- 索引分配重点掌握“混合索引计算”:
- 会计算每个索引块能放多少指针。
- 会划分直接、一级、二级索引各自覆盖的块号范围。
- 能根据给定逻辑块号快速确定其使用的索引类型。
理解这些外存分配方式的本质,是深入学习现代文件系统(如Ext4, NTFS, APFS)的基石。它们各自的设计哲学,都是在特定硬件约束和访问场景下,对空间、时间、可靠性等维度做出的不同权衡。
|