操作系统第四章

为什么要单独写这个?因为太多概念了

看看有多少个书上看到的词汇:

1
文件系统空间,文件,直接索引,一级索引,二级索引,记录,磁盘块,物理块,FAT,簇号,链接分配,目录项,目录文件,索引节点,磁盘块号,地址项,FCB,混合索引分配,,索引分配,连续分配,链接分配,文件权限,索引节点号,记录文件,索引表,隐式链接,显式链接,顺序存放,索引存放,连续结构,链接结构,索引结构,散列结构,逻辑结构,物理结构,文件分配表,逻辑空间,连续文件,链接文件,流式文件,连续文件,文件共享,超级块,位示图,VFS,盘块,扇区,,空闲链表,引导块,安装表,系统打开文件表,进程打开文件表,文件描述符,存取控制矩阵,硬链接,软链接。。。

真的头大。

现在已经学完了,来讲一下我的理解。

首先就是海量的词汇需要去理解,其中不乏一些很相近,很容易混淆不清的概念,比如:

顺序存储,链式存储,索引文件,索引顺序文件

连续分配,链接分配,索引分配

就差两个字,但是很容易跟字面意思搞混在一起。只有通过多次的记忆才能分得清楚,估计到后面复习还得再花大把时间来看。

还有一点就是,题目里出的,王道讲的,包括我自己看的,都没有一个统一的标准。就比如计算机组成原理里的指令集一样,用的都是一个标准(突然想不起来叫啥了)。而在写操作系统的题目时让我感到了一些疑惑,在学习的时候我们知道,在计算机发展的过程中,FCB因为太长,所以就被切开了,分成了目录项和索引节点,但是:

答案:

可以看到标记的地方,我记得这一点不是给移动到索引节点里去了吗?二且其他题目在出索引节点的时候也是默认索引节点里存储的直接索引,一级索引,二级索引,三级索引等等。然后我去问了deepseek:

看的出来,它也很懵逼😂

总之还是根据题目去猜出题人的意思把,这些年操作系统这一部分的题的综合难度还是够可以的,第一次写难免会感觉天塌了,但是花点时间去理解还是能够拿下的。

FCB与索引节点的关系及共存性分析


1. FCB与索引节点的定义与作用

概念 FCB(文件控制块) 索引节点(i-node)
核心功能 存储文件名、元数据和数据块指针(传统文件系统)。 存储文件元数据和数据块指针(现代文件系统)。
设计目标 集中管理文件名与元数据,简单但耦合度高。 分离文件名与元数据,支持硬链接、高效管理。
典型应用 FAT、早期DOS文件系统。 Unix/Linux(ext系列)、NTFS(MFT条目)。

2. FCB与索引节点能否同时存在?

答案在同一个文件系统中,FCB和索引节点通常不会同时存在,原因如下:

  1. 设计理念冲突

    • FCB:将文件名、元数据和数据块指针集中存储(如FAT的目录项)。
    • 索引节点:将文件名与元数据分离,目录项仅存储文件名和i-node号,元数据独立存储。
    • 两种设计在数据管理方式上互斥,无法直接兼容。
  2. 文件系统类型限制

    • 传统文件系统(如FAT32):基于FCB,无索引节点。
    • 现代文件系统(如ext4、NTFS):基于索引节点,无传统FCB。
  3. 例外情况

    • 混合设计:某些实验性或特殊用途的文件系统可能尝试融合两者,但主流系统中极为罕见。
    • 术语混淆:某些文献可能将现代文件系统的元数据结构广义称为“FCB”,但实际仍是索引节点逻辑的变体。

索引节点与FCB的核心区别

特性 索引节点(i-node) FCB(文件控制块)
设计目标 分离文件名与元数据,支持硬链接和高效管理。 集中存储文件名、元数据和簇链信息。
存储位置 磁盘上的索引节点表(通过超级块定位)。 直接存储在目录项中。
数据结构 包含直接/间接指针,支持大文件。 仅存储首簇号,依赖FAT表链式查询。
文件共享 通过硬链接共享同一i-node(引用计数)。 无硬链接支持,文件共享依赖路径名。

四、索引节点在文件系统中的位置关系

下面是一个简化的文件系统层次模型:

1
2
3
4
5
6
7
用户视角

文件名(目录项) → 索引节点号

索引节点(i-node) → 数据块指针

