目录的基本概念
4.1.5 解决了”拿到 FCB 之后怎么找到数据块”,但留下了前半程:用户给的是一个名字,系统怎么找到对应的那个 FCB。
这就是目录要解决的问题。目录是文件名到 FCB(或索引节点)的映射表,而 4.2 这一整节都在讨论这张映射表该长成什么样、怎么查、怎么共享。
机制
目录本身也是文件
若干 FCB 的有序集合称为文件目录,而存放文件目录的文件称为目录文件。
这句话里藏着一个需要反复确认的事实:目录不是某种特殊的系统数据结构,它就是一个普通文件——有自己的 inode,有自己的数据块,只不过它的数据块里装的是目录项,而不是用户数据。
由此推出两条常用结论:目录同样占用磁盘空间、同样消耗一个 inode;目录同样有自己的读写权限,而这些权限的含义在 4.1.6 已经讨论过。
目录管理要达到的四个要求
王道明确列出目录管理的四项要求,它们各自催生了 4.2 后面几节的内容,因此值得逐条对应着记:
① 实现”按名存取”。 用户只需提供文件名就能存取文件,不必关心它在磁盘的什么位置。这是目录管理最基本的功能,是文件系统存在的全部理由。
② 提高对目录的检索速度。 合理组织目录结构,可以加快检索,从而提高对文件的存取速度。这一条直接对应 4.2.4 目录实现——线性列表还是哈希表,就是在回答它。
③ 文件共享。 在多用户系统中,应允许多个用户共享一个文件,且系统只需保留该文件的一份副本。这一条对应 4.2.5 文件共享。
④ 允许文件重名。 应允许不同用户对不同文件采用相同的名字,以便按自己的习惯命名。这一条对应 4.2.3 目录结构——单级目录做不到,两级目录才做到。
目录项里装什么
不使用索引节点的系统中,目录项就是完整的 FCB;使用索引节点的系统中,目录项被瘦身成 ⟨文件名, 索引节点号⟩。这一点在 4.1.2 已经论证过,它的动机是减少检索目录时要读入的盘块数。
实际系统(如 ext 系列)的目录项通常还带几个辅助字段:记录长度、名字长度、文件类型。有了”记录长度”,变长的文件名才能被逐项正确切分——这正是 4.1.4 中”可变长记录靠长度字段切分”的一个具体实例。
边界
目录文件与文件目录
这两个词只差语序,含义却不同,考题偶尔靠它设障:
文件目录是内容——若干 FCB 构成的那张表。目录文件是载体——存放这张表的那个文件。
打个比方:文件目录是名单上的信息,目录文件是印着名单的那张纸。
目录是”名字 → FCB”,不是”名字 → 数据”
目录的映射终点是 FCB(或 inode),不是文件内容。 从目录里查到的是”这个文件的描述信息在哪”,而从描述信息再到数据块,是物理结构那一层的事。
这两跳必须分开数,否则计算访问磁盘次数时必然出错:检索目录要几次是一笔账,拿到 inode 之后按索引取数据块要几次是另一笔账。
为什么不能把所有文件平摊在一个目录里
这是理解 4.2.3 的前提。假设全系统只有一张大目录表,会同时违反上面四个要求中的三个:检索必须线性扫过全部文件(违反②);任何两个用户都不能用同一个文件名(违反④);也没有任何结构可以表达”这个文件被谁共享”(违反③)。
目录结构的演进史,就是这四条要求被逐个满足的过程。
对照速查
| 术语 | 含义 |
|---|---|
| 文件目录 | 若干 FCB 的有序集合(内容) |
| 目录文件 | 存放文件目录的那个文件(载体) |
| 目录项 | 一个 FCB,或 ⟨文件名, inode 号⟩ |
| 目录管理的四个要求 | 由哪一节解决 |
|---|---|
| ① 实现按名存取 | 最基本功能,整个第 4 章 |
| ② 提高检索速度 | 4.2.4 目录实现 |
| ③ 文件共享 | 4.2.5 文件共享 |
| ④ 允许文件重名 | 4.2.3 目录结构 |
考点
- 目录也是文件:有 inode、占数据块、有自己的权限
- 文件目录(内容)≠ 目录文件(载体)
- 目录管理的四个要求,尤其”按名存取是最基本功能”
- 目录映射的终点是 FCB / inode,不是数据块——计算题要分两跳算
链接
- 🏠 返回总览:操作系统第 4 章:文件管理总览
- ⬅️ 上一节:4.1.6 文件保护
- ➡️ 下一节:4.2.2 目录的操作
- 🔗 目录项为何被瘦身,见 4.1.2 文件控制块和索引节点
- 📖 名词库:第 4 章名词库