4.2 目录
4.2.1 目录的基本概念
文件目录指FCB的有序集合,一个FCB就是一个文件的目录项。与文件管理系统和文件集合相关联的是文件目录,它包含有关文件的属性、位置和所有权等。
- 目录管理的基本要求:
- 从用户的角度看,目录在用户(应用程序)所需要的文件名和文件之间提供一种映射,所以目录管理要实现"按名存取";
- 目录存取的效率直接影响到系统的性能,所以要提高对目录的检索速度;
- 在多用户系统中,应允许多个用户共享一个文件,因此目录还需要提供用于控制访问文件的信息。
- 此外,应允许不同用户对不同文件采用相同的名字,以便于用户按自己的习惯给文件命名,目录管理通过树形结构来解决和实现。
4.2.2 目录结构
-
单级目录结构
在整个文件系统中只建立一张目录表,每个文件占一个目录项,不允许文件重名,如下图所示。
当访问一个文件时,先按文件名在该目录中查找到相应的FCB,经合法性检查后执行相应的操作。
当建立一个新文件时,必须先检索所有目录项,以确保没有"重名"的情况,然后在该目录中增设一项,把新文件的属性信息填入到该项中。
单级目录结构实现了"按名存取",但是存在查找速度慢、文件不允许重名、不便于文件共享等缺点,而且对于多用户的操作系统显然是不适用的。
-
两级目录结构
将文件目录分成主文件目录(MFD)和用户文件目录(UFD)两级,不同用户的文件可以重名,但不能对文件分类。
主文件目录项记录用户名及相应用户文件目录所在的存储位置。
用户文件目录项记录该用户文件的FCB信息。
两级目录结构提高了检索的速度,解决了多用户之间的文件重名问题,文件系统可以在目录上实现访问限制。但是两级目录结构缺乏灵活性,不能对文件分类。
-
树形目录结构
不同目录下的文件可以重名,可以对文件进行分类,不方便共享。
根据"文件路径"找到目标文件。用户(或用户进程)要访问某个文件时要用文件路径名标识文件,文件路径名是个字符串。各级日录之间用"/"隔开。从根目录出发的路径称为绝对路径。
例如:自拍.jpg的绝对路径是"/照片/2015-08/自拍jpg"
系统根据绝对路径一层一层地找到下一级目录。刚开始从外存读入根目录的目录表;找到"照片"目录的存放位置后,从外存读入对应的目录表;再找到"2015-08"目录的存放位置,再从外存读入对应目录表;最后才找到文件"自拍Jpg"的存放位置。整个过程需要3次读磁盘I/O操作。
引入"当前目录"和"相对路径"后,磁盘I/O的次数减少了。这就提升了访问文件的效率。
从根目录出发是绝对路径;从当前目录出发是相对路径。
树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。在树形目录中,不同性质、不同用户的文件,可以分别呈现在系统目录树的不同层次或不同子树中,很容易地赋予不同的存取权限。但是,在树形目录中查找一个文件,需要按路径名逐级访问中间节点,增加了磁盘访问次数,这无疑会影响查询速度。目前,大多数操作系统如UNIX、Linux和Windows系统都采用了树形文件目录。
4.无环图目录结构
4.2.3 目录的操作
- 搜索。当用户使用一个文件时,需要搜索目录,以找到该文件的对应目录项。
- 创建文件。当创建一个新文件时,需要在目录中增加一个目录项。
- 删除文件。当删除一个文件时,需要在目录中删除相应的目录项。
- 创建目录。在树形目录结构中,用户可创建自己的用户文件目录,并可再创建子目录。
- 删除目录。有两种方式:①不删除非空目录,删除时要先删除目录中的所有文件,并递归地删除子目录。②可删除非空目录,目录中的文件和子目录同时被删除。
- 移动目录。将文件或子目录在不同的父目录之间移动,文件的路径名也会随之改变。
- 显示目录。用户可以请求显示目录的内容,如显示该用户目录中的所有文件及属性。
- 修改目录。某些文件属性保存在目录中,因而这些属性的变化需要改变相应的目录项。
4.2.4 目录实现
目录实现有线性列表和哈希表两种方式,线性列表实现对应线性查找,哈希表的实现对应散列查找。
-
线性列表
最简单的目录实现方法是,采用文件名和数据块指针的线性列表。
-
当创建新文件时,必须首先搜索目录以确定没有同名的文件存在,然后在目录中增加一个新的目录项。
-
当删除文件时,则根据给定的文件名搜索目录,然后释放分配给它的空间。
-
当要
重用目录项
时有许多种方法:
- 可以将目录项标记为不再使用,或将它加到空闲目录项的列表上,
- 还可以将目录的最后一个目录项复制到空闲位置,并减少目录的长度。
采用链表结构可以减少删除文件的时间。
线性列表的优点在于实现简单,不过由于线性表的特殊性,查我比较费时。
-
-
哈希表
哈希表根据文件名得到一个值,并返回一个指向线性列表中元素的指针。
- 优点:查找非常迅速,插入和删除也较简单,
- 问题:需要一些措施来避免冲突(两个文件名称哈希到同一位置)。
为了减少I/O操作,把当前使用的文件目录复制到内存,以后要使用该文件时只需在内存中操作,因此降低了磁盘操作次数,提高了系统速度。
4.2.5 文件共享
文件共享不等于文件复制。
文件共享使多个用户共享同一个文件,系统中只需保留该文件的一个副本。
-
基于索引结点的共享方式(硬链接)
各个用户的目录项指向同一个索引结点,索引结点中需要链接计数count,用于表示链接到本索引结点上的用户目录项数。
某用户删除文件只是删除该用户的目录项,count--
只有count==0才能真正删除文件数据和索引结点。
-
利用符号链实现文件共享(软链接,eg快捷方式)
为使用户B能共享用户A的一个文件F,可以由系统创建一个LINK类型的新文件,也取名为F,并将该文件写入用户B的目录中,以实现用户B的目录与文件F的链接。
在一个Link型的文件中记录共享文件的存放路径(Windows快捷方式),操作系统根据路径一层层查找目录,最终找到共享文件。
当User3访问"ccc"时,操作系统判断文件"ccc"属于Link类型文件,于是会根据其中记录的路径层层查找目录,最终找到User1的目录表中的"aaa"表项,于是就找到了文件1的索引结点。
即使软链接指向的共享文件已被删除,Link型文件依然存在,只是通过Link型文件中的路径去查找共享文件会失败(找不到对应目录项)。
由于用软链接的方式访问共享文件时要查询多级目录,会有多次磁盘I/O,因此用软链接访问的速度要比硬链接更慢。硬链接直接存数据块,不需要解析路径。
硬链接和软链接都是文件系统中的静态共享方法,在文件系统中还存在着另外的共享需求,即两个进程同时对同一个文件进行操作,这样的共享称为动态共享。
注意:原文件被删除了,软链接本身这个文件还是1,不是0
4.2.6 本节小结
1)目录管理的要求是什么?
实现"按名存取",这是目录管理最基本的功能。
提高对目录的检索速度,从而提高对文件的存取速度。
为了方便用户共享文件,目录还需要提供用于控制访问文件的信息。
允许不同用户对不同文件采用相同的名字,以使用户按自己的习惯给文件命名。
2)在目录中查找某个文件可以使用什么方法?
可以采用线性列表法或哈希表法。线性列表将文件名组织成一个线性表,查找时依次与线性表中的每个表项进行比较。若将文件名按序排列,则使用折半查找法可以降低平均的查找时间但建立新文件时会增加维护线性表的开销。哈希表用文件名通过哈希函数得到一个指向文件的指针,这种方法非常迅速,但要注意避免冲突。