数据块(存储实际内容)
  • 上层依赖:用户通过目录项找到索引节点,索引节点依赖超级块定位自身在磁盘上的存储位置。
  • 下层管理:索引节点通过指针管理数据块的分配与访问,数据块是文件内容的物理载体。

索引节点的上层有:目录项 超级块 高速缓存

索引节点的下层有:数据块 索引块(直接,一级,二级,三级)

磁盘结构:

索引节点的内部结构

索引节点(i-node)是文件系统的核心元数据结构,主要包含以下信息:

字段 描述 示例值/作用
文件元数据
- 文件类型 标识文件类型(普通文件、目录、符号链接、设备文件等)。 普通文件目录字符设备
- 文件权限 读(R)、写(W)、执行(X)权限,分属用户、组、其他。 rw-r--r--
- 所有者信息 文件所有者的用户ID(UID)和组ID(GID)。 UID=1000, GID=1000
- 文件大小 文件的逻辑大小(字节)。 4096 字节
- 时间戳 创建时间、修改时间、访问时间。 2023-10-01 10:00:00
数据块指针
- 直接指针 直接指向文件数据块的地址(通常 12~15 个)。 块号 100, 101, 102...
- 一级间接指针 指向一个索引块,该块存储多个数据块地址(如 1024 个地址)。 索引块号 200
- 二级间接指针 指向一个二级索引块,支持更大的文件。 二级索引块号 300
- 三级间接指针 (可选)扩展支持超大文件。 三级索引块号 400

不同文件系统的对比

文件系统类型 是否需要索引节点 数据块定位方式
Unix/Linux(ext4) 通过索引节点中的直接、间接指针定位数据块。
FAT32 通过FAT表记录簇链,目录项直接存储首簇号。
NTFS 使用MFT(主文件表)条目,类似索引节点。

概念关系与对比表

分类 概念 核心特点 关联结构/系统
文件物理结构 连续结构 文件占用连续磁盘块;快速顺序访问,易产生碎片。 位示图、超级块
链接结构(隐式/显式) 数据块通过指针链接;隐式需遍历,显式查FAT表。 FAT、簇号、目录项
索引结构 通过索引表定位数据块;支持随机访问,适合大文件。 索引节点、索引表
散列结构 哈希函数计算存储位置;快速检索,需处理冲突。 散列表、文件目录
索引方式 直接索引 索引节点直接存储数据块地址(小文件)。 索引节点
一级索引 索引节点指向一个索引块(中等文件)。 索引表
二级索引 索引节点指向二级索引块(大文件)。
目录管理 目录文件 存储目录项,每个目录项包含文件名与索引节点号。 索引节点号、超级块
目录项 文件名 + 索引节点号(或首簇号),用于快速定位文件。 目录文件、FAT
空间管理 位示图 二进制位标记磁盘块是否空闲(0=空闲,1=占用)。 超级块、物理块号
FAT 显式链接的核心,记录每个簇的下一个簇号。 显式链接、簇号
文件共享 硬链接 直接指向索引节点,共享数据块,删除原文件不影响。 索引节点、目录项
软链接 存储目标文件路径,原文件删除后失效。 文件路径、目录项

