《计算机操作系统教程》课件-第5章_第1页
《计算机操作系统教程》课件-第5章_第2页
《计算机操作系统教程》课件-第5章_第3页
《计算机操作系统教程》课件-第5章_第4页
《计算机操作系统教程》课件-第5章_第5页
已阅读5页,还剩156页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

5.1文件系统概述5.2文件的结构和存取法5.3文件目录5.4文件存储空间的管理5.5文件的共享5.6文件的存取控制5.7文件系统和用户间的接口5.8小结习题

5.1.1文件和文件系统

1.文件

操作系统对文件的管理是通过把它组织成一个个文件的方法来实现的。那么,什么是文件呢?

文件(File)是一个具有符号名的一组相关联元素的有序序列。

文件可以包含范围非常广泛的内容。系统和用户都可以将具有一定独立功能的程序模块、一组数据或一组文字命名为一个文件。例如用户的一个Pascal源程序、一个目标代码程序、系统中的库程序和各种系统程序、一批待加工处理的数据、一篇文章等,都可构成一个文件。5.1文件系统概述文件中的“元素”是可编址的最小信息项目(字或字节)。通常,一个文件由若干个称为逻辑记录的最小单位组成。记录是一个有意义的信息集合,它是作为对文件进行存取操作的基本单位。一个文件的各个记录的长度可以相等也可以不等。在有些情况下,一个逻辑记录还可以包含若干个数据项,例如,为每个学生的成绩建立一个文件,学生的姓名可作为该文件的符号名,每门课程设置一个记录,记录中还可以包含几个数据项:作业、实习、期中、期末。但是,本章只讨论基本文件系统,也就是说,只涉及文件记录的简单逻辑组织。它处理在操作系统级上的无结构、无解释的信息集合。因此,这里讲述的文件基本上都是程序和有关数据的集合。应该指出,某些慢速字符设备也被看成是一个文件。这是因为,在这些设备上传输的信息可以看作是一组顺序字符序列,这类文件实际上是顺序文件。例如键盘输入文件、打印机文件等。

2.文件系统

操作系统中负责管理和存取文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:与文件管理有关的软件、被管理的文件以及实施文件管理所需的数据结构。从系统角度来看,文件系统是对文件存储器的存储空间进行组织和分配,负责文件的存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤消文件等。在操作系统中增设了文件管理部分后,为用户带来了如下好处:

(1)使用的方便性:由于文件系统实现了按名存取,用户不再需要为他的文件考虑存储空间的分配,因而无需关心他的文件所存放的物理位置。特别是,假如由于某种原因,文件的位置发生了改变,甚至连文件的存储装置也换了,在具有按名存取能力的系统中,对用户不会产生任何影响,因而也用不着修改他们的程序。

(2)数据的安全性:文件系统可以提供各种保护措施,防止无意的或有意的破坏文件。例如有的文件可以规定为“只读文件”,如果某一用户企图对其修改,那么文件系统可以在存取控制验证后拒绝执行,因而这个文件就不会被误用而遭到破坏。另外,用户可以规定他的文件除本人使用外,只允许核准的几个用户共同使用。若发现事先未核准的用户要使用该文件,则文件系统将认为其非法并予以拒绝。

(3)接口的统一性:用户可以使用统一的广义指令或系统调用来存取各种介质上的文件。这样做简单、直观,而且摆脱了对存储介质特性的依赖以及使用I/O指令所做的繁琐处理。从这种意义上看,文件系统提供了用户和外存的接口。5.1.2文件的类型

为便于文件的控制和管理,通常把文件分成若干类型。

文件按其性质和用途可以分为:

(1)系统文件:有关操作系统及其它系统程序的信息所组成的文件。这类文件对用户不直接开放,只能通过系统调用为用户服务。

(2)库文件:由标准子程序及常用的应用程序组成的文件。这类文件允许用户调用,但不允许用户修改。

(3)用户文件:由用户委托操作系统保存的文件,如源程序文件,目标程序文件,以及由原始数据、计算结果等组成的文件。这类文件根据使用情况又可以分为三种类型:

①临时文件:用户在一次算题过程中建立的“中间文件”。当用户撤离系统时,其文件也随之被撤消。

②档案文件:只保存在作为档案的磁带上,以便考证和恢复时用的文件,如日志文件。

③永久文件:用户要经常使用的文件。它不仅在磁盘上有文件副本,而且在“档案”上也有一个可靠的副本。根据文件的保护方式,文件可分为三类:

(1)只读文件:允许文件主及核准的用户读,但不允许写的文件。

(2)读写文件:允许文件主及核准的用户读、写,但禁止未核准的用户读、写的文件。

(3)不保护文件:所有用户都可以存取的文件。按文件信息的流向,文件又可分为三类:

(1)输入文件:例如键盘输入文件,只能输入。

(2)输出文件:例如打印机文件,只能输出。

(3)输入输出文件:在磁盘、磁带上的文件,既可读,又可写。在UNIX操作系统中,文件按组织和处理方式分为三类:

(1)普通文件:由内部无结构的一串平滑的字符构成的文件。这种文件既可以是系统文件,也可以是库文件或用户文件。

(2)目录文件:由文件目录构成的一类文件。对它的处理(读、写、执行)在形式上与普通文件相同。

(3)特别文件:由一切输入输出慢速字符设备构成的文件。这类文件对于查找目录、存取权限验证等的处理与普通文件相似,而其它部分的处理要针对设备特性要求做相应的特殊处理。

根据存取方法和物理结构,文件还可以划分为不同类型,这些划分在后面的章节中将进一步介绍。5.1.3文件系统的基本功能

本章仅讨论操作系统中的文件系统,这种文件系统只涉及信息的简单逻辑组织,即不考虑各信息项(或记录)间的结构关系,也无需对它们作出相应的解释。这与数据库管理系统侧重点不同。数据库管理系统侧重于信息项间的结构关系和对这些信息项的解释。从用户使用角度或从系统外部来看,文件系统主要实现了“按名存取”;从系统管理角度或从系统内部来看,文件系统主要实现了对文件存储器的空间的组织和分配,对文件信息的存储,以及对存入的文件进行保护和检索。具体地说,它要借助组织良好的数据结构和算法有效地对文件信息进行管理,提供简明的手段,使用户方便地存取他的信息。综合上述两方面的考虑,操作系统中的文件管理部分应具有如下功能:

(1)文件的结构及有关存取方法;

(2)文件的目录机构和有关处理;

(3)文件存储空间的管理;

(4)文件的共享和存取控制;

(5)文件操作和使用。

以下各节分别讲述上述五个基本功能,从而使读者对文件系统有一个全面的了解。文件系统的设计者应当从两种不同的观点去研究和设计文件的结构和存取方法。

一种是用户观点,其目的是研究用户“思维”中的抽象文件,即逻辑文件。研究的重点是为用户提供一种结构清晰、使用方便的逻辑文件形式。用户将按照这种形式去存储、检索和加工有关文件信息。5.2文件的结构和存取法另一种是系统观点,其目的是研究驻留在设备介质上的实际文件,即物理文件。研究的重点在于选择一些工作性能良好,设备利用率高的物理结构。系统按照这种形式去和外部设备打交道,控制信息的传输。文件系统的重要作用之一,就是在用户的逻辑文件和相应设备上的物理文件之间建立映射,实现二者之间的转换。

