Appearance
目录
考情分析
目录在 408 真题中累计考查约 24 分(2009-2026),属于 🔥🔥 中高频考点。常考目录结构的演进、路径解析过程及其磁盘 I/O 次数计算。
磁盘上存了成千上万个文件,怎么通过一个文件名找到它的数据在哪?目录就是文件系统的"索引"——从文件名到物理位置的桥梁。
目录的本质
目录本质上是一种特殊的文件,它的内容是一张目录项的表。每个目录项记录了一个文件(或子目录)的名称和其他信息的映射。目录就像图书馆的分类目录卡——通过书名找到书架号和层号。
在使用 inode 的文件系统中,目录项的格式非常简洁:
目录项 = (文件名, inode 号)目录结构的演进
单级目录
整个系统只有一个目录,所有文件都在这个目录中。
根目录
├── file_a
├── file_b
├── file_c
└── file_d优点:实现简单
缺点:不允许文件重名;文件数量多时检索慢;不支持多用户
两级目录
第一级是主文件目录(MFD),每个用户对应一个条目;第二级是用户文件目录(UFD),存放该用户的所有文件。
MFD
├── 用户A → UFD_A
│ ├── file_a
│ └── file_b
└── 用户B → UFD_B
├── file_a ← 不同用户可以同名
└── file_c优点:不同用户可以有同名文件;一定程度上实现了访问控制
缺点:不能对文件分类管理;缺乏灵活性
树形目录(多级目录)
将目录组织成一棵树,允许用户在目录下创建子目录,形成层次结构。这是现代操作系统的标准做法。
/(根目录)
├── home/
│ ├── alice/
│ │ ├── docs/
│ │ │ └── report.txt
│ │ └── code/
│ │ └── main.c
│ └── bob/
│ └── data.csv
└── etc/
└── config.ini路径名:
| 类型 | 说明 | 示例 |
|---|---|---|
| 绝对路径 | 从根目录开始的完整路径 | /home/alice/docs/report.txt |
| 相对路径 | 从当前目录开始的路径 | docs/report.txt(当前在 /home/alice) |
路径解析过程(以 /home/alice/docs/report.txt 为例):
- 从根目录
/的 inode 开始 - 读取根目录的数据块,找到
home对应的 inode - 读取
home目录的数据块,找到alice对应的 inode - 读取
alice目录的数据块,找到docs对应的 inode - 读取
docs目录的数据块,找到report.txt对应的 inode - 读取文件的 inode 获取文件信息
每一级需要两次磁盘 I/O(读 inode + 读数据块),因此解析深度为 n 的路径需要约 2n 次磁盘 I/O。
当前目录的作用
使用相对路径可以减少目录检索次数,这也是「当前工作目录」存在的意义。
无环图目录
在树形目录基础上,允许多个目录项指向同一个文件或子目录,从而实现文件共享。目录结构从「树」变成了「有向无环图(DAG)」。
上图中 alice/report.txt 和 shared/report.txt 指向同一个文件(通过硬链接或软链接实现)。
引入的问题:
- 删除文件时不能简单地回收空间(可能还有其他链接指向它)
- 遍历目录时需要避免重复访问
- 需要防止形成环(否则遍历会死循环)
交互可视化
目录操作
| 操作 | 说明 |
|---|---|
| 搜索 | 根据文件名在目录中查找对应的目录项 |
| 创建文件 | 在目录中增加一个目录项 |
| 删除文件 | 从目录中删除一个目录项 |
| 创建目录 | 创建子目录(初始包含 . 和 ..) |
| 删除目录 | 目录为空时才能删除 |
| 遍历目录 | 列出目录中的所有文件和子目录 |
目录的实现
目录项在磁盘块中的组织方式:
| 方式 | 说明 | 检索效率 |
|---|---|---|
| 线性表 | 目录项顺序存放,线性查找 | O(n) |
| 哈希表 | 文件名通过哈希函数映射到目录项 | O(1) 均摊 |
考研高频考点
- 🔥🔥🔥 解析一个绝对路径需要多少次磁盘 I/O
- 🔥🔥🔥 树形目录结构的特点(层次分明、路径唯一)
- 🔥🔥 四种目录结构的演进及各自优缺点
- 🔥🔥 绝对路径与相对路径的区别
- 🔥 无环图目录中文件共享带来的删除问题
无环图目录中多个路径可以指向同一个文件,这就是"文件共享"。下一篇来看实现共享的两种具体方式——硬链接和软链接。