详细解释关键词

  1. 文件共享
    • 定义:多个用户或进程可以同时访问同一文件。
    • 实现方式:通过符号链接(软链接)、硬链接或共享目录权限实现。
    • 区别
      • 硬链接:直接指向文件的索引节点(i-node),共享同一物理数据块,删除原文件不影响硬链接。
      • 软链接:存储目标文件的路径名,类似快捷方式,原文件删除后软链接失效。
  2. 超级块(Super Block)
    • 作用:存储文件系统的全局信息,如文件系统类型、大小、空闲块数量、索引节点表位置等。
    • 重要性:系统启动时需加载超级块以识别文件系统结构。
  3. 逻辑空间 vs 物理空间
    • 逻辑空间:用户视角的文件大小(如一个500MB的视频文件)。
    • 物理空间:文件实际占用的磁盘块数(如占用128个簇,每个簇4KB,总占512KB)。
    • 区别:逻辑空间可能因碎片或元数据占用而与物理空间不一致。
  4. 记录文件
    • 定义:文件由固定长度的记录组成(如数据库表)。
    • 特点:支持按记录号直接访问(需索引或计算偏移量)。
  5. 混合索引分配
    • 定义:结合直接索引和多级索引的分配方式(如Unix的索引节点结构)。
    • 示例
      • 直接索引:存储前12个数据块地址。
      • 一级索引:第13个地址指向一个索引块(含1024个块地址)。
      • 二级索引:第14个地址指向二级索引块,支持更大文件。
  6. 顺序存放 vs 索引存放
    • 顺序存放:文件数据按逻辑顺序连续存储(对应连续分配)。
    • 索引存放:通过索引表定位数据块(对应索引分配),支持随机访问。
  7. 散列结构(Hash Structure)
    • 定义:通过哈希函数直接计算记录存储位置(常用于快速检索)。
    • 缺点:哈希冲突需处理,不适合动态增长的文件。
  8. 流式文件
    • 定义:无结构的字节流(如文本文件、二进制文件)。
    • 特点:用户自行解释文件内容,操作系统仅负责存储与读取。
  9. 隐式链接 vs 显式链接
    • 隐式链接:每个数据块末尾存储下一个块的指针(如早期的FAT文件系统)。
      • 缺点:访问第N块需读取前N-1块。
    • 显式链接:所有指针集中存储在文件分配表(FAT)中,常驻内存。
      • 优点:随机访问时直接查表,无需遍历数据块。
  10. 文件分配表(FAT)
    • 作用:显式链接的核心结构,记录每个簇的下一个簇号。
    • 存储位置:通常位于磁盘起始位置,加载到内存以提高访问速度。
  11. 索引节点号(i-number)
    • 定义:唯一标识文件的索引节点,目录项中存储该号码以关联文件。
  12. 物理块 vs 磁盘块
    • 物理块:磁盘的最小读写单元(如512B或4KB)。
    • 磁盘块:与物理块同义,文件系统分配的基本单位。
  13. 地址项
    • 定义:索引块或FAT表中存储的物理块地址,用于定位文件数据。
  14. 逻辑结构 vs 物理结构
    • 逻辑结构:用户看到的文件组织形式(如流式、记录式)。
    • 物理结构:文件在磁盘上的存储方式(如连续、链接、索引)。
  15. 文件权限
    • 内容:读(R)、写(W)、执行(X)权限,分属用户、组、其他三类。
    • 存储位置:索引节点或FCB中。

然后是逻辑结构和物理结构的对比:

操作系统和你看到视图可能完全不是一回事(结构完全不同)

总之就是你干你的,操作系统干操作系统的,二者互不相干。唯一要注意的就是它们相近词语的表述不要搞混了

顺序存储,链式存储,索引文件,索引顺序文件 —逻辑结构

连续分配,链接分配,索引分配 —物理结构

  • 逻辑结构:用户视角的文件组织形式。

    • 记录文件(如文件F由200条记录组成):按记录(结构化数据)组织。
    • 流式文件(如文本文件):无结构的字节序列。
  • 物理结构:文件在磁盘上的存储方式。

    • 连续文件:文件占用连续磁盘块(连续分配)。

    • 链接文件:文件通过链表形式存储(隐式/显式链接)。

      • 隐式链接:每个数据块含下一块指针(需逐个访问)。

      • 显式链接:所有指针集中存储在文件分配表(FAT)中。

    • FAT(文件分配表):显式链接的核心结构,记录每个簇的下一个簇号。

    • 簇号:文件系统分配的最小单位(可能由多个连续磁盘块组成)。

    • 磁盘块/物理块:磁盘的最小访问单元(通常与簇对应)。

    • 文件权限:控制用户对文件的读、写、执行权限。

最后来个总览:

文件管理系统结构图与层次详解


一、文件系统整体布局

1
2
3
4
5
6
7
8
9
+-----------------------+
| 引导块 | → 存储引导程序(如MBR/GPT)
+-----------------------+
| 超级块 | → 文件系统元数据(类型、大小、索引节点表位置等)
+-----------------------+
| 索引节点表 | → 存储所有文件的索引节点(i-node)
+-----------------------+
| 数据块区域 | → 存储文件实际内容(目录文件、普通文件等)
+-----------------------+