文件的存取方法是由文件的性质和用户使用文件的要求决定的。

下面给出文件的逻辑结构、物理结构和相应于不同结构的存取方法。5.2.1文件的逻辑结构

文件的逻辑结构通常采用两种形式,一是有结构的记录式文件,二是无结构的流式文件。

记录式文件主要来源于卡片文件。早期的计算机的输入通常采用卡片形式。人们把一张卡片上的信息作为一个记录保存。一个源程序是由一叠卡片组成的,从而它是一组记录的集合;打印机输出的每一行作为一个记录,从而打印机文件也是由一组记录所组成的。

记录式文件可分为定长记录文件和变长记录文件两种。前者的文件长度由记录长度和记录个数确定;后者的文件长度为各记录长度之和。这两类文件的形式如图5.1所示。在变长记录中,由于每个记录长度不等,通常在每个记录前部用固定的字节数(例如用2个字节)来表示该记录的长度。无结构的流式文件是有序字符的集合。UNIX文件的逻辑结构就是采用这种方式。文件的长度等于该文件所包含的字符数。图5.1记录式文件(a)定长记录文件;(b)变长记录文件对于主要用于处理文本文件(如源程序、中间代码、文本格式加工和编辑)的系统来说,记录并不是必需的。比如,用户源程序本来就是一个顺序的字符流,如果硬要把它划分为若干个记录,则并无益处。当然,在某些情况下,记录的概念还是需要的。但是从精简系统的目标出发,不妨就提供这种无结构文件。采用这种文件组织,并不妨碍灵活组织文件的内部逻辑结构。5.2.2文件的物理结构

文件的物理结构是指逻辑文件在文件存储器上的存储结构。它和文件的存取方法密切相关。文件物理结构的好坏,直接影响到文件系统的性能。因此,只有针对文件或系统的适用范围建立起合适的物理结构,才能既有效地利用存储空间,又便于系统对文件的处理。

为了有效地分配文件存储器的空间,通常把它们分成若干块,并以块为单位进行分配和传送。每个块称为物理块,而块中的信息称为物理记录。物理块长通常是固定的,在软盘上常以128字节为一块,在磁带或磁盘上常以512字节或1024字节(1KB)为一块。在记录式文件中,允许一个逻辑记录占用几块,也可以在一块中存放几个逻辑记录。

文件在逻辑上都可以看成是连续的,但在物理介质上存放时,却可以有多种形式。

1.连续结构

若一个逻辑文件的信息存放在文件存储器上的相邻物理块中,则称该文件为连续文件,这样的结构称为连续结构。存放在磁带上的文件,一般采用连续结构,也就是说逻辑记录Ri+1,其物理位置一定紧接在逻辑记录Ri之后。而存放在磁盘上的文件可以是连续结构的,也可以是非连续结构的。连续文件又称顺序文件。

假定有一文件A,逻辑记录长和物理块长都是512字节,该文件有4个逻辑记录,那么在文件存储器上它也应占用4块,如果起始块号为24,那么该文件的分配如图5.2所示。图5.2连续结构文件连续结构的优点是,一旦知道文件存储的起始块号和文件块数,就可以立即找到所需的信息。其缺点是,首先在建立连续结构文件时,要求用户给出文件的最大长度,以便系统分配足够的存储空间,但有时这难以办到;其次,不便于记录的增、删操作,一般只能在末端进行。

2.串联结构

串联结构也称链接结构。这种结构不要求所分配的各物理块是连续的,也不必按顺序排列。为了使系统能方便地找到逻辑上连续的下一块的物理位置,在每个物理块中设置一个指针(或称链接字),它指向该文件的下一个物理块号。图5.3给出了一个串联结构文件的例子。假定文件A的4个逻辑记录分别存放在物理块22、18、27和30中。它的第一物理块号由文件说明指出,其余的物理块号由上一物理块中的链接字给出,最末一块的链接字NULL表示该文件的最末一块。这种结构的优点是文件可以动态增、删,也不必事先提出文件的最大长度。由于可以不连续分配,因此不会造成几块连续区域的浪费。其缺点是只适合顺序存取,不便于直接存取;为了找到后面块的信息,必须从头开始,逐一查找每块的链接字,从而降低了查找速度。其次,由于在每块都设置了链接字而破坏了物理信息的完整性。图5.3串联结构文件

3.索引文件

这种文件的组织方式,要求为每一文件建立一张索引表。其中每一表目指出文件逻辑记录所在的物理块号,索引表由文件说明指出,如图5.4所示。图中文件的4个记录分别存放在物理块23、19、26和29中。图5.4索引结构文件这种结构除了具备串联结构的所有优点之外,还克服了它的缺点,特别是它还可以方便地进行随机存取;其缺点是增加了索引表的空间开销。同时,在存取文件时首先要取得索引表,这样就要增加一次访盘操作,从而降低了文件访问的速度。当然也可以采取补救措施。例如,在文件存取前,事先把索引表放在内存中。这样,以后的文件访问可以直接在内存查询索引表,以确定物理块号。索引表是在文件建立时由系统自动建立的,并与文件一起存放在同一文件卷上。因此,一文件的索引表通常要占用一个或几个物理块。当索引表的表目不多时,仅用一个物理块就可容纳得下;反之,就需要几个物理块存放文件的索引表。存放索引表的物理块称为索引表块。多个索引表块的组织有两种方式:串联文件方式和多重索引方式。

(1)按串联文件方式组织。将多个索引表块按串联文件的方式串联起来。例如,若每个索引项占用2个字节(可表示的最大物理块号为65535),则一个512字节大小的索引表块可存放255个索引项和一个链接字,如图5.5所示。

(2)按多重索引方式组织。另一种有效的组织方式是采用多索引结构,如图5.6所示。图5.5按串联文件方式组织索引表块图5.6按多重索引方式组织索引表块在UNIX系统中,文件的物理结构就采用多重索引结构,如图5.7所示。

在UNIX系统中,在索引节点(称为i节点)表中定义一个40字节长的字符数组i-addr[12],每个元素占3个字节,用于存放磁盘的物理块号。系统把常规文件分成小型、中型、大型和巨型四种文件。图5.7UNIX系统的多重索引结构①小型文件:索引数组的前10项(i-addr[0]~i-addr[9])为直接索引,直接存放存储文件数据的物理块号。

②中型文件:使用索引数组的前11项,其中前10项用于直接索引,第11项(即i-addr[10])作为一次间接索引。

③大型文件:使用索引数组的前12项,其中i-addr[0]~i-addr[9]为直接索引,i-addr[10]为一次间接索引,i-addr[11]为二次间接索引。

④巨型文件:使用索引数组的全部。其中,i-addr[0]~i-addr[9]为直接索引,i-addr[10]为一次间接,i-addr[11]为二次间接,i-addr[12]为三次间接。采用这样的结构,一方面可以保证即使是非常大的文件,其索引表也只有40字节;另一方面,对于常用的小型、中型文件,可以通过直接索引或一次间接索引就可以进行访问。

