目录
7.3.3 树形结构目录(Tree-Structured Directory)
7.3 文 件 目 录
(1) 实现“按名存取”。
(2) 提高对目录的检索速度。
(3) 文件共享。
(4) 允许文件重名。
7.3.1 文件控制块和索引结点
1. 文件控制块FCB(File Control Block)
为了能对系统中的大量文件施以有效的管理,在文件控制块中,通常应含有三类信息,即基本信息、存取控制信息及使用信息。
1) 基本信息类
基本信息类包括:
(1) 文件名。
(2) 文件物理位置。
(3) 文件逻辑结构。
(4) 文件的物理结构。
2) 存取控制信息类
存取控制信息类包括文件主的存取权限、核准用户的存取权限以及一般用户的存取权限。
3) 使用信息类
使用信息类包括文件的建立日期和时间、文件上一次修改的日期和时间,以及当前使用信息。这些信息包括当前已打开该文件的进程数,是否被其它进程锁住,文件在内存中是否已被修改但尚未拷贝到盘上等。应该说明,对于不同OS的文件系统,由于功能不同,可能只含有上述信息中的某些部分。
2. 索引结点
1) 索引结点的引入
文件目录通常是存放在磁盘上的,当文件很多时,文件目录可能要占用大量的盘块。在查找目录的过程中,必须先将存放目录文件的第一个盘块中的目录调入内存,然后将用户所给定的文件名,与目录项中的文件名逐一比较。若未找到指定文件,还需要将下一盘块的目录项调入内存。
2) 磁盘索引结点
这是存放在磁盘上的索引结点。每个文件有唯一的一个磁盘索引结点,它主要包括以下内容:
(1) 文件主标识符,即拥有该文件的个人或小组的标识符;
(2) 文件类型,包括正规文件、目录文件或特别文件;
(3) 文件存取权限,指各类用户对该文件的存取权限;
(4) 文件物理地址,每一个索引结点中含有13个地址项,即iaddr(0)~iaddr(12),它们以直接或间接方式给出数据文件所在盘块的编号;
(5) 文件长度,指以字节为单位的文件长度;
(6) 文件连接计数,表明在本文件系统中所有指向该(文件的)文件名的指针计数;
(7) 文件存取时间,指出本文件最近被进程存取的时间、最近被修改的时间及索引结点最近被修改的时间。
3) 内存索引结点
这是存放在内存中的索引结点。当文件被打开时,要将磁盘索引结点拷贝到内存的索引结点中,便于以后使用。在内存索引结点中又增加了以下内容:
(1) 索引结点编号,用于标识内存索引结点;
(2) 状态,指示i结点是否上锁或被修改;
(3) 访问计数,每当有一进程要访问此i结点时,将该访问计数加1,访问完再减1;
(4) 文件所属文件系统的逻辑设备号;
(5) 链接指针,设置有分别指向空闲链表和散列队列的指针。
7.3.2 简单的文件目录
1. 单级文件目录
这是最简单的文件目录。在整个文件系统中只建立一张目录表,每个文件占一个目录项,目录项中含文件名、文件扩展名、文件长度、文件类型、文件物理地址以及其它文件属性。此外,为表明每个目录项是否空闲,又设置了一个状态位。单级文件目录如图7-9所示。
2. 两级文件目录
为了克服单级文件目录所存在的缺点,可以为每一个用户再建立一个单独的用户文件目录UFD(User File Directory)。这些文件目录具有相似的结构,它由用户所有文件的文件控制块组成。此外,在系统中再建立一个主文件目录MFD(Master File Directory);在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录文件的指针。
7.3.3 树形结构目录(Tree-Structured Directory)
1. 树形目录
在现代OS中,最通用且实用的文件目录无疑是树形结构目录。它可以明显地提高对目录的检索速度和文件系统的性能。主目录在这里被称为根目录,在每个文件目录中,只能有一个根目录,每个文件和每个目录都只能有一个父目录。把数据文件称为树叶,其它的目录均作为树的结点,或称为子目录。图7-11示出了树形结构目录。
2. 路径名和当前目录
1) 路径名(path name)
在树形结构目录中,从根目录到任何数据文件都只有一条唯一的通路。在该路径上,从树的根(即主目录)开始,把全部目录文件名与数据文件名依次地用“/”连接起来,即构成该数据文件唯一的路径名。
2) 当前目录(Current Directory)
当一个文件系统含有许多级时,每访问一个文件,都要使用从树根开始,直到树叶(数据文件)为止的、包括各中间节点(目录)名的全路径名。
3. 目录操作
(1) 创建目录。
(2) 删除目录。
① 不删除非空目录。
② 可删除非空目录。
(3) 改变目录。
(4) 移动目录。
(5) 链接(Link)操作。
(6) 查找。
7.3.4 目录查询技术
1. 线性检索法
线性检索法又称为顺序检索法。在单级目录中,利用用户提供的文件名,用顺序查找法直接从文件目录中找到指名文件的目录项。在树形目录中,用户提供的文件名是由多个文件分量名组成的路径名,此时需对多级目录进行查找。假定用户给定的文件路径名是 /usr/ast/mbox,则查找 /usr/ast/mbox文件的过程如图7-12所示。
2. Hash方法
在7.2.6节中曾介绍了Hash文件。如果我们建立了一张Hash索引文件目录,便可利用Hash方法进行查询,即系统利用用户提供的文件名,并将它变换为文件目录的索引值,再利用该索引值到目录中去查找,这样将显著地提高检索速度。
7.4 文 件 共 享
在现代计算机系统中,必须提供文件共享手段,即指系统应允许多个用户(进程)共享同一份文件。这样,在系统中只需保留该共享文件的一份副本。如果系统不能提供文件共享功能,就意味着凡是需要该文件的用户,都须各自备有此文件的副本,显然这会造成对存储空间的极大浪费。
7.4.1 基于有向无循环图实现文件共享
1. 有向无循环图DAG(Directed Acyclic Graph)
在严格的树形结构目录中,每个文件只允许有一个父目录,父目录可以有效地拥有该文件,其它用户要想访问它,必须经过其属主目录来访问该文件。这就是说,对文件的共享是不对称的,或者说,树形结构目录是不适合文件共享的。如果允许一个文件可以有多个父目录,即有多个属于不同用户的多个目录,同时指向同一个文件,这样虽会破坏树的特性,但这些用户可用对称的方式实现文件共享,而不必再通过其属主目录来访问。
2. 利用索引结点
为了解决这个问题,可以引用索引结点,即诸如文件的物理地址及其它的文件属性等信息,不再是放在目录项中,而是放在索引结点中。在文件目录中只设置文件名及指向相应索引结点的指针,如图7-14所示。
7.4.2 利用符号链接实现文件共享
1. 利用符号链接(Symbolic Linking)的基本思想
利用符号链接实现文件共享的基本思想,是允许一个文件或子目录有多个父目录,但其中仅有一个作为主(属主)父目录,其它的几个父目录都是通过符号链接方式与之相链接的(简称链接父目录)。
2. 如何利用符号链实现共享
为使链接父目录D5能共享文件F,可以由系统创建一个LINK类型的新文件,也取名为F,并将F写入链接父目录D5中,以实现D5与文件F8的链接。在新文件F中只包含被链接文件F8的路径名。这样的链接方法被称为符号链接。新文件F中的路径名则只被看做是符号链。当用户通过D5访问被链接的文件F8,且正要读LINK类新文件时,此要求将被OS截获,OS根据新文件中的路径名去找到文件F8,然后对它进行读(写),这样就实现了用户B对文件F的共享。
3. 利用符号链实现共享的优点
在利用符号链方式实现文件共享时,只是文件主才拥有指向其索引结点的指针;而共享该文件的其他用户则只有该文件的路径名,并不拥有指向其索引结点的指针。这样,也就不会发生在文件主删除一共享文件后留下一悬空指针的情况。当文件的拥有者把一个共享文件删除后,如果其他用户又试图通过符号链去访问一个已被删除的共享文件,则会因系统找不到该文件而使访问失败,于是再将符号链删除,此时不会产生任何影响。
4. 利用符号链的共享方式存在的问题
利用符号链的共享方式也存在着一些问题:当其他用户去读共享文件时,系统是根据给定的文件路径名逐个分量(名)地去查找目录,直至找到该文件的索引结点。因此,在每次访问共享文件时,都可能要多次地读盘。这使每次访问文件的开销甚大,且增加了启动磁盘的频率。此外,要为每个共享用户建立一条符号链,而由于链本身实际上是一个文件,尽管该文件非常简单,却仍要为它配置一个索引结点,这也要耗费一定的磁盘空间。