文件控制块和索引节点
上一节说文件有一组属性,但没说这些属性放在哪里。这一节回答:为了实现”按名存取”,系统必须为每个文件保存一份描述信息,这份信息叫什么、放在哪、由谁来查。
这一节还包含本章第一个真正的工程优化:索引节点的引入,纯粹是为了减少检索目录时的读盘次数。理解这个动机,比背诵 inode 里有哪些字段重要得多。
机制
文件控制块
文件控制块(FCB)是用于存放控制文件需要的各种信息的数据结构,其有序集合称为文件目录。 换句话说,一个 FCB 就是一个目录项,若干目录项构成一个目录文件——目录本身也是文件,只不过它的内容是一张 FCB 表。
由此得到本节最重要的一条关系:
为了创建一个新文件,系统必须为它分配一个 FCB,并把这个 FCB 填进它所在目录的目录文件里。
FCB 中包含三类信息:
基本信息包括文件名、文件的物理位置、文件的逻辑结构、文件的物理结构。存取控制信息包括文件的存取权限。使用信息包括文件建立时间、上次修改时间等。
其中文件的物理位置是最关键的一项——它是从”名字”通向”数据块”的唯一桥梁。不同的物理结构下,这一项记录的内容完全不同:连续分配记的是起始块号和长度,链接分配记的是首块号,索引分配记的是索引块地址。
索引节点:为什么要把 FCB 拆开
检索目录文件时,系统实际做的只有一件事:把用户给出的文件名,与目录项中的文件名逐个比对。 在找到之前,目录项里的其余信息——物理地址、权限、时间——一个字节都用不上。
而这些用不上的信息却在实实在在地占用盘块。后果是:目录文件被撑得很大,一个盘块装不下几个目录项,检索时就要读入更多的盘块。
索引节点(inode)的思路就是把这些”检索时用不到的信息”从目录项里拿走,单独存放。 拆分之后:
- 目录项只剩下两个字段:文件名 + 索引节点编号。
- 其余全部属性搬进索引节点,单独占一片磁盘区域。
效果是量级上的。假设一个盘块 4KB:拆分前一个 FCB 占 64B,一个盘块只能放 64 个目录项;拆分后一个目录项只占 16B(文件名 14B + inode 号 2B),同一个盘块能放 256 个目录项,检索一个目录所需的读盘次数降到原来的四分之一。
这就是引入索引节点的全部理由:用一次额外的 inode 读取,换取目录检索时大幅减少的盘块读取。 由于检索要比对很多项、而最终只需读一个 inode,这笔交易明显划算。
磁盘索引节点与内存索引节点
磁盘索引节点是存放在磁盘上的那一份,每个文件有唯一一个,包含:文件主标识符(拥有者的用户与组)、文件类型、文件存取权限、文件物理地址、文件长度、文件连接计数(有多少个目录项指向本 inode)、文件存取时间。
内存索引节点是文件被打开后复制到内存中的那一份,在磁盘 inode 的基础上增加了只在运行期才有意义的字段:索引节点编号、状态(是否上锁、是否被修改)、访问计数、文件所属文件系统的逻辑设备号、链接指针。其中(文件所属文件系统的逻辑设备号,索引节点编号)唯一确定一个文件。
注意这里的分工:磁盘 inode 描述”这个文件是什么样”,内存 inode 额外描述”这个文件现在正被怎样使用”。访问计数为 0 时内存 inode 才可以被释放。
边界
文件名不在索引节点里
这是引入 inode 后最重要、也最容易被忽略的一条结论:
采用索引节点的系统中,文件名保存在目录项里,索引节点中没有文件名。
理由是对称的:检索时只需要文件名,所以文件名必须留在目录项;而一旦找到,其余信息都在 inode 里,inode 再存一遍文件名毫无用处。
这条设计直接使”一个文件拥有多个名字”成为可能——多个目录项可以填写同一个 inode 编号,它们的文件名各不相同,指向的却是同一个文件。这就是硬链接,而 inode 中的连接计数字段正是为它准备的。
索引节点的总数与单个文件的长度无关
疑问点:与单个文件长度无关的因素
46.【统考真题】在某文件系统索引节点(inode)中有直接地址项和间接地址项,则下列选项中,与单个文件长度无关的因素是( )。 A. 索引节点的总数 B. 间接地址索引的级数 C. 地址项的个数 D. 文件块大小
答案 A。 这一题考的是两个不同层级的资源不要混为一谈。
单个文件能有多长,取决于一个 inode 内部的索引能力:地址项有几个(C)、间接索引有几级(B)、每个数据块有多大(D)。这三者相乘决定了这一个 inode 最多能指向多少字节,具体计算见 4.1.5。
索引节点的总数决定的是整个文件系统最多能存在多少个文件,属于文件系统级的资源配额,和某一个文件能长到多大毫无关系。
一句话记法:inode 内部的结构管”一个文件多大”,inode 的个数管”能有多少个文件”。
索引节点会先于磁盘空间耗尽
疑问点:一个分区的索引节点总数是否存在上限
一个分区的 inode 总数有上限吗?
有,而且这个上限在格式化时就已确定,之后不能更改。
原因来自文件系统布局:inode 区在格式化时被划为一块固定大小的磁盘区域,能放多少个 inode 当时就定死了。典型比例是每若干 KB 数据空间配一个 inode。
由此产生一个反直觉但很现实的现象:
磁盘剩余空间显示还有很多,却已经无法创建新文件。
因为每个普通文件、每个目录、每个符号链接、每个设备文件都要占用一个 inode,而一个只有几十字节的小文件同样要占满一个 inode。当分区里存放的是海量小文件时,inode 会先于数据块耗尽。
这个边界值得记住的原因是:它说明”磁盘满”有两种截然不同的含义——数据块用完,或 inode 用完。
这是典型 ext/传统 inode 文件系统的模型,不是所有现代文件系统的绝对规律。
FCB、目录项与索引节点的三种称谓
考题里这三个词有时混用,需要看清语境:
- 不采用索引节点的系统中,目录项就是 FCB,两者是同一个东西。
- 采用索引节点的系统中,目录项被瘦身成 ⟨文件名, inode 号⟩,而 FCB 的其余内容都在 inode 里。此时说”FCB”通常指 inode。
所以看到”目录项包含哪些内容”这类题,必须先判断题干说的是哪种系统。
FAT 文件系统的目录项
疑问点:FAT32 的文件目录项不包含的内容
- FAT32 的文件目录项不包括( )。 A. 文件名 B. 文件访问权限说明 C. 文件控制块的物理位置 D. 文件所在的物理位置
答案 C。
FAT 系统不使用索引节点,因此它的目录项本身就是完整的 FCB,包含文件名、属性、时间日期、起始簇号和文件大小。选项 D”文件所在的物理位置”对应的就是起始簇号,是有的;选项 A 文件名显然有;选项 B 的属性字段(只读、隐藏、系统等)也可视为存取控制信息。
只有 C 不存在——目录项自身就是 FCB,不需要再记录”FCB 的物理位置”,那等于让它记录自己在哪。
目录检索的平均访问次数
疑问点:二级目录下查找一个文件的平均访问磁盘次数
- 在一个文件系统中,FCB 占 64B,盘块大小为 1KB,采用二级目录。假定文件目录中有 3200 个目录项,则查找一个文件平均需要( )次访问磁盘。 A. 50 B. 54 C. 100 D. 200
答案 C。 这类题的解法是固定三步:
① 一个盘块能装几个目录项。
② 整个目录文件占几个盘块。
③ 顺序查找平均要读一半。
关键是第三步:目录检索是顺序比对,目标可能出现在任何位置,平均要扫过一半的盘块。“平均”二字就是在提示除以 2。
题干里的”二级目录”在本题中不参与计算——它只说明了目录的组织形式,只有当题目额外给出主目录和用户目录各自的规模时,才需要把两级的检索成本分别算出再相加。
对照速查
| 不采用索引节点 | 采用索引节点 | |
|---|---|---|
| 目录项内容 | 完整的 FCB | 仅 ⟨文件名, inode 号⟩ |
| 文件属性存放 | 目录项中 | 索引节点中 |
| 一个盘块能放的目录项 | 少 | 多(检索快得多) |
| 能否一文件多名 | 困难 | 可以(硬链接) |
| FCB 三类信息 | 内容 |
|---|---|
| 基本信息 | 文件名、物理位置、逻辑结构、物理结构 |
| 存取控制信息 | 存取权限 |
| 使用信息 | 建立时间、上次修改时间 |
| 磁盘索引节点 | 内存索引节点 | |
|---|---|---|
| 描述什么 | 文件是什么样 | 额外描述文件正被怎样使用 |
| 独有字段 | — | 编号、状态、访问计数、逻辑设备号、链接指针 |
| 何时存在 | 始终 | 文件被打开期间 |
| 问的是什么 | 看哪个量 |
|---|---|
| 单个文件最大长度 | 一个 inode 的地址项个数、索引级数、块大小 |
| 最多能创建多少文件 | inode 总数 |
| 磁盘没满却建不了文件 | inode 已耗尽 |
考点
- FCB 的有序集合就是文件目录;一个 FCB 就是一个目录项
- 引入索引节点的目的是减少检索目录时的读盘次数(这是最常考的”为什么”)
- 索引节点中没有文件名,文件名在目录项里
- inode 总数与单个文件长度无关(真题 46 答案 A)
- inode 总数在格式化时固定,小文件多时会先于磁盘空间耗尽
- FAT 目录项就是 FCB,不包含”FCB 的物理位置”
- 目录检索平均次数:一块几项 → 共几块 → 除以 2
链接
- 🏠 返回总览:操作系统第 4 章:文件管理总览
- ⬅️ 上一节:4.1.1 文件的基本概念
- ➡️ 下一节:4.1.3 文件的操作
- 🔗 目录项如何被组织与检索,见 4.2.4 目录实现
- 🔗 连接计数的用途,见 4.2.5 文件共享
- 📖 名词库:第 4 章名词库