UNIX系统的文件逻辑结构采用流式文件。根据逻辑文件的字节偏移量可计算出该字节所在的物理块号。这种计算由两步完成。第一步,将逻辑文件的字节偏移量转换为文件的逻辑块号和块内偏移量,其转换方法是:将字节偏移量整除以盘块大小的字节数,所得的商即为文件的逻辑块号,余数就是块内偏移量。第二步,将文件的逻辑块号转换为物理块号,其转换方法是:使用多重索引结构,在索引节点表中根据逻辑块号通过直接索引或间接索引找到相应的物理块号。

4.Hash文件

文件的物理结构的另一种组织方式是采用计算寻址结构。在这种方式中,把记录中的键值通过某种计算,转换为相应记录的相应地址。一般说来,由于地址的总数比可能的键值总数(范围)要少得多,也就是不会出现一一对应的关系。因此,不同键值在计算之后,可能会得到相同的地址,这种现象称为“地址冲突”。所谓计算寻址,就是通常所说的Hash方法,或称散列法、杂凑法。利用这种方法所建立的文件称为Hash文件。这种物理结构用在不宜采用连续结构、记录次序较乱、又需在极短时间内存取的场合,如用在实时处理文件、操作系统目录文件、编译程序变量名表等方面特别有效。此外,又不需索引,从而节省了索引表所占的空间和索引表的查找时间。解决地址冲突的办法叫溢出处理技术,这是设计Hash文件需要考虑的主要内容,常用的溢出处理技术有:顺序探索法、二次散列法、拉链法、独立溢出区法等。5.2.3文件的存取方法

所谓文件的存取方法,是指读写文件存储器上的一个物理块的方法。通常有三类存取方法:顺序存取法、直接存取法和按键存取法。

1.顺序存取法

在提供记录式文件结构的系统中,顺序存取法就是严格按物理记录排列的顺序依次存取。如果当前存取的记录为Ri,则下次要存取的记录自动地确定为Ri+1。在只提供无结构的流式文件系统中,顺序存取法按读写位移(offset)从当前位置开始读写,即每读写完一段信息后,读写位移自动加上这段的长度,然后再根据该位移读写下面的信息。这里我们着重讨论记录式文件的顺序存取法。如图5.1所示,对于顺序文件,如果知道了当前记录的地址,则很容易确定下一个要存取的记录的地址。例如,设置一个读指针rptr,令它总是指向“下一次”要读出的记录首址。当该记录读出后,对rptr进行相应的修改。对于定长记录,rptr修改为

rptr∶=rptr+L其中L为文件的物理记录长。此时rptr指向下一次要读出的记录首址。对于变长记录文件,首先根据rptr读出存放记录长Li的单元,然后根据记录长度读出当前记录。此时对rptr作如下修改:

rptr∶=rptr+Li+l

其中l是存放记录长度Li的字节数。例如用2个字节存放Li,则l=2。

类似地,设置写指针,则对定长记录文件的修改为

wptr∶=wptr+L

对于变长记录文件的修改为

wptr∶=wptr+Li+l

2.直接存取法

直接存取法允许用户随意存取文件中的任何一个物理记录,而不管上次存取了哪一个记录。在无结构的流式文件中,直接存取法必须事先用必要的命令把读写位移移到欲读写的信

息开始处,然后再进行读写。下面我们介绍记录式文件的直接存取法。对于定长记录文件,这是很方便的。欲读写第i个记录(i=0,1,2,…)的首址为

rptr∶=offset+i*L

wptr∶=offset+i*L

其中,offset是该文件的首址,即R0的首址,在逻辑上可认为offset=0;L为记录长度。

对于变长记录文件,情况大有不同。例如,要求读出记录Ri,则必须从文件的起始位置开始顺序通过前面所有记录,并要读出其中每一个记录前面的存放记录长度的单元,才能确定记录Ri的首址。显然,这种逻辑组织对于直接存取是十分低效的。为了加速存取,通常采用索引表的组织。在索引结构的文件中,欲存取的记录首址存放在索引表项中。

3.按键存取法

按键存取法实质上也是直接存取法,它不是根据记录编号或地址来存取的,而是根据文件中各记录内容进行存取的。适用于这种存取方法的文件组织形式也与顺序文件不同,它是按逻辑记录中的某个数据项的内容来存放的,这种数据项通常称为“键”。这种根据键而不是根据记录号进行存取的方法,称为按键存取法。除了顺序存取法、直接存取法外,在文件系统中还有其它的存取法,例如分区存取法等,在此就不再介绍了。5.2.4文件结构、文件存储设备和存取法的关系

文件的物理结构密切依赖于文件存储器的特性和存取方法。

众所周知,磁带属于顺序存取存储设备,若用它作为文件存储器,则适合构造连续结构文件,相应的存取方法通常是顺序存取法。在顺序存取时,当存取一个记录后,由于磁头正好移到下一个记录的位置,因而可随即存取该记录,不再需要额外的寻找时间。如果采用其它文件结构或采用直接存取方式进行存取都是不合适的,因为来回倒带要花费很多时间。磁盘属于直接存取存储设备,前述的几种物理结构都可以采用。存取方法也可以多种多样。究竟采用何种物理结构和存取方法,要看系统的应用范围和文件的使用情况。如果采用顺序存取法,则前述的几种结构都可存取。如果采用直接存取法,则索引文件效率最高,连续文件效率居中,串联文件效率最低。

文件结构与存储设备及存取方法间的关系列于表5-1中。系统中的文件种类繁多,数量庞大,为了使用户方便地找到所需文件,需要在系统中建立一套目录机构。这正像图书馆中的藏书需要编目一样。文件目录组织的基本原则是:能方便而迅速地对目录进行检索,从而能准确地找到所需文件。下面分别介绍几种目录结构及相应的检索方法。5.3文件目录5.3.1简单的文件目录

最简单的一种文件目录结构是在系统中建立一张线性表,每一文件在表中占用一个表目,如表5-2所示,该表称为文件目录。这种简单文件目录在早期的文件系统和目前的简单微机操作系统中被普遍使用。

1.文件说明及其所含信息

在文件目录中的每一个表目,称为目录项,也称为一个文件的文件说明。一个文件的文件说明除了文件名外,还包含以下几方面的信息:

1)有关文件结构的信息

(1)文件的逻辑结构:记录是否为定长,记录长度,记录个数;

(2)文件的物理结构:如果是连续文件或串联文件,则要指出该文件的第一个物理块号;如果文件是索引文件,则应给出索引表所在的块号,或者把索引表包括在目录项中。

2)有关存取控制信息

(1)文件主本人所具有的存取权限(读写和执行);

(2)文件主同组用户的存取权限;

(3)其它用户的存取权限。

3)有关管理方面的信息

(1)文件建立的日期和时间;

(2)上次存取的日期和时间;

(3)文件要求保留时间。

