文件管理
1. 文件元信息
在 UNIX 和 类UNIX 操作系统中 ,inode (索引节点)用于存储 文件的元数据 ,它包含了关于该文件的大部分 元数据 ,但不包括 文件名 和 文件实际内容 。

inode 中包含如下信息:
- 文件类型:文件是普通文件、目录还是链接文件等。
- 权限:文件的访问控制信息,如用户、组和其他用户的读、写、执行权限。
- 所有者:文件的所有者和组 ID。
- 大小:文件的大小(字节数)。
- 时间戳:文件的创建时间、最后修改时间和最后访问时间。
- 链接计数:指向该文件的硬链接数量。当计数为 0 时,文件会被删除。
- 数据块指针:文件内容所在的数据块(block)的位置信息。这包括直接指针、间接指针、二级间接指针和三级间接指针,用于指向存储文件内容的磁盘块。
inode表
inode 表 (inode table)是一个固定的、专门的区域,用来存储文件系统中所有文件和目录的 inode 结构。每个 inode 占用一个表项,表中的每个 inode 编号(inode number) 对应一个唯一的文件或目录。
注意 inode 表是存储所有 inode 的唯一容器:
- 每个文件/目录都有一个唯一的 inode 编号
- 文件系统通过该编号在 inode 表 中找到对应的 inode
下表给出了一个简化的 inode 表示例(inode 表 中的每一行就是一个 inode ):

2. 文件的逻辑结构
文件的 逻辑结构 指的是文件内部数据的组织方式,是用户和程序员所看到和使用的数据排列形式。根据记录的排列和访问方式,逻辑结构通常分为以下两种:
顺序文件 是将记录按一定顺序依次存储的一种 文件逻辑结构 ,每条记录 紧跟在前一条之后。在访问时,通常采用顺序读取的方式,即从文件的开头开始,依次读取每条记录,直到找到目标记录或读完整个文件。
随机文件 (也称为直接文件)则不要求记录按固定顺序排列,记录可以以任意顺序存放在文件中。其显著特点是支持 随机访问,程序可以依据记录号、关键字等定位信息直接访问某条记录,而无需逐条读取。
3. 文件的物理结构
文件的 物理结构 (或称 存储结构 )是指文件在物理存储介质(如磁盘、SSD)上的实际存放方式。它关注的是操作系统如何管理文件的块(block)或簇(cluster)等单位,并将逻辑上的文件 映射到磁盘上的物理地址空间。
与逻辑结构面向用户和程序不同,物理结构更多反映了操作系统和文件系统层面的 实现细节,决定了文件的实际读写效率、空间利用率以及文件访问策略的复杂性。
文件的物理结构和逻辑结果的 对应关系 如下图所示:

3.1. 连续分配
连续分配 方案中,每个文件占用磁盘上一个 连续的块集。例如,如果一个文件需要 n 个块,并且给定一个块 b 作为起始位置,那么分配给该文件的块将是 b, b+1, b+2,......b+n-1。这意味着给定起始块地址和文件的长度,我们可以确定文件占用的块。
连续分配方案对应的目录包含如下信息:
- 文件的起始地址
- 分配块数量
下图中的文件 "file3" 从区块 19 开始,长度为 6 个区块。因此,它占用 19、20、21、22、23、24 个块。

3.2. 链式分配
在 链式分配 方案中,每个文件都是一个 不需要连续的磁盘块链表。磁盘块可以分散在磁盘上的任何地方。目录项包含指向起始和结束文件块的指针。每个块包含一个指针,指向文件所占用的下一个块。
目录项包含指向起始和结束文件块的指针。每个块包含一个指针,指向文件所占用的 下一个块。
下图中的文件 "file1" 显示了块是如何随机分布的。最后一个块 (25) 包含 -1,表示空指针,不指向任何其他块。

下面这题就是链式分配:

答案:

3.3. 文件分配表
基于链表的链接为 隐式链接,每个磁盘块的末尾包含文件的下一个盘块号。
文件分配表 FAT 也是基于链接的方式,不过文件的 链接方式是存储在一个表格当中 ,表格包含两列,一列是 盘块号 ,另一列是在该文件盘块之后的 下一个盘块号 ,这种方式也叫做 显式链接 。

3.4. 索引分配
在 索引分配 中,一个文件所占用的所有盘块号被存储在另一个盘块中,这个盘块叫做 索引块(Index Block)。
假设一个文件的大小是 4MB,一个 盘块的大小 为 4KB,盘块编号的大小 为 4B(32 位)。 在这种情况下,文件需要用 1K 个盘块存储,索引块 的内容如下图所示:

