Lecture 9:知识 - 目录
Chinese-language Computer Science 408 note: Lecture 9:知识 - 目录. Original source available where applicable.
On this page
This note is currently available in Chinese. The original wording, formulas and diagrams are preserved to avoid an unverified technical translation.
目录是特殊文件,由目录项组成,承担按名存取、分类、共享和保护。目录结构的演进体现了多用户、分类和共享需求的增加。
9.1 目录结构
| 结构 | 特点 |
|---|---|
| 单级目录 | 全系统一张目录表,重名冲突、查找慢,不适合多用户 |
| 两级目录 | MFD 按用户定位 UFD,不同用户可重名,但用户内无法分类 |
| 树形目录 | 根到文件的层次路径,分类清晰、保护方便,逐级查找增加 I/O |
| 无环图目录 | 增加共享链接,允许同文件/目录多入口,需共享计数防止误删 |
- 绝对路径从根目录开始;相对路径从当前工作目录开始。
- 共享文件不是复制文件:多个目录项指向同一对象,一方修改所有共享者可见。链接计数归零是回收文件的必要条件;若仍有进程打开该文件,还须等待最后一个打开引用关闭。
9.2 目录操作与链接
- 基本操作:搜索、创建、删除、显示、改名、遍历、改变当前目录。创建先检查同目录重名;删除非空目录通常受限制。
- 硬链接是不同目录项指向同一 inode,通常不能跨文件系统且一般禁止普通用户对目录建立硬链接;删除一个链接仅减少链接计数。
- 软链接(符号链接)是存放目标路径的独立文件,可跨文件系统、可指向目录;目标删除后软链接会悬空。
9.3 图示复核:目录项、inode 与共享
目录项与 FCB
目录本身是有结构的文件,由一条条目录项组成;一个目录项对应该目录下的一个文件。传统目录项可保存完整 FCB,FCB 包括:
| 信息类别 | 示例 |
|---|---|
| 基本信息 | 文件名、外存物理地址、逻辑结构、物理结构等。 |
| 存取控制信息 | 可读/可写标志、禁止访问的用户名单等。 |
| 使用信息 | 建立时间、修改时间等。 |
目录的目的不仅是按名存取(实现文件名到文件的映射),还包括提高检索效率、支持多用户共享及对用户文件重命名。
单级、两级与树形目录的图示关系
两级目录:
MFD(用户名 → UFD 位置)
├─ User1 → UFD1(文件名 → FCB/位置)
├─ User2 → UFD2(文件名 → FCB/位置)
└─ User3 → UFD3(文件名 → FCB/位置)
- 单级目录中整个系统只有一张目录表:建立文件需先查全表重名;按文件名找到 FCB 后还要进行合法性检查。它支持按名存取,也可在新名称不冲突时重命名,但不支持不同用户的同名文件和分层分类,目录很大时查找也慢。
- 两级目录中,MFD 的一项记录用户名与该用户 UFD 的位置,UFD 记录该用户全部文件的 FCB。不同用户可有同名文件,并可在目录层实施访问限制;但一个用户仍不能对自己的文件再分类。
- 树形目录的路径由从根目录到目标的各目录名和文件名用
/连接。绝对路径从根开始,相对路径从当前目录开始。树形目录便于分类、管理、保护,但沿路径逐级查找会增加外存访问。 - 无环图目录是在树形目录上增加指向同一结点的有向边,以共享文件或整个目录;必须保持无环,否则路径遍历和回收会失控。
用 inode 让目录“瘦身”
只有文件名匹配后才需要读取文件的其他属性。采用 inode 后,目录项仅保存:
- 文件名;
- 指向相应 inode 的指针(或 inode 号)。
除文件名外的描述信息(包括文件的外存位置)放在该文件唯一的 inode 中。找到目录项后才把 inode 调入内存,并由其中的块地址定位文件。
| 类型 | 含义 |
|---|---|
| 磁盘 inode | 存放在外存的持久 inode。 |
| 内存 inode | 磁盘 inode 调入后的运行时表示;除磁盘属性外,还会记录是否已修改、当前访问该文件的进程数等。 |
硬链接与软链接的删除语义
硬链接让多个用户目录项(可以用不同文件名)指向同一个 inode;inode 再指向同一份文件数据。
User1/aaa ─┐
├─> inode(link count = 2) ─> 文件数据
User2/bbb ─┘
- 建立新硬链接:增加一个目录项,并令 inode 的
count++。 - 删除一个硬链接:只删该目录项,
count--。课程的简化模型在count == 0时回收 inode 和数据;实际 Unix 类系统若还有进程打开该文件,即使链接计数已归零,也会等最后一个打开引用关闭后才回收。 - 因此硬链接共享的是同一份数据;任何一个用户修改后,其他链接名访问到的内容同步变化。
**软链接(符号链接)**本身是独立的 Link 型文件,其内容记录目标文件的路径(类似 Windows 快捷方式)。访问软链接时,OS 根据该路径逐级查目录,最终再定位目标文件。
User3/ccc(Link 文件,内容:/User1/aaa)
└─ 路径解析 ─> User1/aaa ─> inode 1 ─> 文件 1
- 删除目标文件后,软链接文件仍然存在,但解析路径会失败,成为悬空链接。
- 直接删除软链接的路径名时,默认删除的是链接自身,不会删除其目标;通过软链接打开、读取或写入时才会跟随路径访问目标。
- 符号链接拥有独立 inode,其链接计数不随目标文件变化;课程示例中该值为 1,但这不是所有文件系统和所有操作下恒成立的普遍定律。
- 在 Unix 类系统中,能否删除某个目录项主要取决于调用者对父目录是否具有写权限和执行权限,并受 sticky bit 等规则限制,而不是简单取决于是否为目标文件拥有者。软链接也不会让用户绕过这些权限检查。
目录的基本操作
| 操作 | 对目录的作用 |
|---|---|
| 搜索 | 按文件名查目录,取得对应目录项。 |
| 创建文件 | 在所属目录增加一个目录项。 |
| 删除文件 | 在目录中删除相应目录项;硬链接还要处理 count。 |
| 显示目录 | 列出目录内文件及其属性。 |
| 修改目录 | 文件名等保存在目录项中的属性变化时,修改对应目录项。 |
相关知识
- 科目导航:操作系统导航
- 阅读顺序:上一篇:文件 · 下一篇:文件系统
- 关联专题:树形目录所需的树结构
9.4 本节复盘
- 目录项实现文件名到 FCB/inode 的映射;树形目录解决分类,无环图目录解决共享。
- 硬链接共享 inode,软链接保存路径;删除语义和跨文件系统能力不同。