目录项包含的内容因系统不同而异。有了文件目录之后,当用户要求存取某一指定文件时,系统按顺序查找该目录表,便可找到相应的目录项。在通过了存取权限验证之后,就可由文件的第一物理块号和本次存取的记录号来确定要访问的物理块。

文件建立时,仅在目录表中申请一个空闲项,填入文件名及其它有关信息;文件删除时,将该目录项标志改为空闲。

2.简单目录结构的缺陷

简单目录结构存在以下几个问题:

(1)存在“重名”问题。在简单的文件目录结构中,文件名和文件实体之间存在着一一对应关系,即它不允许两个文件具有相同的名字。在多道程序系统中,尤其是多用户的分时系统中,重名是很难避免的,这就很难准确地找到用户所需要的文件。显然,如果由人工来管理文件名注册,以避免命名冲突,则是很麻烦的。

(2)当系统文件数量过多时,目录项数就会很大,查找起来就要花费较长的时间。

解决上述问题的方法是建立二级或多级目录。5.3.2二级目录

为了克服简单文件目录(一级目录)的缺点,应允许系统中的各个用户(或用户组)建立各自的名空间,而这些用户的名空间便构成了所谓的用户文件目录表(UFD)。管理这些用户目录表的总文件目录称为主目录表(MFD)。主目录表中每个表目给出了用户目录的名字、目录大小及其所在的物理位置等。这样便构成了二级目录结构,如图5.8所示。图5.8二级目录结构当一个用户要存取一个文件时,系统根据用户名,在主文件目录表中查出该用户的文件目录表,然后再根据文件名,在其用户目录表中找出相应的目录项,这样便找到了该用户这一文件的物理地址,从而得到了所需的文件。

当用户想建立一个文件时,如果是新用户,即主文件目录表中无此用户的相应登记项,则在主目录中申请一空闲项,然后再分配存放用户目录表的空间,新建文件的目录项就登记在这个用户目录中。文件删除时,只在用户目录中删除该文件的目录项。如果删除后该用户目录表为空,则表明该用户已脱离了系统,从而可从主文件目录表中删除该用户的对应项。

这种二级目录结构解决了重名问题。即使两用户的文件名相同,但由于用户名不同,因此也能准确地区别这两个不同的文件。显然,当系统中文件数固定时,二级目录和一级目录相比,查找速度要快得多。5.3.3多级目录

单级目录、二级目录虽然结构简单而又实用,但不足之处是缺乏灵活性,特别是不易反映现实世界中复杂的多层次的文件结构形式。为了便于系统和用户更灵活、更方便地组织、管理和使用各类文件,在二级目录结构的基础上进一步加以扩充,便形成了多级目录结构,即文件的树型目录结构。

1.多级树型目录

在树型目录结构中,根节点称为根目录,枝节点称为子目录,叶子节点称为信息文件。

例如,UNIX系统的树型目录结构如图5.9所示。图5.9多级树型目录结构在根目录之下,包含如下子目录:

lib库文件子目录

etc附加的程序和数据文件子目录

dev设备子目录

tmp临时文件子目录

usr用户子目录

bin实用程序子目录

UNIXUNIX子目录(包括操作系统核心程序)

include基本数据子目录

根目录和子目录都是文件,称为目录文件。

2.绝对路径和相对路径

在树型目录结构中,文件名有两种表示方法:绝对路径名和相对路径名。

从根开始到达文件的路径,称为绝对路径。例如,文件prog.c的绝对路径名为

/usr/user/u/c/prog.c

它表示根目录中有子目录usr,usr中有子目录user,在user子目录下有一子目录lu,lu下的一个文件是prog.c。绝对路径名总是从根目录开始,并且是惟一的。在UNIX中,路径各部分之间用“/”分隔。在MS-DOS中,其分隔符是“\”,不管使用什么分隔符,如果路径名的第一个字符是分隔符,那么这个路径就是绝对路径。另一种文件名表示法称为相对路径名。它常和工作目录(也称当前目录)的概念一起使用。用户可以指定一个目录作为当前的工作目录。这时,所有的路径名,如果不是从根目录开始,则都是相对于工作目录的。例如,如果当前的工作目录是/usr/user/lu,则绝对路径名为/usr/user/lu/prog.c的文件可以简单地用prog.c来引用。

大多数支持树型结构的操作系统,在每个目录中有两个特殊的目录项“·”和“··”,通常读作“点”和“点点”。“点”指当前目录,“点点”指其父目录。在图5.9中,若某进程的工作目录为/usr/user/lu,它可以使用“··”沿树向上到达其父目录/user。该进程使用路径名

··/xu/mailbox

访问子目录xu下的文件mailbox。5.3.4文件目录项的组织

在读/写文件前,必须先打开文件。打开文件时,操作系统利用用户给出的文件路径名到相应的目录项中查找该文件相关信息:文件结构信息、文件管理和控制信息。

文件目录项的组织随系统而异。

1.CP/M中的目录项

CP/M是一个早期的8位微机操作系统,该系统采用简单(一级)目录结构。在这个系统中只有一个目录,其目录项如图5.10所示。图5.10CP/M目录项的内容在CP/M的目录项中除了包含文件名、文件类型之外,其余的信息有:盘驱动器号、范围、块数和磁盘块号。其中,用16个字节表明该文件在盘上所占用的块号。多于16块的文件占用多个目录项,这时使用范围数。根据范围数我们可以知道哪个目录项是第一个目录项,哪个是第二个目录项,等等。块数给出了目录项中实际使用的块数。

由图5.10可以看出,分配给该文件的所有磁盘块号均包含在文件的目录项中。

2.MS-DOS中的目录项

MS-DOS采用树型目录结构。图5.11是MS-DOS的一个目录项。MS-DOS采用串联(链接)结构,其第一个磁盘块的块号(称为首簇号)放在目录项中。根据首簇号,按链接表,我们可

以找出该文件的所有块。图5.11MS-DOS的目录项

3.UNIX中的目录项

UNIX中使用的目录结构非常简单,每个目录项仅包含一个文件名及其i节点号,即

而有关文件目录项中的其余的结构、控制、管理等信息均放在i节点中。

在打开文件时,文件系统必须根据给出的文件名来找到它所有的磁盘块。查找过程如图5.12所示。图5.12查找/usr/ast/mbox的过程例如,给定文件名为/usr/ast/mbox,首先,文件系统找到根目录(在UNIX中根目录的i节点位于磁盘的固定位置)。然后在根目录中查找usr,从而可获得文件/usr的i节点号6。因为每个i节点号在盘上的位置都是固定的,所以根据i节点号找到i节点是很直接的。在i节点6中指出目录/usr所在的块号为132。在块号为132的磁盘块中存放/usr的目录,从132号块中可以找到/usr/ast的i节点号26。在i节点号为26中存放/usr/ast所在的磁盘块号406,块406存放/usr/ast的目录,从406号可以找出/usr/ast/mbox的i节点号60。最后在磁盘号为60的块中存放/usr/ast/mbox所在的所有磁盘块的块号。一个大容量的文件存储器为系统本身和许多用户所共享。为了方便用户“按名存取”所需之文件,系统应能自动地为用户分配存储空间,管理起系统和用户的存储空间。为此,存储空间管理程序应解决如下几个问题:

