电子科大操作系统期末复习之文件系统

2,498 阅读43分钟

博客原文:uestcwxy.love/2023/06/15/…

文件系统

​ 文件系统是操作系统用于明确存储设备(常见的是磁盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。

文件系统概述

文件系统的功能:

有效地管理文件的存储空间; 管理文件目录; 完成文件的读/写操作; 实现文件共享与保护; 为用户提供交互式命令接口和程序调用接口。

​ 文件系统定义:操作系统中的各类文件、管理文件的软件,以及管理文件所涉及到的数据结构等信息的集合

​ 现代OS几乎都是通过文件系统来组织和管理在计算机中所存储的大量程序和数据的。文件系统的管理功能是通过把它所管理的程序和数据组织成一系列文件的方法来实现的。而文件则是指具有文件名的若干相关元素的集合。元素通常是记录,而记录是一组有意义的数据项的集合。可以把数据组成分为数据项、记录、文件。

 ① 数据项,数据项是最低级数据组织形式。分为基本数据项(用于描述一个对象某种属性的字符集,是数据组织中可以命名的最小逻辑数据单位,即原子数据,又称为数据元素或字段)和组合数据项(由若干个基本数据项组成,简称组项)

 ② 记录,是一组相关数据项的集合,用于描述一个对象在某方面的属性,为了能够唯一标识一个记录,需要在一个记录的各个数据项中确定一个或几个数据项,把他们的集合称为关键字,关键字是能够唯一标识一个记录的数据项。

 ③ 文件,文件是具有文件名的一组相关元素的集合,分为有结构文件和无结构文件。有结构文件由若干个相关记录组成,无结构文件则被看成一个字符流。文件是文件系统的最大数据单位,它描述了一个对象集。

一个文件可对应若干个记录,一个记录可对应若干个数据项。

文件应该具有自己的属性,包括文件类型,文件长度,文件的物理位置,文件的建立时间。文件长度(文件的当前长度,也可能是最大允许长度),文件的物理位置(指示文件在哪一个设备上及在该设备的哪个位置的指针),文件的建立时间(文件最后一次修改时间)。

文件类型

  • 按用途分类 (1)系统文件 这是指由系统软件构成的文件。大多数的系统文件只允许用户调用,但不允许用户去读,更不允许修改;有的系统文件不直接对用户开放。 (2) 用户文件 由用户的源代码、目标文件、可执行文件或数据等所构成的文件。 (3) 库文件 这是由标准子例程及常用的例程等所构成的文件。这类文件允许用户调用,但不允许修改。 

  • 按文件中数据的形式分类 (1)源文件 指由源程序和数据构成的文件。 (2) 目标文件 指把源程序经过相应语言的编译程序编译过,但尚未经过链接程序链接的目标代码所构成的文件。它属于二进制文件。 (3) 可执行文件 指把编译后所产生的目标代码再经过链接程序链接后所形成的文件。

  • 按存取控制属性分类 根据系统管理员或用户所规定的存取控制属性,可将文件分为三类: (1)只执行文件 该类文件只允许被核准的用户调用执行,既不允许读,更不允许写。 (2) 只读文件 该类文件只允许文件主及被核准的用户去读,但不允许写。 (3) 读写文件 这是指允许文件主和被核准的用户去读或写的文件。

  • 按组织形式和处理方式分类

    分为普通文件,目录文件,特殊文件。

文件系统模型

​ 文件系统管理的对象有:文件(作为文件管理的直接对象),目录(为了方便用户对文件的存取和检索,在文件系统中配置目录,每个目录项中,必须含有文件名及该文件所在的物理地址,对目录的组织和管理是方便用户和提高对文件存取速度的关键),磁盘(磁带)存储空间(文件和目录必定占用存储空间,对这部分空间的有效管理,不仅能提高外存的利用率,而且能提高对文件的存取速度)。

​ 为方便用户使用文件系统,文件系统通常向用户提供两种类型的接口: (1) 命令接口。这是指作为用户与文件系统交互的接口。 用户可通过键盘终端键入命令,取得文件系统的服务。 (2) 程序接口。这是指作为用户程序与文件系统的接口。 用户程序可通过系统调用来取得文件系统的服务。

文件操作

​ 用户通过文件系统提供的系统调用实施对文件的操作。最基本的文件操作有:创建文件、删除文件。读文件、写文件、截断文件和设置文件的读/写位置。

 当前OS所提供的大多数对文件的操作,其过程大致都是这样两步:首先,检索文件目录来找到指定文件的属性及其在外存上的位置;然后,对文件实施相应的操作,如读/写文件等,当用户要求对一个文件实施多次读/写或其他操作时,每次都要从检索目录开始,为了避免多次重复地检索目录,在大多数OS中都引入了打开这一文件系统调用,当用户第一次请求对某文件系统进行操作时,先利用open系统调用将该文件打开。

 打开是指系统将指名文件的属性(包括该文件在外存上的物理位置)从外存拷贝到内存打开文件表的一个表目中,并将该表目的编号(索引)返回给用户,以后,当用户再要求对该文件进行操作时,便可利用系统所返回的索引号向系统提出操作请求,系统便可直接利用该索引到打开文件表中去查找,从而避免了对该文件的再次检索,如果用户不再需要对该文件实施操作,可利用关闭系统调用来关闭此文件,OS将会把该文件从打开文件表中的表目上删除掉。

文件操作实例(Linux)

open:打开一个文件,并指定访问该文件的方式,调用成功后返回一个文件描述符。 creat:打开一个文件,如果该文件不存在,则创建它,调用成功后返回一个文件描述符。 close:关闭文件,进程对文件所加的锁全都被释放。 read:从文件描述符对应的文件中读取数据,调用成功后返回读出的字节数。 write:向文件描述符对应的文件中写入数据,调用成功后返回写入的字节数。

文件的物理结构

 对任何的文件,都存在以下两种形式的结构

 ① 文件的逻辑结构,这是从用户观点出发所观察到的文件组织形式,是用户可以直接处理的数据及其结构,独立于文件的物理特性,又称为文件组织。文件逻辑结构的类型:顺序文件、索引文件、索引顺序文件。

 ② 文件的物理结构,又称为文件的存储结构,是指文件在外存上的存储组织形式,不仅与存储介质的存储性能有关,还与外存分配方式有关。(分为顺序、链接及索引结构)

​ 文件的物理结构即文件的外存分配方式,是从系统的角度来看文件,从文件在物理介质上的存放方式来研究文件。要考虑的主要问题: 如何有效地利用外存空间、如何提高对文件的访问速度。 目前常用的外存分配方法: (1)连续分配(顺序分配)-> 顺序文件结构 (2)链接分配-> 链接文件结构 (3)索引分配-> 索引文件结构 

连续分配

 连续分配要求为每个文件分配一组相邻接的盘块,一组盘块地址定义了磁盘上的一段线性地址。采用连续分配方式时,把逻辑文件中的数据顺序地存储到邻接的各物理盘块中,这样所形成的物理文件可以进行顺序存取。文件目录中为每个文件建立一个表项,其中记载文件的第一个数据块地址及文件长度。对于顺序文件,连续读/写多个数据块内容时,性能较好。这种分配方式保证了逻辑文件中的记录顺序与存储器中文件占用盘块的顺序的一致性。下图为连续分配方式(假设记录与盘块一样大)。

  

连续分配的优点如下:

 ① 顺序访问容易,可以随机存取, 能很快检索文件中的一个数据块。例如,如果一个文件的第一个数据块的序号为x,需要检索文件的第y块,则该数据块在外存中的位置为x+y-1。

 ② 顺序访问速度快,磁头移动距离短,效率最高。

连续分配的缺点如下:

 ① 要求又连续的存储空间,要为每个文件分配一段连续的存储空间,这样,可能产生许多磁盘碎片,严重地降低了外存空间利用率。解决方法:系统定期或不定期采用紧凑技术,将小分区合并为大的、连续分区,将文件占用空间合并在一起。

 ② 必须事先知道文件的长度,事先知道文件的长度,然后根据其大小,在存储空间中找出一块其大小足够的存储区,将文件装入,对于动态增长的文件非常低效。空间利用率不高;不利于文件尺寸的动态增长。

链接分配

 如果将一个逻辑文件存储到外存上,并不要求为整个文件分配一块连续的空间,而是可以将文件装到多个离散的盘块中,采用链接分配方式,可通过在每个盘块上的链接指针,将同属于一个文件的多个离散盘块链接成一个链表,把这样形成的物理文件称为链接文件。链接分配采取离散分配方式,消除了外部碎片,故而显著地提高了外存空间的利用率,并且对文件的增、删、改、查十分方便。链接方式可分为隐式链接和显示链接两种形式。

 ① 隐式链接, 在文件目录的每个目录项中,都须含有指向链接文件第一个盘块和最后一个盘块的指针每个盘块中都含有一个指向下一个盘块的指针

 第9个盘块指向第16个盘块,第16个盘块指向第1个盘块,第1个盘块指向第10个盘块,第10个盘块指向第25个盘块(结束块)。  

 隐式链接分配的主要问题在于:其只适合于顺序访问,对随机访问的效率极其低效。如果要访问文件所在的第 i 个盘块,则必须先读出文件的第一个盘块……,就这样顺序地查找直至第 i 块。此外,其可靠性较差,任何一个指针出现问题,都会导致整个链的断开。可以将几个盘块组成一个簇,然后以簇为单位进行分配,会减少查找指定块的时间,但是会增加内部碎片。

 ② 显示链接,把用于链接文件各物理块的指针,显式的放在内存的一张链接表中,在整个磁盘仅设置一张文件分配表(FAT)。

 表的序号从0开始,直至N-1,N为盘块总数,在每个表项中存放链接指针,即下一个盘块号,在该表中,凡是属于某一文件的第一个盘块号,或者说是每一条链的链首指针所对应的盘块号,均作为文件地址被填入相应的文件的FCB(File Control Block)的物理地址字段中,由于查找记录的过程是在内存中进行的,因而提高了检索速度,减少了访问磁盘的次数,由于分配给文件的所有盘块号都在该表中,故把该表称为文件分配表FAT(File Allocation Table)。

  • 链接分配优点 1、无外部碎片,没有磁盘空间浪费 2、无需事先知道文件大小。文件动态增长时,可动态分配空闲盘块。对文件的增、删、改十分方便。
  • 缺点 1、不能支持高效随机/直接访问,仅适合于顺序存取 2、需为指针分配空间。(隐式链接) 3、可靠性较低(指针丢失/损坏) 4、文件分配表FAT(显式链接),FAT需占用较大的内存空间

索引分配

​ 事实上,在打开某个文件时,只需要把该文件占用的盘块号的编号调入内存即可,完全没有必要把整个FAT调入内存,为此,应该将每个文件所对应的盘块号集中地放在一起,索引分配方式就是基于这种想法所形成的一种分配方式。其为每个文件分配一个索引块(表),再把分配给该文件的所有盘块号都记录在该索引块中,因而该索引块就是一个含有许多磁盘块号的数组。在建立一个文件时,只需要在为之建立的目录项中填上指向该索引块的指针(单级索引)。

 索引方式支持直接访问,可在索引块中直接找到第i个盘块,索引方式也不会产生外部碎片,当文件较大时,索引分配方式要优于链接分配方式。其主要问题在于:大文件索引项较多,可能使一个数据块容纳不了一个文件的所有分区的索引。可能需要花费较多的外存空间,每当建立一个文件时,便须为之分配一个索引块,将分配给该文件的所有盘块号记录其中。对于小文件而言,索引块的利用率非常低。

 当文件太大,其一级索引块太多时,这种方法是低效的。此时,应为这些索引块再建立一级索引,形成两级索引分配方式。即系统再分配一个索引块,作为第一级索引的索引块,将第一块、第二块……等索引块的盘块号填入到此索引表中。

 在二级索引分配方式下,若每个盘块的大小为1KB,每个盘块号占4个字节,则在一个索引块可以存放256个盘块号,这样,在两级索引时,最多可以包括存放文件的盘块号总数为64K(256 * 256)个盘块号,所允许文件最大长度为64MB,若盘块大小为4KB,则一级索引的最大文件大小为4MB,二级索引的最大文件大小为4GB。

 ④ 混合索引分配方式,将多种索引分配方式相结合而形成的一种分配方式,如直接地址(在索引结点中设置10个直接地址项,每项中所存放的是该文件数据所在盘块的盘块号,假如每个盘块大小为4KB,当文件不大于40KB时,可以直接从索引结点中读出该文件的全部盘号),一次间接地址(利用索引结点中的地址项来提供一次间接地址,其实质就是一级索引分配方式,可存放1K个盘块号,允许最大文件为4MB),多次间接地址(当文件大于4MB + 40KB时,系统采用二次间址分配方式,其实质是两级索引分配方式,采用二次间址的最大文件大小为4GB,同理,可采用三次间接地址,允许文件最大大小为4TB)。

文件存储空间的管理

文件管理要解决的重要问题之一是如何为新创建的文件分配存储空间。 存储空间的基本分配单位是磁盘块。 其分配方法与内存的分配有许多相似之处,即同样可采取连续分配方式或离散分配方式。 系统应为分配存储空间而设置相应的数据结构;其次,系统应提供对存储空间进行分配和回收的手段。

文件存储空间的管理方法:

  • 空闲分区表
  • 空闲链表法
  • 位示图
  • 成组链接法

空闲分区表

 空闲表法属于连续分配方式,它与内存的动态分配方式雷同,它为每个文件分配一块连续的存储空间,即系统也为外存上所有空闲区建立一张空闲表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区的第一个盘块号、该区的空闲盘块号等信息,再将所有空闲区按其起始盘块号递增排列。

 适合于可变大小分区的连续分配方式。为文件分配存储空间时,首先顺序查找空闲分 区表中的各个表项,直至找到第一个大小适合的空闲分区。可以采用首次适应分配算法、最佳适应分配算法等。然后,将该分区分配给文件,同时修改空闲分区表,删除相应表项。当删除文件释放出空间时,系统回收其存储空间,合并相邻空闲分区.系统在对用户所释放的存储空间进行回收时,也采取类似于内存回收的方法,即考虑回收区是否与空闲表中插入点的前区和后区相邻接,对相邻接者应该予以合并。对交换分区一般都采用连续分配方式。当文件较小时,采用连续分配方式,当文件较大时,可采用离散分配方式。

空闲链表法

 空闲链表法是将所有空闲盘区拉成一条空闲链。根据构成链所用基本元素的不同,把链表分成两种形式,空闲盘块链和空闲盘区链。

 ① 空闲盘块链,这是将磁盘上的所有空闲空间,以盘块为单位拉成一条链,当用户因创建文件而请求分配存储空间时,系统从链首开始,依次摘下适当数目的空闲盘块分配给用户,当删除文件而释放空间时,系统将回收的盘块依次插入空闲盘块链的末尾,其优点是用于分配和回收一个盘块的过程简单,但在为文件分配盘块时,可能要重复操作多次。

 ② 空闲盘区链,这是将磁盘上的所有空闲盘区(每个盘区可包含若干个盘块)拉成一条链,在每个盘区上除了含有只是下一个空闲盘区的指针外,还应有能指明本盘区大小(盘块数)的信息。盘区分配与内存的动态分配类似,可采用首次适应算法,在回收盘区时,同样也要将回收区和相邻接的空闲盘区相合并,在采用首次适应算法时,可以采用显式链接法提高检索速度,在内存中为空闲盘区建立一张链表。每个分区结点内容:起始盘块号、盘块数、指向下一个空闲盘区的指针。

​ 可能的问题:

​ 一段时间以后,可能会使空闲分区链表中包含太多小分区,使文件分配到的存储空间过分离散。删除一个由许多离散小分区组成的文件时,将回收的小分区链接到空闲分区链表中需要很长时间。若一个文件申请连续存储空间,则需要花费较长的时间查找相邻的空闲分区。因此,这种空闲空间组织方法适合于非连续存储文件。

位示图

 利用二进制的一位表示磁盘中的一个盘块的使用情况,当其值为0时,表示对应的盘块空闲,为1时,表示已经分配,磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图,通常可用m×n个位数来构成位示图,并使m * n等于磁盘的总块数。

 对于盘块的分配分为如下三步

 ① 顺序扫描位示图,从中找出一个或一组值为0的二进制位。

 ② 将所找到的一个或一组二进制位转换成与之相应的盘块号。

​ 假定找到的其值为“0”的二进制位位于位示图的第i 行、第j列,则其相应的盘块号按式计算:b = n( i - 1) + j

 ③ 修改位示图,令map[i,j]=1。

 对于盘块的回收分为如下两步

 ① 将回收盘块的盘块号转换成位示图中的行号和列号。转换公式为:

​ i = (b - 1)DIV n + 1 ​ j = (b - 1)MOD n + 1

 ② 修改位示图,令map[i,j] =0。

 此方法的优点在于从位示图中很容易找到一个或一组连续的空闲分区,例如,我们需要找到8个相邻接的空闲盘块,这只需在位示图中找出8个其值连续为“0”的位即可。 一个位示图需要占用的存储空间大小为:磁盘容量(字节数)/ (8 * 数据块大小) 由于位示图很小,占用空间少,因而可将其保存在内存中,进而使在每次进行盘区分配时,无需首先把盘区分配表读入内存,节省磁盘启动时间。

​ 但是,对于一个16GB的磁盘,若数据块大小为512字节,则位示图大小为4MB,大约需要占用8000个磁盘块的存储空间。很难一次性将该位示图全部装入内存。即使内存 足够大,可以存放全部或绝大部分位示图数据,搜索一个很大的位示图将会降低文件系统的性能。尤其当磁盘空间快用完,剩下的空闲磁盘块很少时,文件系统的性能将严重降低。

成组链接法

 空闲表法和空闲链表法都不适用于大型系统,因为这会使空闲表或空闲链表很长,在UNIX采用的成组链接法,结合上述两种方法。

 ① 空线盘块的组织,空闲盘块栈用来存放当前可用的一组空闲盘块的盘块号(最多含100个号),以及栈中尚有的空闲盘块号数N,顺便指出,N兼做栈顶指针使用,栈是临界资源,系统设置一把锁供进程互斥访问。其中,S.free(0)是栈底,栈满时栈顶为S.free(99)。

 ② 文件区中的所有空闲盘块被分成若干个组,如每100个盘块作为一组。

 ③ 将每一组含有的盘块总数N和该组所有的盘块号记入其前一组的第一个盘块S.free(0)~S.free(99)中,这样,由各组的第一个盘块可链接成一条链。

 ④ 将第一组的盘块总数和所有的盘块号记入空闲盘块号栈中,作为当前可供分配的空闲盘块号。

 ⑤ 最末一组只有99个盘块,其盘块号分别记入其前一组的S.free(1)~S.free(99)中,而在S.free(0)中则存放0,作为空闲盘块链的结束。

 当系统要为用户分配文件所需的盘块时,须调用盘块分配过程来完成。该过程首先检查空闲盘块号栈是否上锁,如未上锁,便从栈顶取出一空闲盘块号,将与之对应的盘块分配给用户,然后将栈顶指针下移一格。若该盘块号已是栈底,即S.free(0),这是当前栈中最后一个可分配的盘块号。由于在该盘块号所对应的盘块中记有下一组可用的盘块号,因此,须调用磁盘读过程,将栈底盘块号所对应盘块的内容读入栈中,作为新的盘块号栈的内容,并把原栈底对应的盘块分配出去(其中的有用数据已读入栈中)。然后,再分配一相应的缓冲区(作为该盘块的缓冲区)。最后,把栈中的空闲盘块数减1并返回。

 在系统回收空闲盘块时,须调用盘块回收过程进行回收。它是将回收盘块的盘块号记入空闲盘块号栈的顶部,并执行空闲盘块数加1操作。当栈中空闲盘块号数目已达100时,表示栈已满,便将现有栈中的100个盘块号,记入新回收的盘块中,再将其盘块号作为新栈底

例:在 UNIX 系统中有空闲盘块栈如图所示:

​ (1) 现有一个进程要释放4 个物理块,其块号为150#、156#、172 #、177#,画出空闲盘块栈每次的变化情况。

​ (2) 在( 1 )的基础上假定一个进程要求分配5 个空闲块,画出分配完成后的空闲盘块栈。

文件目录

 为了能够对文件实施有效的管理,必须对它们加以妥善组织,这主要是通过文件目录实现的,文件目录也是一种数据结构,用于标识系统中的文件及其物理地址,供检索时使用,对目录的管理要求如下:

 ① 实现"按名存取",即用户只须向系统提供所需访问的文件的名字,便能够快速准确地找到指定文件在外存上的存储位置,这是目录管理中最基本的功能。

 ② 提高对目录检索速度,通过合理地组织目录结构的方法,可加快对目录的检索速度,从而提高对文件的存取速度。

 ③ 文件共享,在多用户系统中,应该允许用户共享一个文件。

 ④ 允许文件重名,系统应允许不同用户对不同文件采用相同的名字,以便用户按照自己的习惯给文件命名和使用文件。

文件控制块

 为了能对文件进行正确的存取,必须为文件设置用于描述和控制文件的数据结构,称之为文件控制块(FCB),FCB是文件存在的标志。文件管理程序可借助于文件控制块中的信息,对文件施加各种操作,文件与文件控制块一一对应,而人们把文件控制块的有序集合称为文件目录,一个文件控制块就是一个文件目录项。为了实现对文件目录的管理,通常将文件目录以文件的形式保存在外存,这个文件就叫目录文件。

FCB的内容:

基本信息:文件名、文件类型等; 地址信息:卷(存储文件的设备)、起始地址(起始物理地址)、文件长度(以字节、字或块为单位)等。 访问控制信息:文件所有者、访问信息(用户名和口令等)、合法操作等; 使用信息:创建时间、创建者身份、当前状态、最近修改时间、最近访问时间等。

 文件目录通常是存放在磁盘上的,当文件很多时,文件目录可能要占用大量的盘块,在查找的过程中,先将存放目录文件的第一个盘块中的目录调入内存,然后把用户所给定的文件名和目录项中的文件名逐一对比。若未找到指定文件,则再将下一个盘块中的目录项调入内存。在检索目录文件时,只用到了文件名,仅当找到一个目录项(即其中的文件名与指定要查找的文件名相匹配)时,才需要从该目录项中读出该文件的物理地址,而其他一些对该文件进行描述的信息,在检索目录时一概不用,显然,这些信息在检索目录时不需要调入内存。为此,在有的系统中,如UNIX系统,便采用了把文件名和文件描述信息分开的方法,亦即,使文件描述信息单独形成一个称为索引结点的数据结构,简称为i结点,在文件目录中的每个目录项由文件名和指向该文件所对应的i结点的指针所构成。

 每个文件都有唯一的磁盘索引结点(磁盘索引结点信息与文件名等信息一起构成了FCB)

目录结构

 目录结构的组织,关系到文件系统的存取速度,也关系到文件的共享性和安全性,目前常用的目录结构形式有单级目录、两级目录、多级目录。

 ① 单级目录结构,所有用户的全部文件目录保存在一张目录表中,每个文件的目录项占用一个表项。

单级目录的优点是简单且能实现目录管理的基本功能——按名存取 存在下述一些缺点:

(1) 查找速度慢 (2) 不允许重名 (3) 不便于实现文件共享

两级目录结构,为每个用户建立一个单独的用户文件目录UFD(User File Directory),这些文件目录具有相似的结构,由用户所有文件的文件控制块组成。此外,系统中还有一个主文件目录MFD(Master File Directory),在主文件目录中,每个用户目录文件都占有一个目录项,其目录项包括用户名和指向用户目录文件的指针

 具有如下优点:提高了检索目录的速度(如果在主目录中有n个子目录,每个用户目录最多为m个目录项,则为查找一指定的目录项,最多只需要检索n+m个目录项)。在不同的用户目录中,可以使用相同的文件名(只要在用户自己的UFD中,每个文件名都是唯一的,不同用户可以有文件名相同的文件)。不同用户还可使用不同的文件名来访问系统中同一个共享文件。但在多个用户需要合作完成一个大任务时,不便于用户之间共享文件。

 ③ 多级目录结构,对于大型文件系统,通常采用三级或三级以上的目录结构,以提高对目录的检索速度和文件系统的性能。多级目录结构又称为树形目录结构,主目录被称为根目录,把数据文件称为树叶其他的目录均作为树的结点

 方框代表目录文件,圆圈代表数据文件,主目录中有是哪个用户总目录A、B、C,在B用户的总目录B中,又包括三个分目录F、E、D,其中每个分目录中又包含多个文件,为提高系统的灵活性,应该允许在一个目录文件中的目录项既是作为目录文件的FCB,又是数据文件的FCB,这一信息可用目录项中的一位来指示。如用户A总目录中,目录项A是目录文件FCB,而目录项B和D则是数据文件的FCB。

 在树形目录结构中,从根目录到任何数据文件,都只有一条唯一的通路,在该路径上从树的根开始,把全部目录文件名和数据文件名依次用"/"连接起来,即构成该数据文件的路径名。系统中的每个文件都有唯一的路径名。例如,用户B访问文件J,则使用路径名/B/F/J来访问。路径名:从树的根(即主目录)开始,把全部目录文件名与数据文件名,依次地用“/”连接起来,即构成该数据文件的路径名(path name)。系统中的每一个文件都有惟一的路径名。当前目录:为每个进程设置一个“当前目录”,又称为“工作目录”,进程对各文件的访问都相对于“当前目录”而进行。把从当前目录开始的数据文件为止所构成的路径名称为相对路径名,而把从树根开始的路径名称为绝对路径名

增加和删除目录

​ 在树形目录结构中,用户可为自己建立UFD,并可再创建子目录,在用户要创建一个新文件时,只需要查看自己的UFD及其子目录中有无与新建文件相同的文件名,若无,便可在UFD或其某个子目录中增加一个新目录项。在树形目录中,如何删除一个目录,应该视情况而定,若要删除的目录为空,则简单地将其删除,使它在其上一级目录中所对应的目录项为空。若不为空,可采用如下方法:不删除非空目录(当目录不为空时,为了删除一个非空目录,必须先删除目录中所有的文件,使之称为空目录,然后再删除,如果目录中包含有子目录,则应该递归调用方式删除),可删除非空目录(将目录中的所有文件和子目录同时删除)。

目录查询技术

 当用户要访问一个已存在的文件时,系统首先利用用户提供的文件名对目录进行查询,找出该文件的文件控制块或对应索引结点,然后,根据FCB或索引结点中所记录的文件物理地址(盘块号),换算出文件在磁盘上的物理位置,最后,再通过磁盘驱动程序,将所需文件读入内存。目前常用的方式有线性检索法Hash方法。

 ① 线性检索法,其又称为顺序检索法,在单级目录中,利用用户提供的文件名,用顺序查找法直接从文件目录中找到指名文件的目录项。在树形目录中,用户提供的文件名是由多个文件分量名组成的路径名,此时须对多级目录进行查找,假定用户给定的文件路径名为/usr/ast/mbox,则查找过程如下:

 首先,系统应先读入第一个文件分量名usr,用它与根目录文件(或当前目录文件)中各目录项中的文件名顺序地进行比较,从中找到匹配者,并得到匹配项的索引结点号是6,再从6号索引结点中得到usr目录文件放在132号盘块中,将该盘块内容读入内存。接着,系统再将路径名中的第二个分量名ast读入,用它与放在132号盘块中的第二级目录文件中各目录项的文件名顺序进行比较,又找到匹配项,从中得到ast的目录文件放在26号索引结点中,再从26号索引结点中得知/usr/ast是存放在496号盘块中,再读入496号盘块。然后,将文件的第三个分量名mbox读入,用它与第三级目录文件/usr/ast中各目录项的文件名进行比较,最后得到/usr/ast/mbox的索引结点号为60,即在60号索引结点中存放了指定文件的物理地址,目录查询操作到此结束,如果在顺序查找过程中发现有一个文件分量名没有找到,则停止查找,并返回文件未找到信息。

 ② Hash方法,系统利用用户提供的文件名并将它转换为文件目录的索引值,再利用该索引值到目录中去查找,这将提高检索速度。

①在利用Hash值查找目录时,如果目录表中相应的目录项是空的,则表示系统中并无指定文件。 ②如果目录项中的文件名与指定文件名相匹配,则表示该目录项正是所要寻找的文件所对应的目录项,故而可从中找到该文件所在的物理地址。 ③如果在目录表的相应目录项中的文件名与指定文件名并不匹配,则表示发生了“Hash冲突” 解决Hash冲突的方法 :将其Hash值再加上一个常数(该常数应与目录的长度值互质),形成新的索引值,再返回到第一步重o新开始查找。

文件共享和访问控制

文件共享的有效控制涉及两个方面:

  • 同时存取(Simultaneous Access)
  • 存取权限(Access Rights)

​ 允许多个用户同时读文件内容,但不允许同时修改,或同时读且修改文件内容。共享用户之一修改文件内容时,可以将整个文件作为临界资源,锁定整个文件,不允许其他共享用户同时读或写文件。也可以仅仅锁定指定的一条记录,允许其他共享用户读/写该文件的其它记录。后者的并发性能更好。

控制授权用户以合法的方式访问文件,包括:

执行(Execution) — 用户可以装载并执行程序,但不允许拷贝程序内容。

读(Reading)— 允许用户读文件内容,包括拷贝和执行文件。某些系统严格地将浏览文件内容和拷贝权限分开,可以控制文件只能被浏览(显示),不能被拷贝。

追加(Appending)— 允许用户向文件添加数据,通常只能将数据添加到文件尾。但是,不能修改或删除文件内容。例如,超市收银员只能将新结帐的数据添加到文件中,不允许其修改或删除已有的数据。

更新(Updating)— 允许用户修改、删除、增加文件内容。包括创建文件、重写文件的全部或部分内容、移动文件的全部或部分数据等操作。

更改权限 (Changing protection) —一般只有文件主才能更改共享该文件的其他用户对该文件的存取权限。有的系统允许文件主将更改文件存取权限赋予其他某个用户,但必须限制授权用户更改的权限范围。

删除 (Deletion) 允许用户删除文件

​ 在树型结构的目录中,当有两个(或多个)用户要共享一个子目录或文件时,必须将共享文件或子目录链接到两个(或多个)用户的目录中,才能方便地找到该文件。此时该文件系统的目录结构已不再是树型结构,而是个有向非循环图

​ 实现文件共享的实质就是可以从不同地方打开同一个文件。打开文件的首要步骤就是找到文件的目录项,读取文件在外存的起始地址。 实现文件共享的方式:

  • 利用链接目录项实现法
  • 利用索引节点实现法
  • 利用符号链实现法

利用链接目录项实现法

文件目录项中设置一个链接指针,用于指向共享文件的目录项。访问文件时,根据链接指针内容找到共享文件的目录项,读取该目录项中文件起始位置等信息,操作该文件。每当有用户(进程)共享文件时,共享文件目录项中的“共享计数”加1;当用户不再共享该文件,撤消链接指针时,“共享计数”减1。只有当共享文件用户数为1时,才能删除共享文件。

利用索引节点实现法(硬链接)

​ 文件的物理地址及其它的文件属性等信息,不再是放在目录项中,而是放在索引结点中。在文件目录中只设置文件名及指向相应索引结点的指针。由任何用户对文件进行Append 操作或修改,所引起的相应结点内容的改变(例如,增加了新的盘块号和文件长度等),都是其他用户可见的,从而也就能提供给其他用户来共享。

​ 可以通过共享文件索引节点来共享文件,即当用户需要共享文件时,在自己的文件目录中新建一个目录项,为共享文件命名(也可用原名),并将索引节点指针指向共享文件的索引节点

​ 在索引结点中还应有一个链接计数count,用于表示链接到本索引结点(亦即文件)上的用户目录项的数目。当用户C创建一个新文件时,他便是该文件的所有者,此时将count 置1。当有用户B要共享此文件时,在用户B 的目录 中增加一目录项,并设置一指针指向该文件的索引结点,此时,文件主仍然是C,count=2。 ​ 如果用户C 不再需要此文件,是否能将此文件删除呢?因为若删除了该文件,也必然删除了该文件的索引结点,这样便会便用户B的指针悬空,而用户B则可能正在此文件上执行写操作,此时用户B会无法访问到文件。因此用户C不能删除此文件,只是将该文件的count减1,然后删除自己目录中的相应目录项。用户B仍可以使用该文件。当count =0时,表示没有用户使用该文件,系统将负责删除该文件。

利用符号链实现法(软链接)

​ 为使B能共享C的一个文件F,可以由系统创建一个LINK类型的新文件,也取名为F并将F写入B的目录中,以实现B的目录与文件F的链接;在新文件只 包含被创文件F的路径名。这样的链接方法被称为符号链接。新文件中的路径名,则只被看作是符号链。当B要访问被链接的文件F且正要读LINK类新文件时,将被OS截获, OS根据新文件中的路径名去读该文件,于是就实现了用户B对文件F的共享。 ​ 在利用符号链方式实现文件共享时,只是文件主才拥有指向其索引结点的指针,而共享该文件的其它用户,则只有该文件的路径名,并不拥有指向其索引结点的指针。

符号链方式优点:能连接任何机器上的文件。每增加一个连接,就增加一个文件名,各用户使用自己的名字去共享文件。 缺点:备份可能会产生多个拷贝。这是因为每个用户都有自己的符号链接,而备份程序可能无法识别这些符号链接实际上指向同一个文件。因此,它可能会为每个符号链接创建一个单独的备份,从而导致多个拷贝。

利用URL实现文件共享 统一资源定位器URL (Uniform Resource Locator)是Internet上用来链接超文本文件的一种方法。它可以链接同一台计算机中的本地文件,也可链接Internet中任何主机上的远程文件。一个完整的URL包括访问文件的方法(协议)、文件所在的主机域名、目录路径名和文件名几部份。例如, www.uestc.edu.cn/templates/i…

文件保护

​ 不同对象允许实施的操作各不相同。例如,文件可施加读、写、执行等操作,信号量只能施加wait()和signal()操作。因此,系统为所有对象设置一个允许进程实施操作的操作集,任何对对象的操作必须符合操作集中的规定,防止未授权进程访问对象。

例一:存放在某个磁盘上的文件系统,对于采用混合索引分配方式,其FCB中共有13项地址项,第0~9个地址项为直接地址,第10个地址项为一次间接地址,第11个地址项为二次 间接地址,第12个地址项为三次间接地址。如果每个盘块的大小为512字节,盘块号需要3个字节来描述,则每个盘块最多存放170个盘块地址。 (1) 该文件系统允许的最大长度是多少? (2) 将文件的字节偏移量5000、15000、150000转换为物理块号和块内偏移量。 (3) 假设某文件的索引结点已在内存中,但其他信息均在外存,为了访问该文件中某个位置的内容,最多需要几次访 问磁盘?

(1) 该文件系统中一个文件的最大长度可达:

10+170+170×170+170×170×170=4942080块,共4942080×512字节=2471040KB

(2)5000/512得到商为9,余数为392,即字节偏移量5000对应的逻辑块号为9,块内偏移量为392。由于9<10,故可直接从该文件的FCB的第9个地址项处得到物理盘块号,块内偏移量为392。

15000/512得到商为29,余数为152,即字节偏移量15000对应的逻辑块号为29,块内偏移量为152。由于10< 29< 10+170,而29-10=19,故可从FCB的第10个地址项,即一次间址项中得到一次间址块的地址;并从一次间址块的第19项(即该块的第57~59这3个字节)中获得对应的物理盘块号,块内偏移量为152。

150000/512得到商为292,余数为496,即字节偏移量150000对应的逻辑块号为292,块内偏移量为496。由于10+170< 292< 10+170+170×170,而292-(10+170)=112,112/170得到商为0,余数为112,故可从FCB的第11个地址项,即二次间址项中得到二次间址块的地址,并从二次间址块的第0项中获得一个一次间址块的地址,再从这一次间址块的第112项中获得对应的物理盘块号,块内偏移量为496。

(3) 由于文件的FCB己在内存,为了访问文件中某个位置的内容,最少需要1次访问磁盘(即可通过直接地址直接读文件盘块),最多需要4次访问磁盘(第一次是读三次间址块,第二次是读二次间址块,第三次是读一次间址块,第四次是读文件盘块)。

例二:有一个磁盘组共用10个盘面,每个盘面上有100个磁道,每个磁道有16个扇区,假定以扇区为单位,若使 用位示图管理磁盘空间,问位示图需要占多少空间? 若空闲表的每个空闲表项占用5个字节,问什么时候空闲表大于位示图?

​ 磁盘组的总扇区数为10 * 100 * 16 = 16000。因此,位示图需要占用16000位 = 2000字节的空间。

​ 若空闲表的每个空闲表项占用5个字节,则当空闲表项数大于2000/5=400时,空闲表的大小将大于位示图。也就是说,当磁盘组中有超过400个连续的空闲扇区时,使用空闲表管理磁盘空间所需的存储空间将大于使用位示图所需的存储空间。