操作系统 — 文件管理

文件管理

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)作为 操作系统与存储设备之间的桥梁,负责数据的存储、访问、管理和保护。简单来说,文件系统主要包含以下功能:

  1. 数据存储与组织
    • 文件系统以 文件目录 的形式组织数据,将存储设备的物理空间划分为 逻辑单元(如文件、文件夹),便于用户和应用程序访问与管理数据。
  2. 空间管理
    • 通过 空闲块管理 (分配、回收、组织),文件系统高效利用存储空间,减少碎片,支持文件的创建、扩展和删除。常见方法包括 连续分配链接分配索引分配
  3. 数据访问与操作
    • 提供标准接口(如 打开关闭 )支持对文件的访问和操作,确保数据的高效检索和修改,同时支持 随机访问顺序访问
  4. 数据保护和安全
    • 权限管理
    • 数据完整性校验

Tip:

文件系统磁盘 的功能区别

文件系统和磁盘在存储管理中扮演不同角色。

  • 磁盘负责物理存储,提供固定大小的 扇区(通常为 512字节 或 4KB),作为数据读写的 最小物理单位。
  • 文件系统则在磁盘之上构建逻辑结构 ,负责数据的组织和管理,以 盘块(或簇)为单位进行空间分配和操作。

盘块/簇 是文件系统定义的 逻辑单位 ,其大小在格式化时确定(常见如 4KB、8KB 等),用于管理文件的存储和访问。盘块通常是 扇区 的整数倍,便于将逻辑操作映射到物理存储。

扇区 则是 磁盘的物理单位,硬件层面的最小读写单位,固定且不可更改。

4.2. 外存空闲管理

文件存储设备(如硬盘、SSD)将存储空间划分为多个大小相同的 物理块 (通常为 512字节、4KB 或更大),以块为单位进行数据的读写和交换。因此,文件系统的外存管理实质上是对这些 物理块 (特别是 空闲块)的组织、分配与回收的管理。以下详细说明空闲块管理的关键问题和方法:

  1. 空闲表法

    在该方法中,系统需要维护一张 空闲块表 ,用以记录磁盘上尚未分配的连续空闲块的所在位置和大小。表格的每一行描述一个空闲区段。

    空闲块表应包含以下两个字段:

    • 起始空闲盘块号:该空闲区段的第一个盘块编号
    • 空闲盘块数 :该区段中连续空闲盘块的数量
  2. 空闲链表法

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

    这样,所有空闲块就被构建成一条有序的链表:

    • 分配时:系统只需从链表头部取出一个节点,即可得到一个可用的磁盘块;随后将头指针移动到下一个节点,完成快速分配。
    • 回收时:释放的磁盘块会被重新包装成一个节点,插入到链表的适当位置(常见做法是插入链表头),从而实现 O(1) 的回收操作。
    • 遍历和合并:在需要对空闲块进行合并或统计时,只需顺序遍历链表即可,所有空闲块的位置信息都已在节点中明确记录,避免了额外的查找开销。
  3. 位图法

    位图 (Bitmap)是一种用二进制位数组来管理磁盘块的技术。位图中的 每一位(bit) 对应磁盘上一个固定大小的数据块(通常为 4 KB、8 KB 等),通过该位的取值即可快速判断该块的使用状态。

    • 0 :对应的数据块为 空闲块,意味着它尚未被分配,可以用于存放新文件的数据。
    • 1 :对应的数据块 已被占用 ,已经分配给某个文件,不能再被其他文件使用。

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

      答案:

相关推荐
sg_knight13 小时前
负载均衡配置:使用 Nginx 反向代理 MinIO 集群的实战教程
运维·nginx·负载均衡·文件管理·minio·cos·oss
白狐_79815 小时前
【XV6操作系统】Lab2(Page Table) 满分通关与答辩指南:结合408考点深度剖析
操作系统·麒麟·xv6
atomicmaker1 天前
操作系统 — 设备管理
操作系统·磁盘·设备管理·缓冲
z200509302 天前
【Linux学习】Linux中进程终止和进程等待
linux·学习·操作系统
niannian2 天前
从零开始!RuyiSDK + RISC-V 新手完整入门指南(Windows WSL2 环境)
操作系统
Bruce_kaizy2 天前
c++ linux环境编程——文件io介绍以及open 、write 、read 三剑客深度详解
linux·服务器·c++·ubuntu·操作系统·文件io
morn_venus3 天前
从 20 倍性能差距看 Linux 的 vDSO 与 vvar 机制
操作系统
iCxhust3 天前
8086 汇编 TINY 和 SMALL 编程MODEL区别
汇编·单片机·嵌入式硬件·操作系统·微机原理·8088单板机
atomicmaker3 天前
经典同步问题
操作系统·pv·同步问题