(1)如何登记空闲区的分布情况?

(2)如何按需要给一个文件分配存储空间?

(3)当某一文件或某一部分不再需要保留时,如何收回它所占用的存储空间?

以上这三个方面的问题都归结为盘空闲区的管理问题。常用的技术有如下几种。5.4文件存储空间的管理5.4.1空白文件目录

我们把盘空间上一个连续的未分配区域称为“空白文件”。系统为所有这些“空白文件”单独建立一个目录。对于每个空白文件,就在这个目录中建立一个表目。表目的内容包括第一个空白块地址(物理块号)、空白块个数,如表5-3所列。当某用户提出请求分配存储空间时,系统依次扫描该空白文件目录的各表目,直到找到一个满足要求的空白文件为止。

当用户删除一个文件时,系统收回其文件空间。这时也要扫描空白文件目录,找出一个空表目,将其释放空间的第一个物理块号及占用的块数填入该表目中。

这种空白文件目录的方法,类似于内存分区的管理。当请求的块数正好等于目录表目中的空白块数时,就把这些块全部分配给该文件并把该项标记为空项。如果该项中的块数多于请求的块数,则把多余的块号留在表中,并修改该表目中的各项。同样,在释放过程中,如果被释放的物理块号与某一目录项中的物理块号相邻,则还要进行合并空白文件。

这种方法仅当有少量空白文件时才有较好的效果。如果存储空间中有大量的小的空白文件,则使该目录变得很大,因而效率大为降低。其次,这种管理技术仅适用于连续文件。5.4.2空白块链

如果采用非连续结构,则可将所有空白块用链接指针或索引结构把它们组织成一个空白文件。采用链接结构时,释放和分配的空白块都可以在链首处进行,其主要问题是要修改几个有关的链接字。这种方法只要求在主存中保存一个指针,令它指向第一个空白块。当修改链接字时,要读几个盘块,工作量较大。如果采用索引表,则只需修改索引表中几个有关项,但是索引表占用的存储空间较大,对系统来说也是一个负担。

UNIX文件系统采用了一种改进的办法,即空白块成组链接法。我们将在后面介绍。5.4.3位示图(BitMap)

这种方法是为文件存储器存储空间建立一张位示图,用以反映整个存储空间的分配情况。这种方法得到许多操作系统的普遍采用,例如NOVA机的RDOS,PDP-11的DOS和微型机CP/M操作系统以及其它系统中都采用了这种方法。

其基本思想是:用若干字节构成一张图,每个字节中的每一位对应文件存储器中的一个物理块。文件存储器上的物理块,依次编号为0、1、2、……。在位示图中的第一个字节对应第0、1、2、……、7号块,第二字节对应第8、9、……、15号块,以下类推,如图5.13所示。若某位为“1”,表示对应的物理块已分配;若某位为“0”,则表示对应的物理块空闲,所以称之为位示图。由于位示图能反映磁盘盘块的分配情况,因此也称为盘图。图5.13位示图例位示图的大小由磁盘空间的大小(物理块总数)确定,而且仅用位示图的一位代表一个物理块,所以有可能用不太大的位示图就把整个盘空间的分配情况反映出来。这样,可以把它保存在内存中,物理块分配时,只要把找到的空闲块所对应的位由“0”改为“1”,而在释放时,只要把被释放的物理块所对应的位由“1”改为“0”即可。分配和释放都可以在内存的位示图上完成,而且速度较快。这一优点是它能被广泛采用的主要原因。其缺点是,尽管位示图较小,但还要占用存储空间。

假定磁盘的块长=1KB,对于200MB的磁盘需有200K位来映射,即需要200×1024/8=51200字节,即51200/1024=25个物理块来构成一个位示图。5.4.4MS-DOS的盘空间的管理

MS-DOS盘空间的分配采用文件分配表FAT,盘空间的分配单位称为簇(相当于块)。簇的大小因盘而异。每个簇在FAT表中占用一项(见图5.14)。

FAT表是一个简单的线性表,它由若干项组成。FAT表的头两项用来标记盘的类型,其余的每个项包含3个十六进制的字符:若为000,表示该簇是空闲的;若为FFF,表明该簇是一个文件的最后一簇;若为其它任何十六进制字符,则表示该簇是某一文件的下一簇号。图5.14MS-DOS中的FAT表一个文件占用了磁盘上的哪些簇,可用FAT表中形成的链表结构来说明。文件的第一个簇的簇号记录在该文件的文件目录项中。第一个簇号所在的项中包含了对应文件下一簇的簇

号。这样,依次指出下一个簇的簇号,直到文件的最后一簇,相应项中的内容为FFF(即-1)。图5.11说明了FAT表的结构和一个文件包含的所有簇的链接情况。图中,有一文件目录项,其中一字段包含该文件第一簇的簇号002,由002可以找到下一簇号为004,该文件在盘上占据了5个簇,它们是002,004,007,006,00A。5.4.5UNIX文件存储空间的管理

在UNIX系统中文件存储介质可采用磁盘或磁带。通常把每个磁盘或磁带视为一个文件卷,在每个文件卷上可以存放一个具有独立目录结构的文件系统。一个文件卷包含许多物理块。其中,0#块为引导块,用于引导操作系统;1#块为资源管理块,也称超级块,用于存放文件卷的资源管理信息,为便于管理在内存中有其副本。从2#块起存放磁盘索引节点(inode)块,其块数由文件系统的大小决定,在索引节点块之后是一般的数据块。

在资源管理块中用于一般数据块管理的项主要有:

s-nfree:当前在此登记的空闲盘块数,最多为50;

s-free[50]:当前在此登记的空闲盘块号。

1.空闲盘块的分组