4KB 的盘块刚好可以存储下 1K 个盘块号作为索引,在读取文件时,操作系统先读取 索引块 ,确定存储文件的所有 盘块号 ,再去读取所有存储有文件数据的盘块,如下图所示:

4. 文件系统
4.1. 功能
文件系统 (File System)作为 操作系统与存储设备之间的桥梁,负责数据的存储、访问、管理和保护。简单来说,文件系统主要包含以下功能:
- 数据存储与组织
- 文件系统以 文件 和 目录 的形式组织数据,将存储设备的物理空间划分为 逻辑单元(如文件、文件夹),便于用户和应用程序访问与管理数据。
- 空间管理
- 通过 空闲块管理 (分配、回收、组织),文件系统高效利用存储空间,减少碎片,支持文件的创建、扩展和删除。常见方法包括 连续分配 、链接分配 和 索引分配。
- 数据访问与操作
- 提供标准接口(如 读 、写 、打开 、关闭 )支持对文件的访问和操作,确保数据的高效检索和修改,同时支持 随机访问 和 顺序访问。
- 数据保护和安全
- 权限管理
- 数据完整性校验
Tip:
文件系统 和 磁盘 的功能区别
文件系统和磁盘在存储管理中扮演不同角色。
- 磁盘负责物理存储,提供固定大小的 扇区(通常为 512字节 或 4KB),作为数据读写的 最小物理单位。
- 文件系统则在磁盘之上构建逻辑结构 ,负责数据的组织和管理,以 盘块(或簇)为单位进行空间分配和操作。
盘块/簇 是文件系统定义的 逻辑单位 ,其大小在格式化时确定(常见如 4KB、8KB 等),用于管理文件的存储和访问。盘块通常是 扇区 的整数倍,便于将逻辑操作映射到物理存储。
扇区 则是 磁盘的物理单位,硬件层面的最小读写单位,固定且不可更改。
4.2. 外存空闲管理
文件存储设备(如硬盘、SSD)将存储空间划分为多个大小相同的 物理块 (通常为 512字节、4KB 或更大),以块为单位进行数据的读写和交换。因此,文件系统的外存管理实质上是对这些 物理块 (特别是 空闲块)的组织、分配与回收的管理。以下详细说明空闲块管理的关键问题和方法:
-
空闲表法
在该方法中,系统需要维护一张 空闲块表 ,用以记录磁盘上尚未分配的连续空闲块的所在位置和大小。表格的每一行描述一个空闲区段。
空闲块表应包含以下两个字段:
- 起始空闲盘块号:该空闲区段的第一个盘块编号
- 空闲盘块数 :该区段中连续空闲盘块的数量

-
空闲链表法
在本方法中,采用 链表 结构来组织和管理磁盘上的空闲数据块。链表的每个节点对应一个空闲块,并在节点中记录该块所在的磁盘块号(或块标识)。链表的头节点保存第一个空闲块的位置,随后每个节点的 next 指针指向 下一个空闲块 ,形成一条从头到尾依次链接的空闲块序列。

这样,所有空闲块就被构建成一条有序的链表:
- 分配时:系统只需从链表头部取出一个节点,即可得到一个可用的磁盘块;随后将头指针移动到下一个节点,完成快速分配。
- 回收时:释放的磁盘块会被重新包装成一个节点,插入到链表的适当位置(常见做法是插入链表头),从而实现 O(1) 的回收操作。
- 遍历和合并:在需要对空闲块进行合并或统计时,只需顺序遍历链表即可,所有空闲块的位置信息都已在节点中明确记录,避免了额外的查找开销。
-
位图法
位图 (Bitmap)是一种用二进制位数组来管理磁盘块的技术。位图中的 每一位(bit) 对应磁盘上一个固定大小的数据块(通常为 4 KB、8 KB 等),通过该位的取值即可快速判断该块的使用状态。
- 0 :对应的数据块为 空闲块,意味着它尚未被分配,可以用于存放新文件的数据。
- 1 :对应的数据块 已被占用 ,已经分配给某个文件,不能再被其他文件使用。

位图 使用流程
- 初始化:在文件系统创建时为整个磁盘块集合生成位图,初始全部置为 0(空闲)。
- 分配块 :当文件需要写入数据时,系统在位图中 搜索第一个 0 位,找到后将该位改为 1,并返回对应的块号给文件系统。
- 回收块 :文件被删除或其数据块被释放时,系统把对应的位 恢复为 0,表示该块重新进入空闲池。
- 持久化 :位图通常被写入磁盘的固定位置(例如超级块或专门的位图块),以保证系统重启后仍能恢复块的使用状态。

答案:
