File Logical And Directory Structure
逻辑结构与物理结构
逻辑结构是用户视角下文件内部数据如何组织。物理结构是操作系统视角下文件数据如何存放到外存块中。
同一个逻辑结构可以用不同物理结构实现。比如顺序文件在用户看来是一组有先后关系的记录,但这些记录对应的文件块在外存中可以连续分配、链接分配,也可以索引分配。
文件逻辑结构支持随机访问,是指可以根据记录号直接算出记录的逻辑地址。文件物理结构支持随机访问,是指操作系统可以较快把逻辑块号转换为物理块号。这两件事不是同一层问题。
| 类型 | 含义 | 例子 |
|---|---|---|
| 无结构文件 | 文件内部是一串二进制流或字符流,也称流式文件 | 文本文件 |
| 有结构文件 | 文件由一组相似记录组成,也称记录式文件 | 数据库表文件 |
有结构文件中的基本单位:
- 数据项:文件系统中最基本的数据单位。
- 记录:一组相关数据项的集合。
- 关键字:记录中可用于识别不同记录的数据项。
有结构文件按记录长度又可分为:
| 类型 | 特点 |
|---|---|
| 定长记录 | 每条记录长度相同,各字段位置固定 |
| 可变长记录 | 记录长度不固定,通常需要额外记录长度或分隔信息 |
有结构文件按记录组织形式分类:顺序文件、索引文件、索引顺序文件。
顺序文件
顺序文件中的记录在逻辑上一个接一个排列。记录可以定长,也可以可变长;物理上可以顺序存储,也可以链式存储。
定长记录并且物理顺序存储时,可以直接计算第 $i$ 条记录的位置:
$$
\text{address}(i)=\text{start}+i\times L
$$
其中 $L$ 是每条记录长度。这种情况下可以快速定位第 $i$ 条记录。
顺序文件的特点:
| 情况 | 访问特点 |
|---|---|
| 定长记录 + 顺序存储 | 支持随机访问;若按关键字有序,还可快速检索 |
| 可变长记录 | 通常需要从头扫描前面的记录才能定位目标记录 |
| 链式存储 | 逻辑上有序,物理上不一定相邻 |
顺序文件增加或删除记录通常不方便。若记录在物理上顺序存储,插入或删除可能需要移动大量记录。
索引文件
对于可变长记录,若要快速找到第 $i$ 条记录,可以为文件建立索引表。索引表的每个索引项记录某条记录的长度、指针或关键字等信息。
索引文件的特点:
- 索引表本身通常是定长记录的顺序文件。
- 可以快速找到第 $i$ 个索引项,再通过索引项找到目标记录。
- 若索引项按关键字排序,还可以支持按关键字折半查找。
- 可以按不同数据项建立多个索引表。
索引文件的索引表由用户或文件内容组织方式决定,映射“关键字或记录号 -> 记录逻辑地址”。
索引分配中的索引表由操作系统维护,映射“逻辑块号 -> 物理块号”。
索引顺序文件
索引顺序文件结合了索引文件和顺序文件。它不是每条记录对应一个索引项,而是一组记录对应一个索引项。
检索过程:
- 先查索引表,找到目标关键字可能所在的分组。
- 再在该分组中顺序查找目标记录。
若文件有 $N$ 条记录,分成 $m$ 组,每组 $\frac{N}{m}$ 条记录,则平均查找次数约为:
$$
\frac{m}{2}+\frac{N}{2m}\geqslant \sqrt{N}
$$
当仅当 $m = \sqrt{ N }$ 时取等号
显然,引入多级索引顺序文件还可以进一步降低查找次数。
目录与 FCB
目录是一种特殊的有结构文件。目录中的每条记录对应一个文件或子目录,这条记录称为目录项。
FCB 是文件控制块。一个 FCB 就是一个文件目录项,FCB 的有序集合就是文件目录。
FCB 通常包含:
| 内容 | 作用 |
|---|---|
| 文件名 | 实现按名查找 |
| 类型 | 区分普通文件、目录、链接文件等 |
| 存取权限 | 用于文件保护 |
| 物理位置 | 指向文件数据或索引结构在外存中的位置 |
| 逻辑结构、物理结构 | 决定如何解释和定位文件内容 |
| 时间、所有者等信息 | 文件管理和保护所需的元数据 |
FCB 实现了文件名到文件实体的映射,因此用户可以按名存取文件。
目录操作
目录系统至少要支持:
| 操作 | 含义 |
|---|---|
| 搜索 | 根据文件名找到对应目录项 |
| 创建文件 | 在目录中增加目录项 |
| 删除文件 | 从目录中删除目录项,并配合回收文件空间 |
| 显示目录 | 显示目录中所有文件及其属性 |
| 修改目录 | 文件重命名、属性变化时修改目录项 |
目录结构
单级目录
整个系统只有一张目录表。它实现简单,但所有文件共享同一命名空间,不允许重名,不适合多用户系统。
两级目录
两级目录分为:
- MFD:主文件目录,记录用户名及其用户文件目录位置。
- UFD:用户文件目录,由该用户文件的 FCB 组成。
两级目录允许不同用户使用相同文件名,也可以在用户目录层面做访问限制。但用户仍不能灵活分类自己的文件。
树形目录
树形目录也称多级目录。路径从根目录开始逐级定位文件,能够清晰分类文件,并支持不同目录下重名。
绝对路径从根目录开始,例如:
1 | /照片/2015-08/自拍.jpg |
相对路径从当前目录开始。设置当前目录后,访问同一目录附近的文件不必每次从根目录重新查找,可以减少目录读取次数。
无环图目录
树形目录不便共享文件。无环图目录允许多个目录项指向同一个文件或目录节点,用有向无环图表达共享关系。
共享节点通常设置共享计数器。删除某个目录项时,只减少共享计数;只有计数变为 0,才真正删除共享节点。
inode
查找目录时,最常用的信息是文件名。若 FCB 中保存了所有文件属性,目录项会很大,目录检索需要读入更多磁盘块。
inode 的思想是把目录项瘦身:
| 结构 | 保存内容 |
|---|---|
| 目录项 | 文件名 + inode 指针 |
| inode | 除文件名之外的属性、权限、外存位置等信息 |
这样只有文件名匹配后,才需要读入 inode。
假设一个 FCB 为 64 B,磁盘块大小为 1 KB,则每块只能放 16 个 FCB。若某目录有 640 个目录项,平均检索 320 项,约需读 20 个目录块。
若目录项缩小为 16 B,则每块可放 64 个目录项,平均检索同样的 320 项只需读约 5 个目录块。目录项瘦身能明显减少目录检索 I/O。
inode 可分为:
| 类型 | 含义 |
|---|---|
| 磁盘 inode | 存放在外存中的 inode |
| 内存 inode | 调入主存后的 inode,通常还会增加是否被修改、打开计数等运行时信息 |