UNIX系统采用空闲块成组链接法对盘空间进行管理。该方法首先把文件存储器中的所有空闲块按固定数量(一般为50块)划分为若干组。组的划分方法是从后往前顺序划分,每组50块。每组的第一块用来存放前一组中各块的块号和块数。由于第一组前面没有其它组存在,因此第一组的块数为49,最后一组可能不足50块,而且由于该组后面再也没有其它组,因此该组的物理块号和块数只能存放在资源管理块(1#块)中。系统在初启时把资源管理块复制到内存,从而使得空闲块的分配和释放可在内存中进行,参见图5.15。图5.15空闲块成组链接法

2.空闲块的分配与释放

当申请者提出空闲块请求时,盘块分配程序从栈顶弹出一空闲盘块号,将其对应的盘块分配给它,然后栈顶指针下移一格,总块数减1。若该盘块处于栈底,则将该块中存放的下一组的各块号及块数读入内存,然后才将该盘块分配给它,并重置栈顶指针。

在系统释放空间盘块时,栈顶指针加1,把释放的空闲块号压入栈顶位置,空闲块数加1。如果栈顶指针等于50,表示该组已满,需把当前栈中的50个块号及块数50写入新释放的空闲块中,使栈顶指针置“0”,然后将新释放的空闲块号压入堆栈,栈顶指针加1,空闲块数置1。在一个操作系统中,一个文件往往由多个用户共同使用,系统没有必要为每个用户都保留一个文件副本,系统应能提供某种手段,使各用户能通过不同的方法访问该文件。

5.5文件的共享5.5.1目录结构中的共享

在目录结构中,可以采用同名或异名的方式来实现文件的共享。所谓同名共享,是指各个用户使用同一文件名(包括其路径)来访问某一文件。所谓异名共享,是指各个用户使用各自不同的文件名来访问某个文件。异名共享所采用的方法称为文件的勾连。在树型结构的目录中,当有两个(或多个)用户要共享一个子目录或文件时,必须将共享的文件或子目录链接到两个(或多个)用户的目录中,此时文件系统的目录结构已不再是树型结构,而是一个有向的非循环图,如图5.16所示。例如,目录(或文件)wang既可以通过/usr/user1/wang进行访问,也可以通过/usr/user2/wang进行访问。图5.16目录结构中的文件共享勾连有两种形式:一种是允许目录项链接到目录树中的任一节点上;另一种则只允许链接到数据文件的叶子节点上。前一种形式既可以链接到目录树中的叶子节点,也可以链接到子目录节点。如果链接到子目录节点,则表示可以共享该目录及其后继目录所包含的所有文件。这种勾连方式功能很强,其不足之处是允许共享的范围过宽,不易控制和管理,使用不当会造成循环勾连。例如图中的/usr/user2/li勾连到/usr/user1/zhang上,而/usr/user1/zhang又勾连到/usr/user2上,这样就形成了循环勾连。这种循环勾连造成了目录结构的混乱。后一种方式虽不如前一种方式功能强,但同样可以达到共享的目的,且实现简单。

实现勾连的方法有两种:基于索引节点的共享和基于符号链的共享。

1.基于索引节点的共享方法

UNIX系统中,文件的目录结构由两部分构成:目录项和索引节点(也称i节点)。其中目录项由文件名和索引节点号组成。索引节点中包含文件属性,文件共享目录数,与时间有关的文件管理参数以及文件存放的物理地址的索引区等。文件在创建时,系统在目录项中填入其文件名和分配相应的索引节点号。当某用户希望共享该文件时,则在某目录的一个目录项中填入该文件的别名,而索引节点仍然填写创建时的索引节点号。这时,两个具有不同文件名的文件指向同一个索引节点,共享该文件的用户对文件的操作都将引起对同一索引节点的访问。从而提供了多用户对该文件的共享。在索引节点中包含一个链接计数,用于表示链接到该索引节点上目录项的个数。每当有一个用户要共享该文件时,则索引节点中的链接计数加1,当用户使用自己的文件名删除该文件时,链接计数减1,只要链接计数不为0,则该文件一直存在。仅当链接计数为0时,该文件才真正的被删除。这种基于索引节点的共享方法也称硬连接。

2.基于符号链的共享方法

为共享一个文件,由系统创建一个LINK类型的新文件,将新文件写入用户目录中,以实现目录与文件的链接。在新文件中只包含被链接文件的路径名,称这样的链接方法为符号连接。新文件的路径名只是被看成是一个符号链。在利用符号连接方法实现文件共享时,只有文件主才拥有指向其索引节点的指针(索引节点号),而共享该文件的其它用户只有该文件的路径名,而没有指向索引节点的指针。

符号链实际上是一个文件,尽管该文件非常简单,却仍要为它配置一个索引节点,也要用一定的磁盘空间。这种方法有一个很大的优点,就是它能跨越文件系统共享。5.5.2打开文件结构中的共享

文件在目录结构中的共享是一种静态的共享。当多个用户同时打开某一文件对其访问时,将在内存中建立打开文件结构,这时的共享称为打开文件结构中的共享,这是一种动态的

共享。

文件系统中的打开文件结构由三部分组成:进程打开文件表、系统打开文件表和内存inode,如图5.17所示。图5.17打开文件结构

(1)进程打开文件表。每个进程都有一个进程打开文件表,其中每一项是一个指针,指向系统打开文件表。

(2)系统打开文件表也叫打开文件控制块。一个进程每打开一个文件都有一个系统打开文件表,其中包含:

f-count指向该系统打开文件表的进程数

f-inode指向一个打开文件的内存inode

(3)内存inode。主要包括:

i-addr[12]文件在盘上的位置信息

i-count与此内存inode相连系统打开文件表的个数

1.父、子进程打开文件的共享

父进程创建子进程时,除状态、标识以及与时间有关的少数控制项外,子进程基本上是复制父进程的所有信息。子进程被创建后将拥有自己的进程打开文件表,其中的内容是复制父进程的。这时对于父进程打开的所有文件,子进程都可以使用,也就是说,子进程与父进程共享父进程所打开的文件。至此以后,父、子进程可以并发运行,它们还可以各自独立地打开文件,但这些各自独立打开的文件不能共享。

图5.17中进程pb是进程pa的子进程,它仍保留了两个从进程pa继承过来的打开文件,又自行打开了三个文件,进程pa自己又打开了一个文件。

2.同名或异名打开文件的共享

上述文件共享的方式仅限于父、子进程之间,更一般的方法是不同进程通过同名或异名方式打开同一文件实现共享的情况。这时,各进程使用各自的进程打开文件表和各自的系统打开文件表,但这些系统打开文件表指向同一内存索引节点,从而达到文件共享之目的。图5.17中进程pb和进程pc打开了同一文件,实现了文件的共享。当文件首次被打开时,系统将在打开该文件的进程打开文件表中分配一个表项、一个系统打开文件表和一个内存索引节点,同时把外存索引节点中的一些内容拷贝到内存索引节点中并建立起打开文件结构。当其它进程使用同名或异名再次打开该文件时,发现其索引节点已在内存中,这时系统在该进程的进程打开文件表中分配一个表项,同时也分配一个系统打开文件表,但不再分配内存索引节点,而是与另一进程共享内存索引节点。在这种共享方式中,共享文件的各个进程拥有各自的文件读、写指针,可以独立地对文件进行操作。5.5.3管道文件(Pipe)

采用管道进行通信就像在两个进程之间架设了一条管道,通信一方能够将消息源源不断地写入管道,通信的另一方不断地从管道中将消息读出。它能够实现大量消息的通信。下面介绍UNIX系统中的管道通信。

1.管道的构成

管道是一种特殊的文件,确切地说,它是一个特殊的打开文件。管道由以下部分组成:

(1)一个外存索引节点;

(2)相应的内存索引节点;

(3)两个系统打开文件表。

创建管道文件进程的进程打开文件表中的两个表项,如图5.18所示。图5.18管道文件的结构图中进程打开文件表中的两个表项各自指向一个系统打开文件表,两个系统打开文件表都指向同一内存索引节点,这两个系统打开文件表中的一个用于向管道写数据,另一个用于从管道读数据。

2.进程使用管道的一般形式

进程创建一个管道文件后,通常接着创建一个或几个子进程。子进程把父进程的打开文件全部继承下来,于是由父进程创建的管道文件就为父、子进程所共享。

当父、子进程通过管道进行通信时,该管道文件最好由两个进程专用,而且一个进程只向管道中写数据,而另一个只从管道中读数据。所以它们应该分别关闭管道文件的接收端和发送端。这时管道文件的结构如图5.19所示。进程pa只从管道中读数据,进程pb只向管道写数据。这样,用户进程简单且易于管理。

管道文件实际上是一个临时文件,它以磁盘为中介实现进程间的通信,与内存相比,其通信速度较慢。此外,它只适用父、子进程之间的通信。图5.19两个进程使用一个通信管道

3.管道文件的读写

与一般文件相比,管道文件的使用要解决两个特殊问题,即管道文件读写的同步和互斥。

1)管道文件读写的同步

