目录的基本概念

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,不是数据块——计算题要分两跳算

链接