4.3 目录与文件共享
目录的基本概念与操作;单级、两级、树形、无环图目录结构,绝对路径、相对路径与当前目录;目录的实现(线性列表、哈希表)与按路径查找的读盘次数;硬链接与软链接两种文件共享方式。
目录的基本概念
FCB 的有序集合称为文件目录,一个 FCB 就是一个目录项。目录本身也以文件的形式存放在外存上,称为目录文件。目录管理的基本要求是:
- 实现按名存取:用户只需提供文件名,就能找到文件;
- 提高对目录的检索速度;
- 允许文件同名:不同用户、不同目录下可以使用相同的文件名;
- 允许文件共享:多个用户共享同一个文件,外存中只保留一份副本。
目录的基本操作有:搜索(按文件名找到目录项)、创建文件(增加一个目录项)、删除文件(删除目录项)、创建目录、删除目录、列出目录(显示目录中的所有文件及其属性)、移动目录和修改目录(文件属性改变时修改目录项)。
目录结构
| 结构 | 组织方式 | 优点 | 缺点 |
|---|---|---|---|
| 单级目录 | 整个系统只有一张目录表,每个文件占一个目录项 | 简单,实现了按名存取 | 查找速度慢;不允许重名;不便于共享 |
| 两级目录 | 主文件目录(MFD)记录各用户的用户文件目录(UFD),每个用户有自己的 UFD | 不同用户的文件可以重名;提高了检索速度 | 用户不能对自己的文件分类,缺乏灵活性 |
| 树形目录 | 多级目录,根目录下可以有子目录,子目录下又可以有子目录 | 便于分类,层次结构清晰,便于管理和保护 | 不便于共享;查找要逐级访问中间结点,增加读盘次数 |
| 无环图目录 | 在树形目录的基础上,允许多个目录项指向同一个文件或目录,形成有向无环图 | 方便地实现文件共享 | 管理更复杂,需要共享计数器 |
在树形目录中,从根目录出发到文件的路径称为绝对路径,如 /usr/ast/mbox。为了避免每次都从根目录开始逐级查找,进程可以设置一个当前目录(工作目录),从当前目录出发的路径称为相对路径,如当前目录为 /usr/ast 时,mbox 就表示 /usr/ast/mbox。
目录的实现
- 线性列表:目录项按顺序存放,每项包括文件名和指向数据块(或 FCB、索引结点)的指针。实现简单,但查找文件要线性搜索,比较费时;创建文件时还要先搜索目录以确定没有同名文件。
- 哈希表:根据文件名计算哈希值,得到指向线性列表中目录项的指针,可以大大缩短目录的查找时间;但需要处理冲突,且哈希表的大小通常是固定的。
查找目录时需要把目录文件读入内存,因此目录项越小,每个盘块能存放的目录项越多,查找时读盘次数越少——这也是 UNIX 把 FCB 拆成「文件名 + 索引结点号」的目录项和索引结点的原因。
文件共享
文件共享使多个用户(进程)可以共享同一个文件,系统中只需保留该文件的一份副本。现代常用的两种共享方式是硬链接和软链接。
硬链接:基于索引结点的共享
文件的物理地址等属性不放在目录项中,而是放在索引结点中;目录项中只有文件名和指向索引结点的指针。多个目录项可以指向同一个索引结点,实现共享。
索引结点中有一个链接计数 count,表示指向它的目录项个数。建立硬链接时 count 加 1;删除文件时只删除对应的目录项并把 count 减 1,只有 count 减到 0 时才真正删除文件(回收索引结点和数据块)。
软链接:利用符号链实现共享
建立一个 LINK 类型的新文件,它有自己的索引结点,文件的内容是被链接文件的路径名。访问软链接时,操作系统读出这个路径名,再按路径查找到真正的文件。
- 只有文件主拥有指向原文件索引结点的指针,其他用户只有路径名;原文件被删除后,软链接就失效了(悬空链接),再访问时找不到文件;
- 每次访问都要根据路径逐级查找目录,读盘次数较多;
- 软链接有自己的索引结点和数据,要占用一定的空间;但它可以链接到其他文件系统、甚至网络上其他计算机中的文件。
| 硬链接 | 软链接(符号链接) | |
|---|---|---|
| 实现 | 多个目录项指向同一个索引结点 | 新建一个文件,内容是原文件的路径名 |
| 是否有新的索引结点 | 否 | 是 |
| 原文件的 count | 加 1 | 不变 |
| 删除原文件后 | 仍可访问(count > 0 时文件还在) | 失效 |
| 访问速度 | 快 | 慢(要按路径查找) |
| 能否跨文件系统 | 不能 | 能 |
即时练习
- 1设文件 F1 的当前引用计数值为 1,先建立 F1 的符号链接(软链接)文件 F2,再建立 F1 的硬链接文件 F3,然后删除 F1。此时,F2 和 F3 的引用计数值分别是( )。
- 2设置当前工作目录的主要目的是( )。
- 3若文件 f1 的硬链接为 f2,两个进程分别打开 f1 和 f2,获得对应的文件描述符为 fd1 和 fd2,则下列叙述中,正确的是( )。
Ⅰ. f1 和 f2 的读写指针位置保持相同 Ⅱ. f1 和 f2 共享同一个内存索引结点 Ⅲ. fd1 和 fd2 分别指向各自的用户打开文件表中的一项 - 4在树形目录结构中,用户按绝对路径 /a/b/c 访问文件 c。若根目录常驻内存,其余每个目录文件和每个索引结点各占一个盘块且都不在内存,则找到文件 c 的索引结点至少需要读盘( )次。
- 5下列关于软链接(符号链接)的叙述中,错误的是( )。
标记完成后,侧栏会显示进度。进度仅保存在本浏览器中。