作为一种通信方式,写入管道中的数据被读出后就没有存在的价值了。为了避免占用过多的存储资源,系统对管道文件的大小做了限制,通常取1KB、2KB或4KB。那么,如何实现任意长度信息的传递呢?其基本方法是,进程向管道中写入数据时,当写入的数据大于规定的长度时,就要使写进程挂起,等到数据被读进程取走后再唤醒写进程;在读进程从管道中读数据时,当管道中的数据被读完后读进程也应挂起,待写进程再次向管道写数据时唤醒读进程。上述同步过程有可能产生死锁。例如,当读进程发生读等待而相应的写进程已经关闭时,读进程将永远不会被唤醒。解决的方法是,当发生读/写等待时,在等待前先检查对方是否已经关闭。如果发现对方已经关闭,则读/写进程不必等待而直接返回。另外,进程在关闭管道文件时,也要检查对方是否正在等待。如果发现对方正在等待,则应先唤醒等待进程。

2)管道文件读写的互斥

为了防止几个进程同时对管道文件进行读写,在对管道文件实施读写时要先对其加锁,加锁时如果发现管道文件已经被加锁,则要等待其它进程释放该锁。

4.举例

在下面的例子中,父子进程使用两个管道文件进行数据交换。其中一个用于父进程向其写数据,子进程从中读数据;另一个用于子进程向其写数据,父进程从中读数据。

/*exampleforpipechannel*/

#defineMESSAGE[CD#*2]LEN100;

charparent[]={“Amessagefromparent.\n”};

charchild[]={“Amessagefromchild.\n”};

main()

intchanl[2],chan2[2];