二、文件访问流程(以open("/home/user/file.txt", O_RDWR)为例)

  1. 路径解析

    • 根目录常驻内存:直接查找根目录的目录项。

    • 逐级解析路径:homeuserfile.txt,每级目录需加载其目录文件到内存(若未缓存)。

      1
      根目录 → 目录项(home, i-node号) → home目录文件 → 目录项(user, i-node号) → user目录文件 → 目录项(file.txt, i-node号)
  2. 加载索引节点

    • 根据file.txt的i-node号,从磁盘或内存缓存(inode cache)读取索引节点。

    • 索引节点内容

      1
      2
      3
      4
      5
      6
      7
      8
      9
      +------------------------+
      | 元数据(权限、大小、时间戳)|
      +------------------------+
      | 直接指针(12个数据块地址) |
      +------------------------+
      | 一级间接指针 → 索引块1 |
      +------------------------+
      | 二级间接指针 → 索引块2 |
      +------------------------+
  3. 系统打开文件表

    • 内核将索引节点关联到系统打开文件表,分配文件描述符。

    • 表项内容

      1
      | 文件描述符 | 打开模式 | 当前偏移 | 索引节点指针 | 引用计数 |
  4. 进程打开文件表

    • 用户进程通过文件描述符(如fd=3)操作文件。

    • 表项内容

      1
      | 进程ID | 文件描述符 | 系统打开文件表索引 |

三、核心组件与机制

  1. 目录项(Directory Entry)
    • 结构| 文件名(如"file.txt") | 索引节点号(如12345) |
    • 作用:逻辑入口,将文件名映射到索引节点。
  2. 索引节点(i-node)
    • 功能:存储文件元数据及数据块指针。
    • 多级索引
      • 直接指针:支持小文件(如12个块)。
      • 间接指针:支持大文件(一级、二级、三级间接索引)。
  3. 文件共享
    • 硬链接:多个目录项指向同一索引节点(引用计数+1)。
    • 软链接:独立文件存储目标路径,访问时递归解析。
  4. 缓存机制
    • 索引节点缓存(inode cache):加速元数据访问。
    • 目录项缓存(dentry cache):加速路径解析。
    • 页缓存(page cache):缓存文件数据块。
  5. 磁盘空间管理
    • 位示图(Bitmap):标记空闲块(0=空闲,1=占用)。
    • 空闲链表(Free List):链式管理空闲块。

四、文件系统层次模型

1
2
3
4
5
6
7
8
9
10
11
用户层

系统调用(open/read/write/close)

虚拟文件系统(VFS) → 抽象不同文件系统的差异

具体文件系统(ext4/NTFS/FAT32) → 实现索引节点、目录项等逻辑

块设备驱动 → 读写物理磁盘块

磁盘物理层

五、关键流程对比

操作 索引节点系统(ext4) FCB系统(FAT32)
文件打开 通过目录项找到i-node号,加载索引节点。 目录项直接存储首簇号,通过FAT表链式查询。
随机访问 通过多级索引直接定位数据块(O(1)~O(3))。 需遍历FAT表链(O(n))。
文件共享 硬链接共享i-node,软链接存储路径。 不支持硬链接,共享依赖路径名。
元数据管理 元数据集中存储在i-node中。 元数据分散在目录项和FAT表中。

六、高级特性扩展

  1. 日志(Journaling)
    • 作用:记录文件操作日志,崩溃后快速恢复一致性。
    • 实现:ext4的日志记录元数据或数据变更。
  2. 访问控制列表(ACL)
    • 功能:细粒度权限控制(如用户A可读,用户B可写)。
    • 存储:扩展索引节点或独立ACL块。
  3. 快照(Snapshot)
    • 实现:COW(写时复制)技术保留历史版本。
    • 应用:数据备份、版本恢复。
  4. 分布式文件系统
    • 示例:NFS、HDFS。
    • 特点:文件跨多节点存储,支持高可用和负载均衡。

七、结构图示意

1
2
3
4
5
6
7
8
9
10
11
12
+------------------+       +------------------+       +------------------+
| 用户进程 | | 系统打开文件表 | | 索引节点表 |
| | | | | |
| 进程打开文件表 | →→→→ | 文件描述符 → i-node | →→→→ | i-node → 数据块 |
+------------------+ +------------------+ +------------------+

| 路径解析

+------------------+ +------------------+
| 目录缓存 | | 数据块缓存 |
| (dentry cache) | | (page cache) |
+------------------+ +------------------+

八、总结

  • 文件系统层级:从用户态API到底层磁盘驱动,通过VFS抽象统一接口。
  • 核心结构:目录项、索引节点、数据块构成文件存储的基础。