charbuf[MESSAGE[CD#*2〗LEN];

pipe(chan1);/*createthefirstpipe*/

pipe(chan2);/*createthesecondpipe*/ if(fork())

{/*thisisparentprocess*/

close(chan1[0]);

/*closethereadchannelofthefirstpipe*/

close(chan2[1]);

/*closethewritechannelofthesecondpipe*/

write(chan1[1],parent,sizeof(parent));

close(chan1[1]);

read(chan2[0],buf,MESSAGE[CD#*2]LEN);

printf(“Parentprocess:%s\n”,buf);

close(chan2[0]);

} else

{/*thisischildprocess*/

close(chan1[1]);

close(chan2[0]);

read(chan1[0],buf,MESSAGE[CD#*2]LEN);

printf(“Childprocess:%s\n”,buf);

write(chan2[1],child,sizeof(child));

close(chan1[0]);

close(chan2[1]);

}本程序的执行结果是:

Childprocess:Amessagefromparent.

Parentprocess:Amessagefromchild.文件的共享和文件的保护是一个问题的两个方面。所谓文件共享,是指某一个或某一些文件由事先规定好的一些用户共同使用。文件的共享体现了系统内各用户之间以及用户和系统之间的协作关系。它无疑有助于系统资源的充分利用,而且每个用户也没有必要对其所用文件都由自己建立。另一方面,由于文件的共享可能导致文件的被破坏或某个用户文件的“被盗”,造成这种局面的原因是未经文件主授权的擅自存取,以及某些用户的误操作,当然也包括文件主本人的误操作。关于文件的共享,前面已作过介绍。本节只介绍文件的保护和保密,它是对文件共享的一种限制,也是保护文件所有者正当权益的根本措施。

5.6文件的存取控制为此,在文件系统中应具有文件保护的功能,并建立文件保护机构。文件的保护机构应做到:

(1)防止未核准的用户存取文件;

(2)防止一个用户冒充另一个用户存取文件;

(3)防止核准用户(包括文件主)误用文件。文件保护机构通常由存取控制验证模块来充当。该模块的基本任务是:

(1)审定用户的存取权限;

(2)比较用户的存取权限和本次的存取要求;

(3)比较本次存取要求和被访问文件的存取保护信息。

在实现具体的存取控制时,不同的系统采用了不同的方案。5.6.1文件存取控制法

1.存取控制矩阵

存取控制矩阵是一个这样的二维矩阵:一维列出系统中的所有用户,另一维列出系统中的全部文件。矩阵中的每个元素用来表示某一用户对某一文件的存取权限。存取控制矩阵法就是通过查访矩阵来确定某一用户对某一文件的可访问性。例如,设计算机系统中有n个用户U1,U2,…,Un;系统中有m个文件F1,F2,…,Fm,于是可列出存取控制矩阵其中,Rij(i=1,2,…,m;j=1,2,…,n)表示用户Ui对文件Fi的存取权限。存取权限可以是读(R)、写(W)、执行(E)以及它们的任意组合。表5-4给出了一个存取控制矩阵的例子。当一个用户向文件系统提出存取要求后,存取控制验证模块利用这个矩阵把该用户对这个文件的存取权限与存取要求进行比较,如果不一致,则拒绝存取。

存取控制矩阵法的优点是简单,缺点是不够经济。存取控制矩阵通常存放在内存,矩阵本身将占据大量空间,尤其是文件系统较大、用户较多时更是如此。因此,存取控制矩阵法没有得到普遍采用。

2.存取控制表

对存取控制矩阵进行分析,可以发现某一文件只与少数几个用户有关。也就是说,这样的矩阵是一个稀疏矩阵,因而可以简化。对此,我们可以把对某一文件有存取要求的用户按某种关系分成几种类型:文件主、A组、B组和其它,同时规定每一类用户的存取权限,这样就得到了一个文件的存取控制表,如表5-5所示。显然,系统中每一文件都应有一张存取控制表。实际上该表的项数较少,可以把它放在文件目录项中。当文件被打开时,它的目录项被复制到内存,供存取控制验证模块检验存取要求的合法性。

3.用户权限表

上述的存取权限表是以文件为单位建立的,但也可以用户或用户组为单位建立存取控制表,这样的表称为用户权限表。将一个用户(或用户组)所要存取的文件集中起来存入一张表中,其中每个表目指明用户(组)对相应文件的存取权限,如表5-6所示。

通常把所有用户的用户权限表存放在一个用特定存储键保护的存储区中,且只允许存取控制验证模块访问这些权限表,当用户对一个文件提出存取要求时,系统通过查访相应的权限表,就可判定其存取的合法性。

4.口令

使用口令,必须事先进行口令的登记。文件主在建立一个文件时,一方面进行口令登记,另一方面把口令告诉允许访问该文件的用户。文件的口令通常登记在该文件的目录中,或者登记在专门的口令文件上。在登记口令时,通常也把文件的保护信息登记进去。保护信息可以是:

(1)该文件要不要进行保护;

(2)该文件只进行写保护;

(3)该文件读、写均需保护。口令的形式采用最多8个字符的字母数字串,同时,还可以规定文件的保护方式:

(1)无条件地允许读,口令正确时允许写;

(2)口令正确时允许读,也允许写;

(3)口令正确时允许读,不管口令正确与否均不能写;

(4)无条件地允许读,不管口令正确与否均不允许写。口令、文件保护信息被登记后,系统在下述条件下进行口令核对,以实现对文件的保护:

(1)打开文件时;

(2)作业结束要删除文件时;

(3)文件改名时;

(4)系统要求删除该文件时。

口令的核对过程如图5.20所示。图5.20口令核对过程在上述四种情况下,都会出现对相应文件提出存取要求,文件系统的存取控制验证模块根据存取要求检查保护信息,看是否需要保护。如果不需要保护,则可以访问该文件;如果需要保护,则系统向控制台显示器输出要求打入口令的信息,接着操作员从控制台上打入口令,系统核对口令。如果口令正确,则允许访问,否则拒绝访问。如果口令错,还允许操作员第二次打入口令;两次都错,则拒绝访问。采用口令核对方法的优点是,对每个需要保护的文件只须提供少量的保护信息,口令的管理也比较简单且易于实现。但是有两个缺点:第一,如果你想让别的用户存取你的文件,你就必须把该文件的口令告诉他。操作员和系统程序员可能会得到系统的全部口令,因为文件的口令全部登记在系统中。总的说来,这种办法保密性不强。第二,如果某个文件的所有者企图拒绝持有口令的用户访问他的文件,他只好改换口令,而且还要通知所有能访问该文件的用户。

5.加密

上述四种方法的共同特点是在系统中要保留文件的保护信息,因此保密性不强。还有一种方法是对需要保护的文件进行加密。这样,虽然所有用户均可存取该文件,但是只有那些掌握了译码方法的用户,才能读出正确的信息。

文件写入时的编码及读出时译码,都由系统存取控制验证模块承担。但是,要由发出存取请求的用户提供一个变元——代码键。一种简单的编码是,利用这个键作为生成一串相继随机数的起始码。编码程序把这些相继的随机数加到被编码文件的字节中去。译码时,用和编码时相同的代码键启动随机数发生器,并从存入的文件中的各字节依次减去所产生的随机数,这样就能恢复原来的数据。由于只有核准的用户才知道这个代码键,因而他可以正确地存取该文件。在这个方案中,由于代码键不存入系统,因此只当用户要存取文件时,才需要将代码键送给系统。这样,对于那些不诚实的系统程序员来说,由于他们在系统中找不到各个文件的

代码键,因此也就无法偷读或篡改他人的文件了。

密码技术具有保密性强、节省存储空间的优点,但这是以花费大量编码和译码的时间为代价换来的。5.6.2文件系统的安全性

一个文件往往是用户在一段时间内辛勤工作的成果,也可能包含着无法再次获得的珍贵信息。因此,当万一发生由于软、硬件故障而造成系统失效时,应有相应措施来保证被破坏了的文件能进行有效的恢复。为此,系统应保存所有文件的双份拷贝,一旦被破坏后,就可以使用另一份。

形成文件拷贝的方法基本上有两种:一种是周期性的全量转存(MassiveDump),另一种是增量转存(IncrementalDump)。周期性的全量转存,是指按固定的时间间隔,把文件系统存储空间中的全部文件都转存入某存储介质上,例如磁盘或磁带上。系统失效时,使用这些备份的磁盘或磁带,将文件系统恢复到上次转存时的状态。周期性转存有如下缺点:

(1)在转存期间,应停止对文件系统进行其它操作,以免造成混乱。因此,全量转存影响系统对文件的操作,因而不应转存正在打开进行写操作的文件。

(2)转存时间长。如果使用磁带,一次转存可能长达几十分钟,因此不能经常进行,一般每周一次。这样,从转存介质上恢复的文件系统可能与被破坏前那一时刻的文件系统差别较大。

增量转存是一种部分文件的转存,比如把用户从进入系统到退出系统期间所建立的或修改过的文件以及有关控制信息转存到磁盘上。这段时间可能比较长,因而也可以每隔一定时间或到达一定阶段将变化了的信息文件转存到介质上。增量转存的功能是:当系统一旦遭到破坏后,至少可以恢复到数小时前文件系统的状态,从而使得所造成的损失减到最小。在实际工作中,文件转存非常重要,不可忽视,否则会造成前功尽弃的后果。在转存时,两种方法要配合使用,根据实际情况,确定全部转存的周期和增量转存的时间间隔。

一旦系统发生故障,文件系统的恢复过程大致如下:

(1)从最近一次全量转存中装入全部系统文件,使系统得以重新启动,并在其控制下进行后续的恢复工作。

(2)从近到远从增量转存盘上恢复文件。可能同一文件曾被转存过若干次,但只恢复最近一次转存的副本,其它则被略去。

(3)从最近一次全量转存盘中,恢复没有恢复过的文件。前面几节讲述了文件系统的内部特性,即文件结构、存取方法、目录组织以及空间管理等,对于这些内容我们从一般原理上作了说明。本节介绍文件系统和用户间的接口,即系统为用户提供了哪些系统调用,供用户在编制程序时灵活使用,从而也就了解到文件系统的外部特性——它是设计文件系统的出发点。一般文件系统为用户提供的系统调用主要有:建立/删除、打开/关闭、读/写文件等。下面以UNIX文件系统为例,简要说明这些系统调用的功能和用法。5.7文件系统和用户间的接口5.7.1文件的创建和删除

1.创建文件

用户希望创建一个新文件时,可以使用系统调用creat,其格式为

fd=creat(name,mode)

其中,name是用户为该文件起的符号名;mode表示文件的工作方式。如果将mode用二进制数形式表示,则其低9位规定为使用该文件的各种用户的存取权限,如下所示:系统按用户进程要求(以参数形式name,mode给出)建立一个文件后,返回一个整型量,它被称为打开文件标识数,存放在整型变量fd中。进程在本次生存期中,只需要使用此标识数而不必使用文件名就可以对该文件进行存取。系统调用creat除用于建立一个新文件外,也可用来使已经存在的文件更换原有内容。

2.删除文件

如果一个文件不再需要,则用户可用系统调用unlink来删除,以便释放该文件所占用的存储空间。

删除文件的系统调用格式为

unlink(namep)

其中namep是指向要删除的文件名。

删除(或取消,或撤消)文件,首先要删去给定路径名的目录项,所以也要进行目录搜索。如果找到了相应目录项,则将其清除,并将相应inode中的i-nlink值减1。如果i-nlink值已变为0,而且没有其它用户正打开使用这一文件,则释放该文件占用的全部存储资源。

该系统调用与link配合使用,可用来改换某文件的文件名。

如果要把文件name1再命名为name2,则使用

l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论