计算机四级操作系统-6-文件管理

6章文件管理

计算机的主要功能之一就是对数据进行数值或非数值计算。操作系统作为计算机的最为重要的系统软件必须提供数据存储、数据处理、数据管理的基本功能。数据存储通常是以文件形式存放在磁盘或其他外部存储介质上数据处理是通过文件处理来完成的,数据管理是通过文件管理来完成的。文件管理是通过目录来完成的,而目录又是建立在分区或卷的基础上的。操作系统中与文件和目录相关的子系统称为文件系统,文件系统在操作系统中占有非常重要的地位。

文件管理是操作系统中一项重要的功能。其重要性在于,在现代计算机系统中,用户的程序和数据、操作系统自身的程序和数据,甚至各种输出输入设备,都是以文件形式展现的。可以说,尽管文件有多种存储介质可以使用,如磁盘、光盘、闪存、记忆棒等,但是,它们都以文件的形式呈现在操作系统的管理者和用户面前。

本章主要介绍文件管理的有关问题,包括文件的基本概念、文件的结构、文件目录及实现、文件和目录的操作、文件系统的实现、文件的可靠性和安全性以及文件系统的性能等内容,本章还包括了Windows文件系统FATUNIX文件系统的介绍。

6.1概述

在计算机系统中,信息的组织、存取、加工和保管等工作主要是由文件系统来完成的。文件系统是操作系统中的一个重要组成部分。而且,对大多数用户来说,除了人机界面之外,文件系统是用户经常访问、直接处理的一个部分。

操作系统对信息资源的管理包括对操作系统本身、编译程序等各种系统程序、系统工具、库函数及各种用户应用程序的管理,另外还包括对系统的各种数据以及对用户的数据的管理。

不论是操作系统自身还是用户,在完成某件任务时,都要了解所使用的程序资源在什么地方,有关数据又在什么地方。显然,如果存取这些程序和数据不够快捷或者不准确,那么整个系统的使用效果是不会好的。

既然所有的计算机程序都要存储信息、检索信息,那么,对信息的存储就有一些基本的要求,概括起来有三条:

1能够存储大量的信息;

2长期保存信息;

3可以共享信息。

早期的计算机没有大容量的存储设备,程序和数据需要手工输人计算机。后来程序和数据可以保存在纸带或卡片上,然后再用纸带机或卡片机输入到计算机中。在这个阶段,这些人工干预的控制和保存信息资源的方法不仅速度奇慢,而且错误百出,极大地限制了计算机处理能力的发挥。显然,在这种存储设备的物质条件下,根本谈不上对信息的大量存储、长期保存和共享,自然也没有文件系统。

直到磁盘存储器和磁带存储器的出现,程序和数据等信息资源才开始真正被计算机所管理|可见,大容量直接存取的磁盘存储器以及顺序存取的磁带存储器等的出现,为信息资源的计算机管理提供了物质基础,从而最终导致了对信息资源管理的质的飞跃。把信息以一种单元,即文件的形式,存储在磁盘或其他外部存储介质上,导致了文件系统的出现。

在文件系统中,把程序和数据等信息看作文件,把它们存放在磁盘或磁带等大容量存储介质上。文件是通过操作系统来管理的,这些管理内容包括:文件的结构、命名、存取、使用、保护和实现方法。

操作系统为系统管理者和用户提供了对文件的透明存取。所谓透明存取,是指不必了解文件存放的物理机制和查找方法,只需给定一个代表某段程序或数据的文件名称,文件系统就会自动地完成对与给定文件名称相对应的文件的有关操作。

6.1.1文件和文件系统

研究文件系统有两种不同的角度,一种是用户的角度,另一种是操作系统的角度。

从用户的角度看文件系统,主要关心文件由什么组成,如何命名,如何保护文件,可以进行何种操作,等等。

从操作系统的角度看文件系统,主要关心文件目录是怎样实现的,怎样管理存储空间,文件存储位置,磁盘实际运作方式(与设备管理的接口),等等。

1.文件的定义

文件可以被解释为一组带标识的、在逻辑上有完整意义的信息项的序列。这个标识为文件名,信息项构成了文件内容的基本单位。在计算机系统中,程序或数据都可以是文件。信息项是构成文件内容的基本单位,这些倩息项是一组有序序列,它们之间具有一定的顺序关系。通常,

系统为一个正在使用的文件提供读写指针。读指针用来记录文件当前的读取位置,它指向下一个将要读取的信息项;写指针用来记录文件当前的写入位置,下一个将要写入的信息项被写到该处。文件的长度,可以是单字节或多字节;这些字节可以是字符,也可以组成记录;而且各个记录的长度可以相等,也可以不相等。

文件内容的具体意义,则由文件的建立者和使用者解释。

文件提供了一种将数据保存在外部存储介质上以便于访问的功能。为了方便用户使用,每个文件都有特定的名称。这样用户就不必关心文件存储方法、物理位置以及访问方式等,而可以直接通过文件名来使用文件。

各种文件系统的文件命名不尽相同。文件名称的长度因系统而异。例如,有的文件系统如SolarisUFS文件系统文件名的长度可达255个字符;FAT12(一种老的MS-DOS所用的文件系统)的8.3命名规则规定文件名为8个字符、外加句点和3个字符的扩展名;NTFS(NewTechnologyFileSystem)也可以达到255个字符。

有的文件系统不区分文件名的大小写,而有的则加以区分。FAT12属于前者,EXT2则属于后者。例如,chap5.htmCHAP5.HTMChap5.htmChap5.Htm等文件名称在FAT12中表示同一文件,而在EXT2中则表示不同的文件。

有的文件系统只能使用ASCII字符命名文件,而有的则可以使用更为广泛的字符如Unicode例如FAT12属于前者,而UFS属于后者。

有的操作系统对不同的后缀有特定的解释,而有的则没有统一的规定。MS-DOSWindows 2000/XP属于前者,而Solaris属于后者。例如,在MS-DOS中,prog,cC语言源文件,prog,cxxC++源文件,prog,docWord文件,prog,hlp为帮助文件,prog,htmHTML文档,prog,ini为配置文件等。

一般地,文件建立在存储器空间里,以便使文件能够长期保存。即:文件一旦建立,就一直存在,直到该文件被删除或该文件超过事先规定的保存期限。

文件是一个抽象机制,它提供了一种把信息保存在存储介质上而且便于以后存取的方法,用户不必关心文件实现的细节。

2.文件系统

所谓文件系统,是操作系统中统一管理信息资源的一种软件。它管理文件的存储、检索、更新,提供安全可靠的共享和保护手段,并且方便用户使用。

从用户的角度来看,文件系统负责为用户建立文件、读写文件、修改文件、复制文件和撤销文件。文件系统还负责完成对文件的按名存取和对文件进行存取控制。

文件系统的作用是很多的。比如,在多用户系统中,可以保证各用户文件的存放位置不冲突,还能防止任一用户对存储存空间的占而不用。文件系统既可保证任一用户的文件不被未经授权的用户窃取、破坏,又能允许在一定条件下由多个用户共享某些文件。

通常,文件系统使用磁盘、磁带和光盘等大容量存储器作为存储介质。因此,文件系统可存储大量的信息。

6.1.2文件分类

为了有效、方便地管理文件,在文件系统中,常常把文件按其性质和用途的不同进行分类。

1.按文件的用途分类

按文件的用途可以把文件分为如下三类:

1系统文件

操作系统和各种系统应用程序和数据所组成的文件。

该类文件只允许用户通过系统调用来访问它们,这里访问的含义是执行该文件。但不允许对该类文件进行读写和修改。

2库函数文件

标准子程序及常用应用程序组成的文件。该类文件允许用户对其进行读取、执行,但不允许对其进行修改。如C语言子程序库、FORTRAN子程序库等。

3用户文件

用户文件是用户委托文件系统保存的文件。这类文件只由文件的所有者或所有者授权的用户才能使用。用户文件可以由源程序、目标程序、用户数据文件、用户数据库等组成。

2.按文件的组织形式分类

文件的另一种分类方法是按文件的组织形式划分。

1普通文件

普通文件主要是指文件的组织格式为文件系统中所规定的最一般格式的文件,例如由字符流组成的文件。普通文件既包括系统文件,也包括用户文件、库函数文件和用户实用程序文件等。

2目录文件

目录文件是由文件的目录构成的特殊文件。显然,目录文件的内容不是各种程序文件或应用数据文件,而是含有文件目录信息的一种特定文件。目录文件主要用来检索文件的目录信息。

3特殊文件

特殊文件在形式上与普通文件相同,也可进行查找目录等操作。但是特殊文件有其不同于普通文件的性质。比如,在UNIX类系统中,输入输出设备被看作是特殊文件,这些特殊文件的使用是和设备驱动程序紧密相连的,操作系统会把对特殊文件的操作转成为对应设备的操作。

3.一些常见的文件分类方式

文件分类的方式是多样的,这里再列出几种常见的分类方式。

按文件的保护方式可划分为:只读文件、读写文件、可执行文件、无保护文件等。

按信息的流向分类可划分为:输入文件、输出文件和输入输出文件等。

按文件的存放时限可划分为:临时文件、永久文件和档案文件等。临时文件,即记有临时性信息的文件;永久性文件,即其信息需要长期保存的文件;档案文件,即保存在作为档案用的磁带或光盘等永久性介质上以备查证和恢复时使用的文件。

按文件所使用的介质类型分类可划分为:磁盘文件、磁带文件、卡片文件和打印文件等。

还可以按文件的组织结构分类。比如,由用户组织的文件称逻辑文件,逻辑文件可采用流式文件和记录式文件两种组织方式。而文件在存储介质上的组织方式是文件的物理结构物理文件),常用的组织方式有顺序文件、链接文件和索引文件等。

4.UNIX类操作系统中文件的分类

UNIX类操作系统中,文件系统包括三种类型的文件:

1普通文件。这是内部无结构的一串平滑的字符所组成的文件。

2目录文件。这是由文件目录项所构成的文件。

3特殊文件。在UNIX类操作系统中,把I/O设备也看成是一种文件——特殊文件。

上述种种文件系统的分类,其目的是:对不同文件进行管理,提高系统效率;同时,提高文件

系统的用户界面友好性。

6.1.3文件系统的功能

作为一个统一的文件管理机构,文件系统应具有下述功能:

1统一管理文件的存储空间,实施存储空间的分配与回收。

2实现文件从名字空间到外存地址空间的映射。即实现文件的按名存取,以对用户透明

的方式管理名字空间。

3实现文件信息的共享,并提供文件的保护和保密措施。

4向用户提供一个方便使用的接口(提供对文件系统操作命令,以及提供对文件的操作命令:信息存取、加工等)。

5系统维护及向用户提供有关信息。

6保持文件系统的执行效率。文件系统在操作系统接口中占的比例最大,用户使用操作系统的感觉在很大程度上取决于对文件系统的使用效果。

7提供与I/O的统一接口。

6.2文件的结构

任何一种文件都有其内在的文件结构。用户看到的是经过抽象的文件结构,这就是文件的逻辑结构。实际上,文件的逻辑结构就是从用户角度看文件,研究文件的组织形式。

除了文件的逻辑结构,文件还有其物理结构,也就是文件在实际的存储空间存储时的结构。

本节首先介绍文件的逻辑结构,然后介绍其物理结构。

6.2.1文件的逻辑结构

1.设计文件逻辑结构的原则

与文件的逻辑结构相联系的是逻辑文件的存取方式,即用户如何访问文件。在文件系统设计时,到底选择何种逻辑结构才能更有利于用户对文件信息的操作呢?这里列出在一般情况下设计文件的逻辑结构时应遵循的一些设计原则。

1易于操作。用户对文件的操作是经常而且大量的。因此,文件系统提供给用户的对文件的操作手段应当方便,用户易学易用。

2查找快捷。用户经常需要进行对文件的查找或对文件内信息的查找,设计的文件逻辑结构应便于在尽可能短的时间内完成查找。

3修改方便。当用户需要对文件信息进行修改时,给定的逻辑结构应使文件系统尽可能少地变动文件中的记录或基本信息单位。

4空间紧凑。应使文件的信息占据尽可能小的存储空间。

显然,对于字符流的无结构文件来说,查找文件中的基本信息单位,例如某个单词,是比较困难的但反过来,字符流的无结构文件管理简单,用户可以方便地对其进行操作。所以,对基本信息单位操作不多的文件较适于采用字符流的无结构方式,例如,源程序文件、目标代码文件等。

2.文件的逻辑结构

文件的逻辑结构就是用户所看到的文件的组织形式。文件逻辑结构是一种经过抽象的结构,所描述的是记录在文件中信息的组织形式。文件中的这些信息到底在物理介质上是如何组织存储的与用户没有直接关系。

可以把文件划分成三类逻辑结构:无结构的字符流式文件、定长记录文件和不定长记录文件构成的记彔树,如图6-1所示。定长记录文件和不定长记录文件可以统称为记录式文件。下面具体介绍文件的这些逻辑结构。

 

1流式文件

流式文件是有序字符的集合,其长度为该文件所包含的字符个数,所以又称为字符流文件。在流式文件中,构成文件的基本单位是字符。

可以认为流式文件就是一串有开头和结尾的连续字符。在这串字符中,不存在任何可以视为结构的组织形式,所以可以说,流式文件无结构。

正由于流式文件中不存在结构,所以用户对流式文件可以方便地进行操作。

源程序、目标代码等文件属于流式文件。UNIX类系统采用的是流式文件结构。

对操作系统而言,字符流文件就是一个个的字节,管理简单,其内在含义由使用该文件的程序自行理解,因此提供了很大的灵活性。

2记录式文件

记录式文件是一组有序记录的集合。在记录式文件中,构成文件的基本单位是记录。

记录是一个具有特定意义的信息单位,它由该记录在文件中的逻辑地址(相对位置)与记录名所对应的一组键、属性及其属性值所组成,可按键进行查找。

记录式文件可分为定长记录文件和不定长记录文件两种。

在定长记录文件中,各个记录长度相等。在检索时,可以根据记录号i及记录长度L就可以确定该记录的逻辑地址。

在不定长记录文件中,各个记录的长度不等,在查找时,必须从第一个记录起一个记录一个记录查找,直到找到所需的记录。

记录式的有结构文件可把文件中的记录按各种不同的方式排列,构成不同的逻辑结构,以便用户对文件中的记录进行修改、追加、查找和管理等操作。

6.2.2文件的物理结构

从研究文件管理、设计文件管理系统的角度来看,必须研究如何在物理存储器上存储文件,这是文件系统实现的基础。

常用的文件物理结构有顺序结构、链接结构、索引结构和I节点结构。

1.顺序结构

1顺序结构原理

顺序结构又称连续结构,这是一种最简单的文件物理结构,它把逻辑上连续的文件信息依次存放在连续编号的物理块中。也就是说,如果一个文件长n块,并从物理块号b开始存放,则该文件占据物理块号b,b+1b+2b+n-l如图6-2所示。

 

在顺序结构中,一个文件的目录项中只要指出该文件占据的总块数和起始块号即可。

2顺序结构的优缺点

顺序结构的优点是,一旦知道了文件在文件存储设备上的起始块号和文件长度,就能很快地进行存取。这是因为从文件的逻辑块号到物理块号的变换是非常简单的。

另外,顺序结构支持顺序存取和随机存取。

对于顺序存取,顺序结构的存取速度快。举例来说,一个文件从物理块a开始,现在要存取该文件的第i块,只需存取物理块a+i即可。对于磁盘来说,在存取物理块a后再存取a+1,通常不需要移动磁头,即使需要也仅需移动一个磁道(从一个柱面的最后一个扇区移到下一柱面的第一个扇区)。这样,所需的磁盘寻道次数和寻道时间都是最少的。

顺序结构的缺点在于,文件不能动态增长。假设一个顺序结构的文件在开始时需要188个物理块,在系统对188个物理块分配之后,相邻这个文件的其他空间可能分配给其他文件使用了。这时该文件如果要动态增长就没有空间了,因为顺序结构的物理块必须是连续的。如果要为顺序结构的文件预留空间,那么,预留多大的空间?另外,文件的建立者(程序或用户如何知道或确定要建立的文件的长度?更一般的情况是,一个输出文件的长度可能是难于确定的,可能需要对文件重新分配和移动,总之,困难较多。

对于顺序结构的文件申请新的空闲空间时,如果该文件长〃块,必须找到连续的n个空闲块,才能存放该文件,相对来说查找速度较慢。有可能出现找不到满足条件的连续的n个空闲块的情况,也不利于文件插入和删除。

另外,随着文件不停地被分配和被删除,空闲空间逐渐被分割为很小的部分,最终导致出现存储碎片,此时虽然空间的总空闲数比申请的要多,但却因为不连续,都是小碎片而无法分配。

解决上述问题的根本办法是采取不连续分配,以下两种分配方式都是不连续分配的。

2.链接结构

1链接结构原理

文件的链接结构的实质就是为每个文件构造所使用磁盘块的链表。使用这种链接结构的文件,将逻辑上连续的文件分散存放在若干不连续的物理块中。在每个物理块中都设有一个指针,该指针指向其后续的物理块,如图6-3所示。

 

在图6-3中,一个文件由4个物理块组成,文件控制块中保存有文件记录的首指针。首指针指向逻辑记录0,即该文件使用的第一个物理块,块号为9,其后依次为块16210。在每个物理块中都包括一个指向下一个物理块的指针。这些指针是不能被用户使用的,甚至不为用户所知。

如果每个物理块的大小是512字节,而一个盘块地址需要占用两个字节,则用户看到的块长,即逻辑块长,是510字节。链接指针需要占用一定的空间,在这个例子中,指针占用了0.39%的空间。

WindowsFAT文件系统采用的是链接结构,但将所有链指针集中存放。

2链接结构的优缺点

链接结构的优点是,存储碎片问题迎刃而解了,有利于文件动态扩充,有利于文件插入和删除,提高了磁盘空间利用率。

在建立链接结构的文件时,只需在文件目录中建立一个新的目录条目,将该条目中的首块指针初始化为空,以说明现在该文件是空的,文件长度初始化为零。

链接结构的文件动态扩充时也很简单。从空闲空间信息中得到一个空闲块亦即第一个空闲块,然后将该块链接到文件尾部,并改变文件的长度值即可。只要还能申请到空闲块,文件可以一直动态地扩充增长。

链接结构的主要缺点是,存取速度慢,不适于随机存取文件;磁盘的磁头移动多,效率相对较低;存在文件的可靠性问题,比如指针出错,文件也就出错了;另外,链接指针需要占用一定的空间。

例如,要在链接结构的文件中找寻一个文件的第i块时,必须从该文件的首块开始沿着指针逐块寻找下去。每读一个指针就要读对应的物理盘块,一共要读i块,才能得到文件的第i块。

链接结构的文件所使用的物理块是不连续分配的,所以一个链接结构的文件的所有物理块在磁盘上是分散分布的。与顺序结构的文件相比,在访问一个链接结构的文件时需要更多的寻道次数和寻道时间。

使用链接结构的文件必须重视其可靠性问题。如果某一个文件中的某一个盘块中的指针丢了,则从该文件中的指针所指的物理盘块后的所有盘块就都读写不到了。指针出问题的原因还可能是操作系统软件的一个隐藏错误或磁盘硬件故障,例如读写错了或指针所在的盘面坏了。

为了提高可靠性,可以采用双向链接,或者在每个物理块中存储文件名称和相对块号等办法改进。不过这些办法只能有限地提高可靠性,并不能从根本解决问题,而且需要耗费更多的空间。

这种将链接指针存放在文件块中的方法称为隐式链接。因为要想得到链接指针,必须读取文件块,因此这种方法在文件查找中费时费力。改进的方法是将这些链接指针提取出来,放到一个特别的数据结构中,在文件系统装载时读入内存,这样可以有效地解决文件查找缓慢以及文件块不能全部存放文件数据的问题,缺点是这个数据结构需要占用一定的存储空间,当外存的空间较大时,这个数据结构会占用很大的内外存资源。这种链接方式称为显式链接结构,典型的文件系统是FAT结构文件系统,实例将在本章后面6.7.1节进行讨论。

3.索引结构

1索引结构原理

索引结构的文件把每个物理盘块的指针字集中存放在被称为索引表的数据结构中的内存索引表中。在每个文件相应的目录条目中包括该文件的索引表地址,而索引表中的第i个条目指向文件的第i块,如图6-4所示。这样,要读某个文件的第i块,只需从该文件索引表的第i个条目中得到该文件块的地址就行了。

L1

在开始建立索引结构的文件时,把索引表中的所有指针置为空。当第一次需要在文件的第i块写人信息时,从空闲块信息中任意申请一个空闲块,然后将该块地址写人索引表的第i个条目。

2索引文件结构的优缺点

索引文件结构保持了链接结构的优点,又解决了其缺点。索引结构文件既适于顺序存取,也适于随机存取。这是因为有关逻辑块号和物理块号的信息全部保存在了一个集中的索引表中,而不是像链接文件结构那样分散在各个物理块中。

索引文件可以满足文件动态增长的要求,也满足了文件插入、删除的要求。索引文件还能充分利用外存空间。

索引结构的缺点是会引起较多的寻道次数和寻道时间;索引表本身增加了存储空间的开销。

显然,如果文件很大,它的文件索引表也就较大。如果索引表的大小超过了一个物理块,那么也必须决定索引表的物理存放方式。

如果索引表采用连续结构,不利于索引表的动态增加。如果釆用链接文件结构存放索引表,会增加访问索引表的时间开销。较好的一种解决办法是采用间接索引,也称多级索引。间接索引是在索引表所指的物理块中不存放文件信息,而是装有存放这些信息的物理块地址。这样就有一级间接索引,还可以进行类似的扩充,即二级间接索引,等等。但是,多级索引显然会降低文件的存取速度。

其实,大多数文件是不需要进行多级索引的。在文件较短时,可利用直接寻址方式找到物理块号而节省存取时间。在实际的文件系统中,有一种做法是把索引表的头几项设计成直接寻址方式,也就是这几项所指向的物理块中存放的就是文件信息;而索引表的后几项设计成多级索引,也就是间接寻址方式。

在索引结构文件中要查找文件,要顺着链进行查找,但是整个索引表都可以存放在内存中,不需要访问磁盘,不管文件有多大,在目录项中只需记录一个起始块号,根据它就可以找到文件的全部块。

另外,在索引结构文件中粟存取文件时,需要至少访问察储设备两次以上。其中,一次是访问索引表,另一次是根据索引表访问在存储设备上的文件信息,这样势必降低了对文件的存取速度。一种改进的方法是,当对某个文件进行操作之前,系统预先把索引表放入内存。

索引分配技术继承了链接分配技术的优点,如没有存储碎片等,同时又解决了链接分配技术中的不支持直接存取和可靠性问题。索引分配支持直接存取,不会因为一个指针的错误就引起全盘覆没。当然,其他方面的可靠性问题还是存在的。

索引结构对空间的占用比较严重。这是因为大多数文件都是小文件,如果一个文件系统中索引表是定长的话,那么即使一个文件仅占一两个盘块,也同样需要一整个索引表。如果为了加快存取速度而把索引表放在内存,那么要占用的空间対内存来说是非常大的。

索引结构的上述缺点引出了这样的问题:索引表应该多大?应该定长还是变长?解决问题的办法有以下种类:

1索引表的链接模式。一个索引表通常就是一个物理盘块。这样,读写索引表比较简单。对大文件就用多个索引表并将之链接在一起。例如,一个索引表可能包括一个小小的块头指出文件名,和一组头100盘块的地址,最后一个地址是空(对于小文件或是一个指向下一个索引表的指针(对于大文件)。这种模式下存取文件尾将需要读所有索引表,对于大文件来说这可能需要读很多块。

2多级索引。这是上述索引表链接模式的一种改善变种,将一个大文件的所有索引表(二级索引)的地址放在另一个索引表(一级索引)中。这样,要存取文件中的一个块,操作系统使用一级索引找到二级索引表,再用后者找到所要的数据盘块。这个方法可以扩展为三级索引或四重索引,但一般两重索引就足够了。如果一个索引表可放256个盘块地址指针,则两重索引允许文件有多达65536个数据盘块。如果一个盘块长1KB则这意味着文件最大长度为67108864字节64MB)

4.索引结构的实例——I节点

I节点是一种多级索引文件结构。I节点最早出现在UNIX操作系统中,是多级索引结构文件在UNIX中的具体实现。I节点在一般多级索引结构文件的基础上,进行了结构上的变化,克服了索引结构的缺点。掌握了I节点也就掌握了多级索引文件结构的工作原理。

I节点的基本思想是,给每个文件赋予一张称为I节点的小表,在这张小表中列出了文件属性和文件中各块在磁盘上的地址,参见图6-5

 

在采用I节点的文件中,文件的开始几个磁盘地址存放在I节点内。比如,在图6-5中,I节点内可记录15个盘块地址指针,其中前12个指针直接指向文件数据盘块,称为直接盘块。对于所有各级索引表统称为间接盘块;在图6-5中,第13个指针指向一个索引表,该索引指向文件数据盘块,称为一重间接盘块;14个指针指向一个二级索引表,称为二重间接盘块,该索引表所指向的索引表指向文件数据盘块;15个指针指向一个三级索引表,称为三重间接盘块。

这样,对于不超过12块的小文件就不需要单独的索引表,因为所需信息均在I节点中。在打开文件时,这些信息从磁盘读人内存。

对于稍大一些的文件,在I节点中有一个索引表,即一重间接盘块地址,这个磁盘块中含有附加的磁盘地址。

如果文件再变大,就可以釆用I节点中的二级索引表。如果这还不够的话,还可以采用三级索引表。

使用I节点的文件结构,不仅适合小文件使用,也可供大型文件使用,灵活性比较强。这种文件结构占用的系统空间比一般多级索引结构的文件要少。

6.2.3文件的存储介质

文件系统和存储设备是密切联系的,没有存储设备就没有文件系统。本小节介绍主要的外存储设备。

1.存储介质的特点

在计算机系统中,外存储设备同内存相比较,一般有容量大、断电后仍可保存信息、速度较慢、成本较低等特点。

外存储设备通常由驱动部分和存储介质两部分组成。存储介质又常被称为卷,字来自把存储介质看作信息容器的比喻。驱动器的作用是使计算机能够实现读写及保存、控制、测试)存储介质上的内容。例如,软盘设备由软盘驱动器(即软盘驱动器硬件部分和控制部分)以及软盘片(即存储实体组成。

存储设备有很多种类,如磁盘、磁带、磁鼓、纸带、光盘和闪存等,而且一个计算机系统中可同时连接多种存储设备。有些存储介质是可重用的,即写了以后还可以重写,如磁记录类、光记录类和电记录类等。有些存储介质是不可重用的,即写了以后就不可以重写,如早期的纸带卡片等

有的外存储设备中,存储实体可以同驱动器分离,称为可移动的存储实体。对可移动的存储实体而言,存储实体可以单独保存起来,也可以装到同一计算机系统的另一可移动驱动器上,还可以装到不同计算机系统的同类设备上,从而实现了存储实体的移动。常见的闪存,又称Flash盘或E盘,就是可移动存储实体中的一种。

外存储设备的空间组织与地址存取方式比较复杂。在磁盘中,磁盘空间由盘面、柱面、磁道和扇区组成。对外存储设备的使用就是在外存储设备上存取数据,即往外存储设备写数据,或从外存储设备读数据。

外存储设备存取的过程方式因各种具体存储设备而异,不过也有一定共性。外存储设备存取的过程大致如下:读状态置数据置地址置控制读状态,等等。一个字符的I/O可能要有上述过程的若干个循环才能完成。

2.用户对外存储设备的要求

用户使用外存储设备,目的在于读写存储在介质上的数据。用户对外存储设备的要求是:方便、效率、安全,更具体来说,有以下的要求:

1在读写外存储设备时不涉及硬件细节,用户直接使用逻辑地址和逻辑操作。

2外存储设备存取速度尽可能快,容量大且空间利用率高。

3外存储设备上存放的信息安全可靠,防止来自硬件的故障和他人的侵权。

4可以方便地共享,存储空间可动态扩大、缩小,携带、拆卸便捷,可随时了解存储设备及使用情况。

5以尽可能小的代价完成上述要求。

2.文件在存储设备中的存取

外存储设备的特性决定了文件的存取方式。常见的外存储设备有顺序存取设备和随机存取设备两种。

1顺序存取设备

磁带是最早使用的磁记录存储介质。显然,磁带是一种顺序存取设备,因为在磁带上,只有在前面的物理块被访问之后才能存取后续的物理块,如图6-6所示。

 

在图6-6中,由磁带的读写方式可以知道,只有当第i块被访问之后,才能访问第i+1块。因此,某个物理块距离磁头的当前位置很远时,就需要花费很长的时间来转动磁带,使第i+1块物理块移动到磁头下面。

磁带设备的优点是存储容量大。磁带虽能保存大容量的数据,但存取速度太慢。更重要的是,由于磁带只能进行顺序存取,即前面的物理块被存取访问之后,才能存取后续的物理块的内容。这种设备不适合用于随机存取方式,故磁带主要用于后备存储和保存不经常使用的信息,或用作不同系统之间传递数据的一种介质。

2随机存取设备

在随机存取设备中,磁盘是一种典型的随机存取设备。磁盘设备允许文件系统直接存取磁盘上的任意物理块。为了存取一个特定的物理块,可将磁头直接移动到所要求的位置上,而不像顺序存取那样需要顺序移过一系列的其他物理块之后,才能到达需要存取的特定物理块。磁盘结构如图6-7所示。

 

磁盘一般由若干磁盘片组成,每个磁盘片对应两个读/写磁头,分别对磁盘片的上下两面进行读写。各个磁头与磁头臂相连。系统在对磁盘初始化时,将盘面上划分出一些同心圆,作为存储信息的介质,称为磁道简称道)。对每个磁道又分为若干段,称为扇区。每个扇区就构成了一个物理块。整个磁盘上的所有扇区(物理块)统一编号,从0开始。所有磁盘片的相同磁道称为柱面。

磁盘上每个物理块的位置可用柱面号磁道号)、磁头号和扇区号表示,这些地址与物理块号一一对应。其计算公式如下:

1已知物理块号,则磁盘地址:

柱面号=[物理块号/(磁头数X扇区数]

磁头号=[(物理块号mod(磁头数x扇区数))/扇区数]

扇区号=(物理块号mod(磁头数x扇区数)mod扇区数

2巳知磁盘地址:

物理块号=柱面号x(磁头数x扇区数+磁头号x扇区数+扇区号

磁头臂是沿半径方向移动的。访问磁盘时,首先要移动磁头臂到相应柱面(磁道上,然后旋转盘片将指定磁头定位在指定扇区上,最后控制磁头对扇区中的数据进行读写。所以,一次访盘时间由寻道时间、旋转定位时间和数据传输时间组成,其中,寻道时间由于是机械动作,因而所花费的时间最长。

在磁盘中,磁头臂只能沿半径方向移动。在访问磁盘时,首先要把磁头臂移动到相应柱面的磁道上,称为寻道。然后等待盘片旋转,使指定的扇区转到磁头之下,实现了对磁道和扇区的定位。最后控制磁头对扇区中的数据进行读写。

可见,一次访问磁盘的时间由寻道时间、旋转定位时间和数据传输时间所组成,其中,寻道时间是机械动作的时间,因而所花费的时间最长。

通过对磁盘读写的分析,可以看到,存取磁盘上任一物理块的时间与该物理块所处的位置无关,这与顺序存储设备是完全不同的。

由于盘片正反两面都使用,或若干个磁盘片组合固定在一起由同一个马达驱动,因此需要标定盘面的代号或磁头号。

将所有盘面中处于同一磁道号上的所有磁道组成一个柱面,这就形成了柱面号。读写同一柱面内的数据不需移动磁头,实际上节省了访盘时间。

磁盘是机械设备,一方面速度慢,另一方面会出现故障。为解决此问题,Raid技术被提了出来,Raid技术主要是解决上述两个问题,因此,在组成Raid的结构上有多种方法。RaidO采用多个磁盘并行的方式以提高读写速度,将数据以条带的方式分组,别、同时地存入一组并联的磁盘中,如图6-8所示;Raidl用磁盘镜像的方法来提高存储的可靠/性,可以是一块磁盘或一组磁盘的镜像;Raid2Raid3字节作为并行单位,与Raid0类似;而Raid4的并行单位是,为提高可靠性加入了校验,校验码是独立存放的;Raid5Raid4相同,但是校验码以为单位与数据块一起随机存放在磁盘块中;其他的Raid结构都是上述各种方法的组合或扩展,最常用的是Raidl+0以及Raid5

 

计算机对存储系统的要求是高速、大容量和非易失。但是目前同时满足上述三个要求的存储器件是不存在的。随着电子技术的发展,电可擦除的新型半导体存储器件(俗称闪存)被发明出来并得到广泛应用,它具有非易失的特点。近几年来通过不断改进,由这种电可擦除的存储单元组织起来的固态硬盘Solid State DiskSSD)由于其优越的性能而在当前的计算机系统中得到了普遍的应用。

固态硬盘是由闪存作为主要存储介质,辅之与控制电路和译码寻址电路共同组成一个计算机的外部设备,其主要的功能是用于存放数据信息并可以随机访问。由于计算机系统大量使用硬盘接口因此固态硬盘沿用了原来的硬盘接口规范,它有如下优点:

非易失:固态硬盘存入的数据失电以后能继续保存数据信息。

访问速度快:由于固态硬盘无机械结构,寻址通过译码电路完成,因此相对普通硬盘其访问速度较快。特别是读出时间,几乎与RAM相当,这对纯代码的访问非常有利。

低功耗:无电机等大功率耗能单元。

抗冲击:无磁头等精密器件,可以在频繁移动的设备上使用。

它的缺点是:

成本高:单位存储成本还是高于传统硬盘,因此大量应用还受到限制。

写入寿命限制:最常用的闪存是NAND存储器,其写入次数是有限的,以廉价的三层存储单元Triple Layer Cell,TLC)为例,其每个单兀的写入次数为5001000次,对于操作系统的LOG记录而言是不够的,当然技术人员通过编制主控软件使得存储单元顺序平衡存取,可以大大延长固态硬盘的寿命。

随着技术的进一步发展,操作系统也在与时倶进,针对不同的存储体系,设计相应的管理策略和使用策略,达到相应这一个时期的最好性能及最低成本。

6.2.4文件的存取方式

用户通过对文件的存取来完成对文件的各种操作,文件的存取方式是由文件的性质和用户使用文件的情况而确定的。

在用户面前,文件呈现的是文件的逻辑结构,这与用户使用文件的方式相适应。在存储介质面前,文件呈现的是文件的物理结构,这与文件所使用存储介质的特性有关。

一个文件要能够为用户所使用,单有其逻辑结构和物理结构是不够的,必须提供一种文件的逻辑结构和物理结构之间的映射或变换机制,其作用是把用户对一个文件中某个逻辑记录访问的请求转变为对该文件物理结构中某个存储块中的字符串的读写请求,也就是把对逻辑字符串地址的请求变换为对物理字符串地址的请求。

文件的存取方式就是这样一种文件的逻辑结构和物理结构之间的映射或变换机制,它以一种逻辑清晰、使用便利的方式,把用户对逻辑文件的存取要求变换为对相关文件的物理存储块的读写请求。

文件常用的存取方法有:顺序存取和随机存取两种方式。

至于选择哪一种文件的存取方式,既取决于用户使用文件的方式,也与文件所使用的存储介质有关。比如,数据库文件,就适合采用随机存取方法。而如果存储介质采用的是磁带,那就只能用顺序存取方法了。

1.顺序存取

顺序存取就是按从前到后的次序依次访问文件的各个信息项。

对记录式文件,是按记录的排列顺序来存取,例如,若当前读取的记录为A,则下一次读取的记录被自动地确定为Ri+1

顺序存取只要把当前记录的逻辑地址加上记录的长度,就可以得到下一个记录的逻辑地址。若要直接存取第n个记录,其逻辑地址则为(n-l)x记录长度。

对流式文件,顺序存取反映当前读写指针的变化,在存取完一段信息后,读写指针自动指出下次存取时的位置。

2.随机存取

随机存取又称直接存取,即允许用户按任意的次序直接存取文件中的任意一个记录,或者根据存取命令把读写指针移到文件中的指定记录处读写。

UNIX类操作系统的文件系统采用了顺序存取和随机存取两种方法。

在图6-9中列出了文件结构及文件存取方式与文件存储介质的关系,以便使读者对三者之间的关系有一个更清晰的认识。

存储介质

磁带

磁盘

物理结构

连续结构

连续

链接

索引

存取方式

顺序存取

顺序

顺序

顺序

随机

 

随机

6-9文件结构、文件存取方式与存储介质

6.3文件目录

在一个计算机系统中保存有许多文件,用户在创建和使用文件时只给出文件的名字,由文件系统根据文件名找到指定文件。为了便于对文件进行管理,设置了文件目录,用于检索系统中的所有文件。

6.3.1文件目录的组成

文件系统的一个特点是按名存取,即用户只要给出文件的符号名就能方便地存取在外存空间的该文件的信息,而不必了解和处理文件的具体物理地址。

在操作系统中为了管理大量的文件,为每个文件都设置一个描述性数据结构——文件控制块FCB(File Control Block)把所有文件的文件控制块有机地组织起来,就构成了文件控制块的一个有序集合,称为文件目录。

文件目录实际就是文件符号名到文件物理地址之间的一种映射机制。

1.文件控制块FCB结构

文件控制块FCB是系统为管理文件而设置的一个数据结构。FCB是文件存在的标志,它记录了系统管理文件所需要的全部信息。

FCB通常应包括以下内容文件名、文件号、用户名、文件地址、文件长度、文件类型、文件属性、共享计数、文件的建立日期、保存期限、最后修改日期、最后访问日期、口令、文件逻辑结构、文件物理结构,等等,如图6-10所示。

在文件控制块中的信息可以分成文件存取控制信息、文件结构信息和文件管理信息。下面对文件控制块中主要的栏目说明如下:

文件名,是用户给文件取的名称。

文件号,是系统在文件创建时所指定的一个编号,文件号唯一地标识一个文件,即在一个文件系统中文件号是不重复的。

用户名,记录了该文件创建者的名称。一般而言,一个文件的创建者就是该文件的所有者。

文件物理结构,标识了该文件内部的物理结构是顺序结构、链接结构还是索引结构。

文件逻辑结构,指出该文件是流式文件还是记录式文件。

文件物理位置,记录了与文件在存储介质中的物理位置有关的信息。如果文件是链接结构,则该栏目中保存了该文件记录的首指针;如果是索引结构,则该栏目中保存了该文件的索引表地址。

文件长度和记录大小,则分别保存有该文件的长度和每个物理块的大小。

文件类型,这与该文件系统的文件类型的划分方法有关。一些常见的文件类型有:源程序文件、可执行文件、字符文件、数据文件、语音文件和视频文件等。

文件属性,指出文件是只读式文件、可读写文件还是只可执行文件。

共享说明,指出该文件是否允许其他用户使用,是仅允许组内用户使用,还是允许系统中的所有用户使用等。

口令,是指为了文件的安全和文件信息的保密所设置的访问文件的密码。

保存期限,是指预计该文件的保管时间。有的文件只是临时性使用,或只使用一次,就可以丢弃;有的文件可能需要保存几十年,比如一些重要的财务文件。

2.目录文件

当用户建立一个新文件时,与该文件有关的一些信息与属性记录在该文件的文件控制块内。多个文件的文件控制块集中在一起组成了文件的目录。通常,文件目录以文件的形式保存起来,这个文件就被称为目录文件。目录文件是长度固定的记录式文件。

在目录文件中,每个文件的文件控制块又称为目录文件中的目录项。如果某个系统中的文件比较多,对应的目录文件显然也比较长。有时,为了节省内存的空间,就把目录文件保存在外存储器上,在需要时才把目录文件调入内存。

6.3.2文件目录结构

文件目录是实现用户按名存取文件的一种手段。在用户要求读一个文件时,系统便从文件目录中查找用户所指定文件是否存在,并核对是否有权使用。一个好的目录结构应该既能方便用户的检索,又能保证文件的安全。

文件数量较少时,在文件目录中查找文件比较简单。在文件数量比较多时,文件目录的组织与管理的重要性就突出了。为了能够方便用户的检索和文件的管理,根据实际的需要,一般把文件目录设计成一级(单级目录结构、二级目录结构和多级目录结构。

1.一级目录结构

在系统中设置一张线性目录表,表中包括了所有文件的文件控制块,每个文件控制块指向一个普通文件,这就是一级目录结构,如图6-11所示。

 

一级目录结构是一种最简单、最原始的文件目录结构。通常该目录表存放在存储设备的某个固定区域,在系统初启时或需要时,系统将该目录表调入内存或部分调入内存。文件系统通过该目录表提供的信息,对文件进行创建、搜索、读写和删除等操作。例如,当建立一个文件时,首先从该目录表中申请一项,并存入该文件的有关信息;当删除一个文件时,就从该目录表中删去对应的目录项。

有了一级目录,文件系统就可实现对文件空间的管理和按名存取。例如,当用户进程要求对某个文件进行读写操作时,它调用有关的系统调用,通过事件驱动或中断控制方式进人文件系统,此时,处理器控制权在文件系统手中。文件系统首先根据用户给定的文件名搜索一级文件目录表,以查找该文件信息的对应物理块号。如果搜索不到对应的文件名,或者失败返回在进行读操作时),或者由空闲块分配程序进行空闲块分配,然后再修改一级目录表。如果已找到该文件的第一个物理块块号,则系统根据该文件所对应的物理文件的结构信息,计算出所要读写的文件信息块的全部物理块块号,然后系统把处理器控制权交给设备管理系统,启动有关设备进行文件的读写操作。

在一级目录表中,各个文件说明项都处于平等地位,只能按连续结构或顺序结构存放,因此,文件名与文件必须一一对应限制了用户对文件的命名,不能重名。如果两个不同的文件重名的话,则系统将把它们视为同一文件。

另外,由于一级目录必须对一级目录表中所有文件信息项进行搜索,因而搜索效率较低,文件平均检索时间长。

一级目录结构的优点是简单,容易实现。

2.二级目录结构

为克服一级目录结构中文件目录命名中的可能冲突,并提高对目录文件的检索速度,一级目录被改进扩充成二级目录。

在二级目录结构中,目录被分为两级。第一级称为主文件目录Main File Directory,MFD),给出了用户名和用户子目录所在的物理位置;第二级称为用户文件目录User File Directory,UFD)又称用户子目录,给出了该用户所有文件的FCB这样,由MFDUFD共同形成了二级目录。二级目录的结构如图6-12所示。

 

6-12中,在第一级主文件目录MFD中有三个用户:ChenZhangWu并且分别给出了指向这三个用户的用户目录文件的指针。在三个第二级用户目录文件UFD中,分别有所有用户文件的文件控制块。比如在Chen用户目录文件中,列出了三个文件appletextclipart的文件控制块。

当用户要对一个文件进行存取操作或创建、删除一个文件时,首先从第一级主文件目MFD中找到对应的目录名,并从用户名查找到该用户的第二级用户目录文件UFD余下的操作就与一级目录时相同了。

二级目录解决了文件的重名问题,可以实现用户间的文件共享,查找时间也降低了。二级目录的缺点是增加了系统的开销。

由于查找二级目录首先从主目录MFD开始搜索,因此,从系统管理的角度来看,文件名已演变成为用户名/用户文件名。从而,即使两个不同的用户具有同名文件,系统也会把它们区别开来。

再者,利用二级目录,也可以方便地解决不同用户间的文件共享问题。这只要在被共享的文件说明信息中增加相应的共享管理项和把共享文件的文件说明项指向被共享文件的文件说明项即可。

另外,如果一级目录表的长度为n的话,则在一级目录时的搜索时间与n成正比;与一级目录相比,在二级目录时,由于长度为n的目录已被划分为m个子集,则二级目录的搜索时间是与w+r成正比的。这里的m是用户个数,r是每个用户的文件的个数,一般m+r≤n,从而二级目录的搜索时间要快于一级目录。

6.3.3树形目录

把二级目录的层次关系加以推广,就形成了多级目录,又称树形目录结构,如图6-13所示。

 

在树形目录结构中,除了最低一级的物理块中装有文件信息外,其他每一级目录中存放的都是下一级目录或文件的说明信息,由此形成层次关系,最高层为根目录,最低层为文件。根目录是唯一的,由它开始可以查找到所有其他目录文件和普通文件。根目录一般可放在内存。从根结点出发到任一个非叶结点或叶结点(文件都有且仅有一条路径,该路径上的全部分支组成了一个全路径名。

树形目录结构的优点是便于文件分类,且具有下列特点:

1层次清楚。不同性质、不同用户的文件可以构成不同的子树,便于管理;不同层次、不同用户的文件可以被赋予不同的存取权限,有利于文件的保护。

2解决了文件重名问题。文件在系统中的搜索路径是从根开始到文件名为止的各文件名组成,因此,只要在同一子目录下的文件名不发生重复,就不会由文件重名而引起混乱。

3查找搜索速度快。可为每类文件建立一个子目录,由于对多级目录的查找每次只查找目录的一个子集,因此,其搜索速度较一级和二级目录时更快。

目前大多数操作系统如UNIXLinux类、Windows等都采用多级目录结构。在图6-14中给出了UNIX操作系统的一棵目录树。

 

在图6-14中,一个UNIX系统的根目录由binetclibtmpusr构成。其中bin目录中一般存放系统文件,usr根目录中存放的是各个用户的子目录。在图6-14中,有两个用户cherryapple访问用户cherry文件的路径是/usr/cherry

多级目录结构的优点是,层次结构清晰,便于管理和保护,解决了重名问题,查找速度加快。多级目录结构的缺点是,查找一个文件按路径名逐层检查,由于每个文件都放在外存,多次访盘会影响速度,结构相对比较复杂。

6.3.4路径名

1.当前目录与目录检索

文件系统向用户提供了一个当前正在使用的目录,称为当前目录,又称工作目录。如果需要,用户可随意更改当前目录。

用户在访问文件时,需要进行目录检索,这时用户给出文件名,系统按名寻找目录项。

有两种根据路径名检索的方法,一种是全路径名,另一种是相对路径。

使用全路径名检索的方法,需要从根目录开始,列出由根到用户指定文件的全部有关子目录,全路径名又称为绝对路径名。但是,如果每次都从根结点开始检索,很不方便。因为通常各目录文件放在外存,故影响访问速度,尤其是当目录层次较多时检索要耗费很多时间。

为克服这一缺点,引入相对路径的概念。相对路径的含义是,用于检索的路径名只是从当前目录开始到所要访问文件的一段路径,即以当前目录作为路径的相对参照点。这样检索路径缩短,检索速度提高。

2.文件目录的改进

一个文件控制块一般要占很多存储单元,这样导致目录文件往往也很大。在检索目录时,为了找到所需要的目录项,常常要将存放目录文件的多个物理块逐块读入内存进行查找,这就降低了检索速度。

为加快目录检索可采用目录项分解法,即把目录项FCB)分为符号目录项(次部和基本目录项(主部两部分。其中,符号目录项包含文件名以及相应的文件号,而基本目录项包含了除文件名外文件控制块的其他全部信息,参见图6-15

 

假设一个文件控制块有48字节,符号目录项占8字节,其中文件名占6字节,文件号占2字节;基本目录项占48-8=40字节。设物理块的大小为512字节。

在进行目录项分解前,一个物理块可以存放512/48≈10个文件控制块。在进行目录项分解后,一个物理块可以存放512/8=64个符号目录项,或者512/40≈12个基本目录项。

如果一个目录文件有128个目录项,那么分解前128x48/512=12,即需要12个物理块存放该目录文件。

在进行目录项分解后,符号目录文件占128x8/512=2,即需要2个物理块存放符号文件。基本目录项占128x40/512=10即需要10个物理块存放基本目录文件。

下面,计算查找一个文件的平均访盘次数。

分解前:(1+12)/2=6.5次。

分解后:(1+2)/2+1=2.5次。

可见,目录项分解法的优点是,减少了访问磁盘的次数,提高了文件目录检索速度。

6.3.5目录操作

本节介绍对目录的操作,这通常由系统调用实现。在不同系统中,管理目录的系统调用是不同的:下面给出UNIX的一个例子,以便用户具体了解这些系统调用及它们的工作方式。

请注意,在UNIX中,“.”代表当前目录“..”代表根目录。

1CREATE创建目录。在新创建的目录中,除了目录项外,目录内容是空的。而目录项和是系统自动放在目录中的(有时通过mkdir程序完成)。

2DELETE,删除目录。只有当一个目录为空时,该目录方可被删除。所谓空目录的含义是,在一个目录中只有目录项和“..”。和这两个目录项是不能被删除的。

3OPENDIR打开目录,使内容可被读取。如,为列出目录中的全部文件,程序须先打开该目录,然后读其中全部文件的文件名同打开和读文件相同,在读目录前必须打开目录。

4CLOSEDIR关闭目录。读目录结束后,应关闭目录以释放内存空间。

5READDIR系统调用READDIR返回打开目录的下一目录项。以前也采用READ系统调用来读目录,但该方法有一缺点:程序员须了解和处理目录的内部结构。相反,不论采用哪一种目录结构,READDIR总是返回目录项的一个标准格式。

6RENAME文件可换名,目录也可换名。

7LINK链接技术允许在多个目录中出现同一文件。这个系统调用指定一个存在的文件和一个路径名,并建立从文件到路径所指名字的链接。这样,可以在多个目录中出现同一文件。

8UNLINK删除目录项。如果被解除链的文件只出现在一个目录中(通常情况),它从文件系统中被删除。如果它出现在多个目录中,则只删除指定路径名,依然保留其他路径名。在UNIX中,用于删除文件的系统调用实际上就是UNLINK

UNIX中,最主要的有关目录的系统调用已在上面列出。当然还有其他一些调用,如与目录相关的管理保护信息的系统调用。

6.4文件系统的实现

前面讨论的文件系统,主要是从用户的角度探讨问题。文件的使用者关心文件是如何命名的、可以进行哪些文件操作、文件目录是如何组织的、如何检索或查找文件目录等问题。

本节从设计和实现者的角度讨论文件系统如何实现。文件的设计和实现者感兴趣的是,在磁盘上怎样安排文件和目录存储,如何管理磁盘空间以及怎样使文件系统有效而可靠地工作等等

本节依次讨论存储空间的分配与回收、实现文件系统的表目、记录的成组与分解和文件的操作。

6.4.1存储空间的分配与回收

在计算机系统中,存储空间是一种宝贵的资源。外存储设备中的空间容量虽然比较大,但也不是无限的,故对文件删除之后而不再使用的空间必须加以回收,然后在建立文件等操作中重新利用。

对于只读的存储设备(如CD-ROM光盘),无所谓回收,也无所谓动态分配,这种存储设备在物理上就是不可重用的。

为了进行存储空间的分配与回收,在外存储设备上设置有空闲空间登记表,该表动态跟踪该外存储设备上所有还没有分配给任何文件的空闲块的数目和块号。

该空闲空间登记表虽然称为表,但不一定以一个二维表格的形式实现。从方便、高效和安全的角度考虑,通常把空闲空间登记表放在存储介质上。

对空闲空间登记表的访问与修改工作是经常发生的。在进行文件删除、文件建立、写文件等操作中都会访问和修改空闲空间登记表。

在设计空闲空间登记表的数据结构时,一般有四种不同的方案可以考虑,下面分别介绍。

1.位示图

位示图法的基本思想是,利用一串二进制位bit)的值来反映磁盘空间的分配使用情况。在位示图中,每一个磁盘中物理块用一个二进制位对应,如果某个物理块为空闲,则相应的二进制位为0;如果该物理块已分配了,则相应的二进制位为1,如图6-16所示。

在图6-16中,假设行号代表磁道,那么第0行中的第1位是1,第0行中的其他位都是0,说明了在第0磁道中块号为1的物理块已经被占用,而第0磁道中的其他物理块都是空闲的。同样,在第1磁道中,只有块号为7的物理块已经被占用,而第1磁道中的其他物理块都是空闲的。

在申请磁盘物理块时,可在位示图中从头查找为0的位,如果发现了为0的位,则将其改为1,同时返回该二进制位对应的物理块号。在归还不再使用的物理块时,则在位示图中将该物理块所对应的二进制位改为0,表示这块物理块恢复为空闲状态。

位示图对空间分配情况的描述能力强。一个二进制位就描述一个物理块的状态。另外,位示图占用空间较小,因此可以复制到内存,使查找既方便又快速。位示图适用于各种文件物理结构的文件系统

 

使用位示图能够简单有效地在盘上找到n个连续的空闲块。很多计算机提供了位操作指令,使位示图的查找能够高效进行。例如Intelx86微处理器系列就有这样的指令:返回指定寄存器的所有位中值为1的第一位。

2.空闲块表

空闲块表是专门为空闲块建立的一张表,该表记录外存储器中全部空闲的物理块,包括每个空闲块的第一个空闲物理块号和该空闲块中空闲物理块的个数,如图6-17所示。空闲块表方式特别适合于文件物理结构为顺序结构的文件系统。

在建立新文件时,应该寻找一组连续的空闲物理块,其空闲块个数恰好等于或接近于所申请值。系统首先查找空闲块表,主要查看该空闲块表项中是否有符合上述申请值的对应表项,如果有,就将该表项从空闲块表中删去,并且把所对应的一组连续的空闲物理块分配给申请者。

当删除文件时,系统收回它所占用的物理块,并且考虑所收回的物理块是否可以与原有空闲块相邻接,以便合并成更大的空闲区域,最后修改有关空闲块表项。

序号

首空闲块号

空闲块个数

0

10a8

12

1

9002

98

2

a6003

4096

n

899a08

2568

6-17空闲块表

3.空闲块链表

将外存储器中所有的空闲物理块连成一个链表,用一个空闲块首指针指向第一个空闲块,随后的每个空闲块中都含有指向下一个空闲块的指针,最后一块的指针为空,表示链尾,这样就构成了一个空闲块链表,如图6-18所示。

 

在图6-18中,一个空闲块链表的首指针维持一个指向物理块12的指针,该块是第一个空闲物理块。物理块12包含一个指向物理块13的指针,物理块13指向物理块14,如此等等。

空闲块链表模式效率低。要遍历整张空闲块链表,必须读每一个物理块,这就需要大量的I/O时间。

在空闲块链表模式中对空间的申请和释放是以块为单位的。申请空间时从链首取空闲块,空间释放时将物理块接入链尾。

空闲块链表法节省内存,但申请空间和回收空间的速度较慢,实现效率较低。

4.成组链接

对链接表的一个改进方案是将n个空闲盘块的地址存放在第一个空闲块中,如图6-19所示。其余n-1个空闲盘块是实际空闲的。假设每100个空闲块为一组。第一组的100个空闲块块号放在第二组的头一块中,而第二组的其余99块是完全空闲的。第二组的100个块号又放在第三组的头一块中。依此类推,组与组之间形成链接关系。在最后一组的块号中第2个单元填“0”,表示该块中指出的块号是最后一组的块号,空闲块链到此结束。在这个空闲块链中,不足100块的那个组的块号通常放在内存的一个专用块中。这种方式称为成组链接。

 

系统在初始化时先把专用块内容读到内存中,当需分配空闲块时就直接在内存中找到哪些块是空闲的,每分配一块后把空闲块数减1。但在把一组中的第一个空闲块分配出去之前,应把登记在该块中的下一组的块号及块数保存到专用块中(此时原专用块中的信息已经无用,因为它指出的一组空闲块都已被分配了)。当一组空闲块被分配完后,再把专用块的内容读到内存中,指出另一组可供分配的空闲块。

在图6-19中,假设所有的空闲块是连续的这在系统初始化中是可能的,所以这个例子仍有其通用性)。在内存的专用块中记录有20个空闲块,首块号是820,最后一块是801号,系统在分配空闲块时,先把801号分配出去,然后空闲块数减1

在分配编号为820的首块之前,先把820号中记录的空闲块数100和下一组空闲块号,即从701799800100个块号都写入专用块中。最后把第820号空闲块分配出去。在这一组中,共分配了20个空闲块。

此时,再有空间分配的申请,则先分配第701号空闲块,然后依次分配,直至799号。在分配800号之前,与前面的操作一样,先把800号中记录的空闲块数100和下一组空闲块号,即从601699700100个块号都写入专用块中。然后把第800号空闲块分配出去。在这一组中,共分配了100个空闲块。

后面的成组空闲块也是运用同样的方法分配,每一组都分配了100个空闲块。

但是对于最后一组,由于其前一组的第一块中第2个单元填“0”,所以在这个空闲块中实际只记录了最后一组的99个空闲块的块号。

当归还一块空闲块时,只要把归还块的块号登记到当前组中,且空闲块数加1。如果当前组已满100块,则把这100个块号写到归还的那块中,该归还块就成为新组的第一块。

假设初始化时系统已把专用块读入主存储器L单元开始的区域中,分配和回收的算法如下:

1分配一个空闲块

L单元内容(空闲块数):

当空闲块数>1i:=L+空闲块数;

i单元得到一空闲块号;

把该块分配给申请者;

空闲块数减1

当空闲块数=1,取出L+1单元内容一组的第一块块号或0);

=0,无空闲块,申请者等待;

取值≠0,把该块内容复制到专用块;

该块分配给申请者;

把专用块内容读到主存L开始的区域。

2归还一块

L单元的空闲块数;

当空闲块数<100,空闲块数加1;

j=L+空闲块数;

归还块号填人j单元。

当空闲块数=100,把主存中登记的信息写入归还块中;

把归还块号填入L+1单元;

L单元置成1

采用成组链接后,分配回收空闲块时均在内存中查找和修改,只有在一组空闲块分配完或空闲的磁盘块构成一组时才需要启动磁盘读写。因此,成组链接的管理方式比普通的链接方式效率高。

成组链接这种方案能够迅速找到大量空闲盘块地址。有些版本的UNIX操作系统便采用了这种方案。

6.4.2实现文件系统的表目

当用户申请打开一个文件时,系统要在内存中为该用户保存一些必要的信息,这些信息以表格栏目中内容的形式出现,被称为表目。在实现文件系统时所需要的表目有若干种,其中在内存中所需的重要表目有如下一些。

1.系统打开文件表

系统打开文件表专门用于保存已打开文件的文件控制块。该系统打开文件表放在内存。除了保存已打开文件的文件控制块之外,在该表格中还保存有已打开文件的文件号、共享计数、修改标志等,参见图6-20

FCB主部

文件号

共享计数

修改标志

 

 

 

 

 

 

 

 

 

 

 

 

6-20系统打开文件表

2.用户打开文件表

在每个进程中都有一个用户打开文件表,该表的内容有文件描述符、打开方式、读写指针、系统打开文件表入口等,参见图6-21

文件描述符

打开方式

读写指针

系统打开文件表入口

6-21用户打开文件表

另外,在进程的进程控制块PCB中还记录了用户打开文件表的位置。

3.系统打开文件表与用户打开文件表之间的关系

显然,在系统打开文件表和用户打开文件表之间存在一种关系。实际上,用户打开文件表指向了系统打开文件表。如果多个进程共享同一个文件,则一定有多个用户打开文件表目对应着系统打开文件表的同一入口,参见图6-22

用户打开文件表(P2)

6-22打开文件表之间的关系

6.4.3记录的成组与分解

用户的文件毫无疑问是由用户按自己的需要组织的。用户还可按信息的内在逻辑关系,把文件划分成若干个逻辑记录。显然,逻辑记录的大小是由文件性质决定的。

另一方面,存储介质上的物理分块与存储介质的特性有关,尤其是磁盘。磁盘上的块的大小是在磁盘初始化时预先划分好的。因此,逻辑记录的大小往往与存储介质物理分块的大小不一致。

当用户文件的逻辑记录比存储介质的物理分块小得多时,把一个逻辑记录存入一个物理块中就会造成存储空间的浪费。为此,可把多个逻辑记录存放在一个物理块中,当用户需要某个逻辑记录时再从一物理块信息中将其分解出来。

1.记录的成组

把若干个逻辑记录合成一组存放在一个物理块的工作称为记录的成组,每块中的逻辑记录个数称为块因子

记录的成组在不同存储介质上进行信息转储是很有用的。例如,某用户有一批早期的原始数据记录在一叠卡片上,共6张,每张卡片上最多记录80个字符。现在要把这批早期卡片上的数据转储到磁盘上。如果每当卡片输人机读取了一张卡片上的信息之后就立即把它转储到磁盘上,则磁盘上一个物理块也只不过就记录了仅仅80个字符。

假设磁盘上的一个物理块有512字节,于是一个物理块上只记录80个字符时,显然,磁盘空间的利用率太低了,只有15.6%。若把6张卡片的数据集中存放到磁盘上的一个物理块中,则磁盘空间的利用率就可以提高到80x6/512=93.75%

由于信息交换以块为单位,所以要进行成组操作时必须使用内存的缓冲区,该缓冲区的长度等于要进行成组的最大逻辑记录长度乘以成组的块因子。在上面的卡片存储的例子中,最大逻辑记录长度为80,成组的块因子为6。成组操作如图6-23所示。

 

在上面的例子中,共有6个逻辑记录k1k2k3k4k5k6在内存缓冲区中被合成一组,然后启动磁盘把这6个逻辑记录同时写到磁盘块中。可以看到,如果每个逻辑记录单独记录到磁盘上,不仅浪费空间,而且还要执行6次启动磁盘请求。合并以后,操作系统对用户的前5次读取记录请求都不需要启动磁盘。而在用户提出第6次读取记录请求后,缓冲区中存放了6个逻辑记录,再启动磁盘把这6个记录同时写入一个磁盘块中。可见,记录的成组不仅提高了存储空间的利用率,而且还减少了启动外部设备的次数,提高了系统的工作效率。

在进行记录成组时,还应考虑逻辑记录的格式。这是因为在记录式文件中,有定长记录格式和不定长记录格式。对定长记录格式的文件按记录成组的方式存储到存储介质上,则除最后一块外每块中存放的逻辑记录个数是相同的。故只要在文件目录中说明逻辑记录的长度和块因子,在需要使用某个记录时就能方便地将其找出。

如果是一个不定长记录格式的文件,各个逻辑记录的长度可能不相等,在进行记录成组操作时就应在每个逻辑记录前附加说明该记录长度的控制信息。

2.记录的分解

对应前述记录成组的操作,有必要考虑从一组逻辑记录中把一个逻辑记录分离出来的操作,这种操作称为记录的分解

显然,记录的分解操作也要使用内存缓冲区。

当用户请求读一个文件中的某个记录时,文件系统首先找出该记录所在物理块的位置,然后把含有该记录的物理块的全部信息读入内存缓冲区,由于读入内存缓冲区的物理块信息中含有多个逻辑记录,所以要再从内存缓冲区中分解出指定的记录,然后传送到用户工作区。

对定长记录格式,只要知道逻辑记录的长度就可容易地进行分解。对不定长记录格式,要根据说明逻辑记录长度的控制信息,计算出用户所指定的记录在内存缓冲区中的位置,然后把记录分解出来。

 

在图6-24中,用户要求读出逻辑记录k4用户文件中的记录是成组存放在磁盘上的,系统找出含有记录k4的物理块,从中读出了6个逻辑记录k1k2k3k4k5k6,并且知道这些逻辑记录的长度为80,块因子为6。该块信息被读人内存缓冲区后,根据逻辑记录的长度和块因子为6,立即就能取出其中的逻辑记录k4并把k4传送到用户工作区。

从上面的讨论可以看到,为了提高存储空间的利用率和减少启动设备的次数,采用了记录的成组和分解技术。但是上述效果的获得也付出了代价,主要是需要设立内存缓冲区,另外,操作系统增加了成组和分解的操作的功能

6.4.4文件的操作

文件系统是提供给用户使用的,用户可以进行按名存取所需要的文件。在文件系统的实现中,为用户提供使用文件的手段是文件系统的重要任务之一。下面介绍几个常用的进行文件操作的系统调用。

1.建立文件

用户首先调用文件系统的建立文件操作,在请求调用该操作时提供所要创建的文件的文件名及若干参数:用户名、文件名、存取方式、存储设备类型、记录格式、记录长度,等等。系统依据用户提供的文件名及若干参数,为这一新创建的文件分配一个文件控制块,填写文件控制块中的有关项。

建立文件的实质是建立文件的文件控制块FCB并建立必要的存储空间,分配空的FCB从而建立起系统与文件的联系。

建立文件系统调用的一般格式为:create(文件名,访问权限,(最大长度))。

建立文件的具体步骤如下:

1检查参数的合法性:

文件名是否符合命名规则,若是,则进行下一步2);否则报错,返回。

2检查同一目录下有无重名文件:

若没有,则进行下一步3;否则报错,返回。

3在目录中有无空闲位置:

若有,则进行下一步4;否则,不成功返回Q

有的系统可能要为此文件申请数据块空间(申请一部分或一次性全部申请)。

5填写目录项内容:

包括:文件名、用户名、存取权限、长度置零、首地址等。

6返回。

2.打开文件

打开文件,是使用文件的第一步,任何一个文件使用前都要先打开,即把文件控制块FCB送到内存。

打开文件系统调用的一般格式为:fd=open(文件路径名,打开方式)。

打开文件时,系统主要完成以下工作:

1根据文件路径名查目录,找到FCB主部。

2根据打开方式、共享说明和用户身份检查访问合法性。

3根据文件号查系统打开文件表,看文件是否已被打开。

如果是,共享计数加1;否则,将外存中的FCB主部等信息填入系统打开文件表空表项,共享计数置为1

4在用户打开文件表中取一空表项,填写打开方式等,并指向系统打开文件表对应表项。返回信息:文件描述符fd这是一个非负整数,用于以后读写文件。

3.读文件

打开文件后,就可以读取文件中的信息。

读文件系统调用的一般格式为:read(文件名,(文件内位置),要读的长度,内存目的地址)

隐含参数:文件主。

读写方式可为读、写和既读又写等。

读文件时,系统主要完成以下工作:

1检查长度是否为正整数:

若是,则进行下一步2;否则,转向10

2根据文件名查找目录,确定该文件在目录中的位置。

3根据隐含参数中的文件主和目录中该文件的存储权限数据,检查是否有权读。

若是,则进行下一步4;否则,转向10

4由文件内位置与要读的长度计算最末位置,将其与目录中的文件长度比较,超过否?若是,则转向10;否则,进行下-5也可将参数中的长度修正为目录中的文件长度。

5根据参数中的位置、长度和目录中的映射信息,确定物理块号、需要读出的块数等读盘参数(参数准备完毕后,进行物理的读盘操作,读盘操作可能要进行多次)。

6根据下一块号读块至内存缓冲区。

7取出要读的内容,也许要进行成组的分解,将取出的内容送至参数中的内存目的地址。

8根据块内长度或起始块号+块数,确定还读下一块吗?同时确定下一块块号:

若是,则转向5;否则,进行下一步9

9正常返回。

10错误返回,返回相应错误号。

4.写文件

写文件系统调用的一般格式为:write(文件名,记录键,内存位置)。

把内存中指定单元的数据作为指定的一个记录写入指定文件中,系统还将为其分配物理块,以便把记录信息写到外存上。

5.关闭文件

若文件暂时不用,则应将它关闭。文件关闭后一般不能存取,若要存取,则必须再次打开。关闭文件系统调用的一般格式为:close(文件名

系统根据用户提供的文件名或文件描述符,在该文件的文件控制块上做修改。例如,将该文件的共享用户数减1,减1后若值为0,则将文件控制块置上非活跃标志,若该文件控制块内容被修改过,则要写回外存。

6.删除文件

删除文件系统调用的一般格式为:delete(文件名)。

系统根据用户提供的文件名或文件描述符,检查此次删除的合法性,若合法,则收回该文件所占用的文件控制块及物理块等资源

7.指针定位

指针定位的一般格式为:seek(fd新指针的位置)。

指针定位时,系统主要完成以下工作:

1fd检查用户打开文件表,找到对应的入口;

2将用户打开文件表中文件读写指针位置设为新指针的位置,供后续读写命令存取该指针处文件内容。

在不同的文件系统中,文件操作的种类是不同的,文件操作的命令种类会有所变化,调用名和参数也都不同。上述这些类型,只是文件操作中的一些典型例子。其他的文件操作如:读取文件属性,设置文件属性,修改文件名称,等等。

6.5文件的保护和安全

文件系统中有对用户而言十分重要的信息。设法防止这些信息不被未授权使用、不被破坏,这是所有文件系统的一个主要内容。以下几节讨论涉及文件的共享、文件的安全保护和防范病毒有关的一些问题。

在计算机系统中,有各种类型的文件。有些文件是被所有用户所共享的,比如编译系统中的编译程序文件。但是,还有一些文件不是随意可被共享的。比如,某个公司的一些内部文件,只希望被公司内部少数高层管理人士所阅读,这就需要建立这些文件的存取权限。

6.5.1文件的共享

文件的共享是指一个文件可以允许多个用户共同使用。文件共享不仅是完成共同任务所必需,而且还带来许多好处:节省文件所占用的存储空间;免除系统复制文件的工作;减少用户大量重复性劳动;减少实际输入输出文件的次数。此外,利用文件共享可以实现进程间相互通信。

在允许文件共享的系统中,必须对共享文件进行管理。从共享的时间段上看,共享文件的使用有两种情况:

1)文件可以同时使用

允许多个用户同时使用同一个共享文件,但系统必须对该共享文件实施同步控制。一般说,允许多个用户同时打开共享文件执行读操作,而不允许读者与写者同时使用共享文件,也不允许多个写者同时对共享文件执行操作,以确保文件信息的完整性。

2)文件不允许同时使用

任何时刻只允许一个用户使用共享文件,即不允许两个或两个以上的用户同时打开一个文件。要待一个用户使用结束关闭了文件后,才允许另一个用户打开该文件。

在文件共享的具体方式上,有三种文件的共享形式:

1文件被多个用户使用,由存取权限控制。

2文件被多个程序使用,但分别用自己的读写指针。

3文件被多个程序使用,但共享读写指针。

在多级目录结构中,链接法(link)是常用的实现文件共享技术。对文件共享的链接法可以通过两种链接方式实现:一种是允许目录项链接到任一表示文件目录的结点上;另一种是只允许链接到表示普通文件的结点上,如图6-25所示。

 

在图6-25中,矩形表示目录,圆圈表示文件。

第一种链接方式表示可共享所链接的目录及其各个子目录所包含的全部文件。采用这种方式,可以把所有要共享的文件放在一个公共目录中,所有要共享这些文件的用户与共享目录链接。例如,usrlusr2这两个用户目录都链接子目录working,working目录下的三个文件(methods,routinetemp)都被usrlusr2所共享。每个用户还可以在共享目录中建立自己的子目录。这样做便于共享,但对控制和维护造成困难,甚至有可能因使用不当而造成环路链接,产生目录管理上的混乱。

第二种链接方式只允许对单个普通文件链接,从而可以通过不同路径访问同一个文件,即一个文件可以有几个别名。如图6-25中,/usrl/map/usr2/map分别表示两个不同的路径名,但它们指向同一个文件map这种链接方式较为可靠,且易于管理。UNIX基本上采用这种链接方式。

6.5.2文件的保护

计算机系统中的文件是非常脆弱的。如果系统发生故障,就有可能造成文件被破坏、受损或丢失的现象。而用户使用不当,也同样可能造成文件被破坏、受损或丢失的现象。这里举出一些引起文件破坏丢失的可能原因:

1灾祸:火灾、洪水、地震、战争、暴乱或老鼠啃坏磁带、软盘等。

2硬件或软件故障:CPU的错误操作、不能读取的磁盘或磁带、远程通信错误、程序故

障等。

3人为的出错:错误数据的输入、磁带或磁盘安装错误、程序运行出错、丢失磁带或磁盘。文件系统必须有防止硬、软件的各种意外可能破坏文件的能力。为此,文件系统经常采用建立副本和定时转储的方法来保护文件。

1.建立副本

对文件建立副本,是保护文件不受破坏的有效方法。可以把同一个文件保存到多个存储介质上,这些存储介质可以是同类型的,也可以是不同类型的。这样,当对某个存储介质保管不善而造成文件信息丢失时,或当某类存储设备故障暂不能读出文件时,就可用其他存储介质上的备用副本来替换。这种方法简单,但设备费用和系统开销增大,而且当文件需修改或更新时,必须要改动所有的副本。因此,这种方法一般用于短小且极为重要的文件。

2.定时转储

定时转储的含义是,每隔一定的时间就把文件转储到其他的存储介质上。当文件发生故障时,就用转储的文件来复原,把有故障的文件恢复到转储时刻文件的状态。这样,文件仅丢失了自上次转储以来新修改或增加的信息,可以从文件转储恢复后的状态开始重新执行。UNIX系统就是釆用定时转储的方法保护文件,以提高文件的可靠性。

按照转储内容可分为增量转储和全量转储。增量转储是指备份自上一次转储以来更改过的文件。按照转储方式可分为物理转储和逻辑转储。物理转储是从磁盘的第0块开始,将全部磁盘块按序输出到另一介质上,直到最后一块复制完毕。而逻辑转储是从一个或几个指定的目录开始,递归地转储其自给定日期(例如,最近一次增量转储或全量转储的日期)后有所更改的全部文件和目录。

3.规定文件的存取权限

规定用户使用文件的权限的方法有两种:

1采用树形目录结构。

凡能得到某级目录的用户就可得到该级目录所属的全部目录和文件,按目录中规定的存取权限使用目录或文件。

2存取控制表。

列出每个用户对每个文件或子目录的存取权限。在这种机制中,系统对拥有权限的用户,应该让其进行相应的操作;对于超越其操作权限者,应禁止其操作;系统同时还要防止其他用户以任何理由冒充拥有权限的用户对文件进行操作。

验证用户的存取操作步骤大致如下:

审定用户的存取权限;

比较用户权限的本次存取要求是否和用户的存取权限一致;

将用户的存取要求和被访问文件的存取控制表进行比较,看是否有冲突。如果没有冲突,允许用户对有关文件进行访问;如果有冲突,处理冲突。

在上述验证用户的存取操作步骤中,重要的是审查用户的权限和审查本次操作的合法性,这两步构成了验证用户的存取操作的关键。

6.5.3文件的存取权限

对文件设置一定的存取权限,是常用的保护文件的一种方法。对文件存取权限的设置有几种方法,如存取控制矩阵和二级存取控制等。

1.存取控制矩阵

在存取控制矩阵方式中,系统以一个二维矩阵来实施文件的存取控制。在这个二维矩阵中,其中一维代表所有的用户,另一维代表所有的文件。两维交叉点所对应的矩阵元素则是某一个用户对一个文件的存取控制权限,包括读RW和执行E如图6-26所示。当然,还可以有其他的划分形式。

在图6-26中,水平方向是用户,图中列出了三个用户:用户1、用户2和用户3。垂直方向是文件,图中列出了四个文件:文件A文件B文件C和文件D

可以看到,用户1对文件A具有读和执行的权限,没有写的权限。而用户2和用户3对文件A则具有读、写和执行的权限。

用户1对文件B具有读和执行的权限,没有写的权限。用户2对文件B什么权限也没有。而用户3对文件B则只有执行的权限,没有读和写的权限。

而对于文件C和文件D用户1、用户2和用户3对它们都具有全部的权限。

文件权限

用户1权限

用户2权限

用户3权限

R

W

E

R

W

E

R

W

E

文件A

X

文件B

X

X

X

X

X

X

文件C

文件D

6-26存取控制矩阵

与存取控制矩阵配套,系统中必须有存取控制验证模块。当用户向文件系统提出存取要求时,由存取控制验证模块根据该文件存取控制矩阵的内容对用户的本次存取要求进行比较,如果不匹配的话,系统拒绝执行用户的本次存取要求。

存取控制矩阵的方法在概念上比较简单,实现起来也比较容易。

但是,当文件和用户较多时,存取控制矩阵会变得非常庞大,这导致占用了太多内存空间。而且在为使用文件而对矩阵进行扫描时,花费的时间开销也比较多。因此,在实现存取控制矩阵

时往往采取某些辅助措施,以减少时间和空间的开销。

2.二级存取控制

对文件实施存取控制的另一种方法是二级存取控制。二级存取控制方法中设立两个存取级别。在第一级,把用户按某种关系划分为若干用户组,进行对访问者的识别;在第二级,进行对操作权限的识别。这样,所有用户组对文件权限的集合就形成了对该文件的存取控制,如图6-27

所示。

在图6-27中,用户被划分为系统用户组开发用户组远程用户组

对于文件A系统用户组拥有全部的权限,开发用户组也拥有全部的权限,而远程用户组只能对文件A进行读和执行操作,不能进行写操作。

对于文件B系统用户组只能进行读和执行操作,不能进行写操作,开发用户组只能对文件B进行执行操作,不能进行读和写操作,而远程用户组则对文件B没有任何操作权限。

对于文件C系统用户组拥有全部的权限,开发用户组只能对文件C进行读和执行操作,不能进行写操作,而远程用户组也只能对文件C进行读和执行操作,不能进行写操作。

对于文件D系统用户组拥有全部的权限,开发用户组只能对文件D进行读和执行操作,不能进行写操作,而远程用户组也只能对文件D进行读和执行操作,不能进行写操作。

文件权限

用户1权限

用户2权限

用户3权限

R

W

E

R

W

E

R

W

E

文件A

X

文件B

X

X

X

X

X

X

文件C

X

X

文件D

X

X

6-27二级存取控制

3.UNIX中的文件存取权限

下面以UNIX系统为例,进一步说明对文件的存取权限的控制设计UNIX中对文件的存取权限划分为两级。在第一级中对访问者或者用户进行分类识别:

1文件属主或文件拥有者owner);

2文件属主的同组用户group);

3其他用户other)

在第二级中,对文件操作则根据不同的操作内容进行权限限定,把对文件的操作分成如下的类别:

1Read)操作R);

2Write)操作W);

3执行eXecute)操作(X);

4不能执行任何操作--)。

由于对文件属主、组和其他用户均有上述三种权限设置,因此每个文件共有九个权限参数。UNIX中,使用命令就能看到各个文件的权限设置,例如:

$Is—1

drwx

4 userwheel

512Nov

251723

Mail

——rw--rw——r

1 userwheel

149Dec

41418

Makefile

—rwxr——xr—x

1 userwheel

3212Dec

41236

a.out

drwxr——xr——x

1 userwheel

512Dec

1417:03

bin

——rw——r r

1 userwheel

143Dec

41236

hello,c

drwxr——xr—x

2 userwheel

1024Oct

16 1997

public_html

drwxrwxrwx

2 userwheel

512Jan

31407

tmp

从上面的例子中,可以看到文件的权限设置在列出的数据的第一列中显示。ls输出结果第一列中的第一个位置表示类别,例如,“d”表示目录,“c”表示该文件为字符设备文件,“b”表示为块设备文件“1”表示为一个符号连接;其余9个位置分别表示3组的3种权限设置:2个到第4个位置表示属主的权限分别设置为读、写和执行,第5个到第7个位置设置同组用户的权限,第8个到第10个位置设置其他用户的权限。若指定位置上没有显示对应的权限,而是,则表示不允许对应的权限。

例如文件a.out的属性是--rwxr--xr--x,因此a.out的权限设置为:对于属主user的权限为读写和执行,对于同组用户为读和执行权限,对于其他用户也是读和执行权限。

对于目录来讲,拥有读权限意味着用户可以列出这个目录下的文件内容,写权限表示用户可以在这个目录下增、删文件和更改文件名,执行权限保证用户可以使用cd进入这个目录。

UNIX系统内部使用数值来表示上述的文件属性,每一个属性与文件属性中的一个二进制位相对应。如果该存取权限设置了,对应的二进制位就是1,如果该存取权限没有设置,对应的二进制位是0这样,a.out的权限属性rwxr--xr--x用二进制来表示就是111101101UNIX中常使用八进制的形式表示,于是a.out的这个权限是755

UNIX中,文件的属主和管理员可以使用命令chmod来设置或改变文件的权限。chmod有几种不同的使用方法,可以直接使用八进制的权限表示方式设置属性,或者使用属性字母来设置或更改文件的属性,不同的使用方法要求不同的chmod参数。

6.5.4文件的保密

文件保密的目的是防止不经文件拥有者授权而窃取文件。规定文件的使用权限在一定程度上可起到文件保密的作用,但是,文件的使用权限可由用户设定或修改,因而单靠规定文件的使用权限不能达到文件保密的目的。常用的文件保密的措施有以下几种:

1.隐蔽文件目录

把保密文件的文件目录隐蔽起来,这些文件的文件目录不在显示器上显示。非授权的用户不知道这些文件的文件名,因而不能使用这些文件。很多操作系统中采用了这种方法,通过专用命令可以隐蔽和解除隐蔽指定的文件目录。

2.设置口令

为文件设置口令是实现文件保密的一种可行方法,建立文件时把口令存放在文件目录中:用户使用文件时必须提供口令,仅当提供的口令与文件目录中的口令一致时,才可按规定的使用权限使用文件。

为防止口令泄密,应采取隐蔽口令的措施,即在显示文件目录时应把口令隐藏起来。万一口令泄密,应及时更改口令。如果允许用户共享文件,可把口令通知授权用户,但当收回某个用户的使用权时必须更改口令,而更改后的口令又必须通知其他的授权用户。

3.使用密码

对极少数极为重要的保密文件,可把文件信息加密,转换成密码形式保存,使用文件时再将其解密。

用于文件信息加密和解密的密码,应该只限文件主及允许使用该文件的伙伴知道,于是,非授权用户就窃取不到文件信息。采用密码的方法增加了文件重新加密和解密的工作,使系统的开销增大。

6.6文件系统的性能

文件系统的物理基础是磁盘设备。显然,磁盘存储器的服务效率、速度和可靠性就成为文件系统性能和可靠性的关键。设计文件系统时应尽可能减少磁盘访问次数,这样可以适当减少磁盘存储器性能对文件系统性能的影响。

除此之外,还应该从其他方面考虑,釆取有效的措施,提高文件系统的性能。常见的技术措施有如下几种:块高速缓存、磁盘空间的合理分配和对磁盘调度算法进行优化。

1.块高速缓存

其基本思想是,系统在内存中保存一些磁盘块,这些磁盘块在逻辑上属于磁盘,内存的这一区域被称为块高速缓存。运行时,系统检查所有的读请求,看所需的文件块是否在块高速缓存中3如果在,则可直接在内存中进行读操作;否则,首先要启动磁盘,将所需块读到高速缓存中,再拷贝到其他内存区域。如果内存中的高速缓存已满,则需要按照一定的算法淘汰一些较少使用的磁盘块,让出块高速缓存空间。

块高速缓存的内容需要定期写回到磁盘上,以保存对磁盘块的修改。但是,如果在修改过的磁盘块写回磁盘之前,系统出现故障,则文件系统有可能会处于不一致状态。特别是一些未被写回的块是I节点块、目录块或者包含空闲表的磁盘块时,这个问题尤为严重。这一问题称为文件系统一致性问题。

2.合理分配磁盘空间

在磁盘空间中分配块时,应该把有可能顺序存取的块放在一起,最好在同一柱面上。这样可以有效地减少磁盘臂的移动次数,加快了文件的读写速度,从而提高了文件系统的性能。

3.磁盘的驱动调度

磁盘是一种高速旋转的存储设备。磁头沿着盘片直径方向移动,同时对指定磁道上的扇面中的数据进行读写操作。当多个访盘请求在等待时,系统采用一定的策略,对这些请求的服务顺序进行调整安排,使寻道时间和延迟时间都尽可能小的那个访问请求可以优先得到服务,并降低若干个访问者的总访问时间,增加磁盘单位时间内的操作次数。其目的在于降低平均磁盘服务时间,从而实现公平、高效的访盘请求。

磁盘的存取访问时间由三部分组成:寻道时间,即将磁头移动到相应的磁道或柱面所需的时间;旋转延迟时间,即一旦磁头到达指定磁道,必须等待所需要的扇区旋转到读\头下的时间;传输时间,即信息在磁盘和内存之间的实际传送时间。一次磁盘服务的总时间就是以上三个时间之和。要使磁盘服务尽可能地快,就需要操作系统提供合适的磁盘调度算法,以改善磁盘服务的平均时间。

设计磁盘调度算法应当考虑两个基本因素:

1公平性。一个磁盘访问请求应当在有限时间内得到满足。

2高效性。减少设备机械运动所带来的时间开销。

磁盘驱动调度由移臂调度旋转调度两部分组成。

1移臂调度

根据访问者指定的柱面位置来决定执行次序的调度,称为移臂调度。移臂调度的目的是尽可能地减少操作中的寻找时间。

一般可采用以下几种移臂调度算法。

先来先服务调度算法FCFS)

即按照访问请求的次序为各个进程服务,这是最公平而又最简单的算法,但是效率不高。因为磁头引臂的移动速度很慢,如果按照访问请求发出的次序依次读写各个磁盘块,则磁头引臂将可能频繁大幅度移动,容易产生机械振动,亦造成较大的时间开销,影响效率。

最短寻道时间优先调度算法SSTF)

SSTF算法以寻道优化为出发点,优先为距离磁头当前所在位置最近磁道(柱面的访问请求服务。这种算法改善了平均服务时间,但也存在缺点:假设某一段时间外磁道请求不断,则可能有内磁道请求长时间得不到服务,缺乏公平性。

扫描算法SCAN)

这种算法因其基本思想与电梯的工作原理相似,故又称电梯算法。

SCAN算法也是一种寻道优化的算法,它克服了SSTF算法的缺点。SSTF算法只考虑访问磁道与磁头当前位置的距离,而未考虑磁臂的移动方向,而SCAN算法则既考虑距离,也考虑方向,且以方向优先。即:当无访问请求时,磁头臂停止不动;当有访问请求时,磁头臂按照一定方向扫描。假设初始时,磁头处于最外磁道,并向内磁道移动。在移动的过程中,如果经过的磁道有访问请求,则为其服务,然后判断内磁道是否还有访问请求,如果有,则继续向内磁道移动并服务;否则改变磁头移动方向,即开始向外磁道移动,同时为经过的请求服务;如此反复。这种算法比较公平,而且效率较裔。

以一个例子对上述算法进行说明。假设在磁盘盘面上,0磁道在盘面的外部;号数越大,磁道越靠近盘片的中心。如果某一时刻,磁盘读写头正在50号磁道(柱面上执行操作,而后续的等待访问者依次要访问的磁道(柱面13019932159151486199。按照先来先服务调度算法,当50号磁道(柱面的操作结束后,移动臂将按请求到达的先后次序先移到130号磁道(柱面,再移到199号磁道(柱面),,最后到达99号磁道(柱面,总共移动了845道。按照最短寻道时间优先调度算法,当50号磁道(柱面的操作结束后,应该先处理61号磁道(柱面的请求,然后到达32号磁道(柱面执行操作,随后处理15号磁道(柱面的请求,后继操作的次序应该是99130148159199,总共移动了241道。按照扫描算法,假设移动臂由外向里移动,那么完成50号磁道(柱面操作后,读写磁头的移动臂移向61号磁道(柱面),然后按移动臂由外向里移动的方向,依次为99130M8159199磁道(柱面的访问者服务。当199号磁道(柱面)的操作结束后,向里移动的方向已经无访问等待者,所以改变移动臂的前进方向,由里向外依次为3215磁道(柱面的访问者服务,总共移动了333道。

循环扫描算法C-SCAN)

由于扫描算法在移动磁头的过程中是双向的,因此位于磁盘中间位置的磁道得到的服务就比在两端的磁道要及时,亦即对中间磁道有偏好。为了保持公平性,引入了循环扫描算法,该算法修改了原扫描路径,将双向的服务改为单向服务,即当磁头从外道移向内道时,如果经过的磁道有访问请求,则为其服务,直到最内端的请求服务完毕,然后立即快速回到最外边有请求的磁道,继续下一个循环。反之亦然。该算法具有较好的公平性。

2旋转调度

对在同一个柱面中多个访问者的读写请求,需要有调度算法,用来确定为这些访问等待者服务的次序。

在移动臂定位后有若干个访问者等待访问该柱面的情况下,若从减少输入输出操作总时间为目标出发,显然应该优先选择延迟时间最短的访问者去执行。根据延迟时间来决定执行次序的调度称为旋转调度

进行旋转调度时应分析下列情况:

若干访问等待者请求访问同一磁道上的不同扇区。

若干访问等待者请求访问不同磁道上的不同编号的扇区。

若干访问等待者请求访问不同磁道上的具有相同编号的扇区。

对于前两种情况,旋转调度总是为首先到达读写磁头位置下的扇区进行读写操作。

对于第三种情况,由于这些扇区编号相同,又在同一个柱面上,所以它们同时到达读写磁头的位置下。这时旋转调度可任意选择一个读写磁头进行读写操作。

例如,有4个访问第88号柱面的请求访问者,它们的访问要求如图6-28所示。

请求次序

柱面号

磁头号

扇区号

88

6

2

88

2

6

88

6/

6

88

3

8

6-28旋转调度示例

在图6-28中的4个访问的执行次序有两种可能:①,或

下面对计算过程进行分析。可以看到,两个请求都是访问6号扇区。但是同一时刻只允许一个读写磁头进行操作,所以当6号扇区旋转到磁头位置下时,只有其中的一个请求可执行,另一个请求必须等磁盘下一次把6号扇区旋转到读写磁头位置下时才能得到服务。如果按照的执行次序,在6号扇区执行结束之后,就应该访问8号扇区,即执行的请求。在这一圈执行完毕之后的下一圈,再执行另一个6号扇区的访问,即的请求。所以整个执行次序是

如果在的请求执行之后执行的请求,类似地,后面应该去访问8号扇区,即执行的请求,而在这一圈执行完毕之后的下一圈,再执行另一个6号扇区的访问,即的请求。所以整个执行次序是

4.信息的优化分布

记录在磁道上的排列方式也会影响磁盘的输入输出操作的时间。现在举一个简单例子给予说明。

假设某个系统在磁盘初始化时把磁盘的盘面分成8个扇区,今有8个逻辑记录被存放在同一个磁道上的8个扇区中,供处理程序使用。处理程序要求顺序处理这8个记录,从18。每次处理程序请求从磁盘上读出一个逻辑记录,然后程序对每个读出的记录花10ms的时间进行运算处理,接着再读出下一个记录进行类似的处理,直至这8个记录都处理结束。假定磁盘转速为40ms/r,8个逻辑记录依次存放在磁道上,如图6-29(a)所示。

 

由磁盘转速可知,读一个记录要花5ms的时间。当花了5ms的时间读出第1个记录,并花费10ms时间进行处理后,第4个记录的位置已经转到读写磁头下面。为了顺序处理第2个记录,必须等待磁盘把第2个记录旋转到读写磁头位置下面,即要30ms的延迟时间。于是,处理这8个记录所花时间为

8x(5+10)+7x30=330(ms)

如果把上述8个逻辑记录在磁道上的位置重新进行优化安排,使得当读出一个记录并对其处理完毕之后,读写磁头正好处于需要读出的下一个记录位置上,于是可立即读出该记录,这样就不必花费那些延迟时间。在图6-29(b)中,是对这8个逻辑记录进行的最优分布处理后的示意图。于是,按图6.29(b)的安排,程序处理这8个记录所要花费的时间变为

8x(5+10)=120(ms)

这个结果说明,在对磁盘上信息分布进行优化分布之后,整个程序的处理时间从330ms降低到120ms可见优化分布有利于减少延迟时间,从而缩短了整个输入输出操作的时间。所以,对于一些能预知处理要求的信息在磁盘上的记录位置,采用优化分布可以提高系统的效率。

6.7WindowsFAT文件系统和UNIX文件系统

本节简单介绍两个文件系统实例。FAT文件系统是各种Windows操作系统都支持的一个简单的文件系统,目前它一直被各种嵌入式系统广泛使用,如数码相机、MP3播放器和ipod等。UNIX文件系统设计时引入了很好的设计思想,而这些技术也被应用于其他文件系统的设计。

6.7.1WindowsFAT文件系统

FATFile Allocation Table(文件分配表的缩写。FAT是一个简单的文件系统,最初为DOS操作系统设计,适用于小容量的磁盘,具有简单的目录结构。为了向后兼容,也为了方便用户升级,目前新版本的Wmdows仍然提供对FAT的支持。

FAT文件系统总共有三个版本:FAT-12FAT-16FAT-32,取决于用多少二进制位表示磁盘地址:FAT文件系统以簇为单位进行分配,所以FAT-16文件系统表示用162字节表示簇号。

6-30说明了FAT文件系统是如何组织一个卷的。文件分配表位于卷的开头,为了防止文件系统遭到破坏,FAT文件系统保存了两个文件分配表,这样当其中一个遭到破坏时可以保护卷。此外,文件分配表和根目录必须存放在磁盘上一个固定的位置,这样才可以正确地找到启动系统所需要的文件。

引导扇区

FAT1

FAT2

根目录

其他目录和文件

6-30FAT卷的结构

1.引导扇区

引导扇区Boot Sector)包含用于描述卷的各种信息,利用这些信息才可以访问文件系统。在基于X86的计算机上,主引导记录Master Boot Record)使用系统分区上的引导扇区来加载操作系统的核心文件。

2.文件分配表

文件分配表包含关于卷上每个簇的如下类型的信息(括号中是FAT-16的样值

未使用(0x0000

被文件所使用的簇。

坏簇0xFFF7

文件中的最后一簇0xFFF8—OxFFFF

FAT表在文件系统格式化的时候就建立起来了,它占用文件卷起始连续的若干个数据块(FAT文件系统中,数据块称为簇),它的大小取决于整个外存的大小。

例如某个优盘容量为2GB(231B)选用格式为每个簇4个扇区,每扇区M2B那么,共计可以划分为2GB/512B/4=220个簇,对应22GFAT表项。

FAT-16为例,每个表项16位,即占2B因此共需占用2Bx220=2MB(221)存储空间。以每个簇4个扇区,每扇区512B计,共需占用2MB/512/4=1024个簇。即占用引导扇区后(见图6-30)连续的1024(FAT1)+1024(FAT2)个簇。若忽略引导扇区,系统开销约为

(1024+1024)/220=0.2%

3.根目录

FAT-16文件系统中,位于根目录下的每个文件和子目录在根目录区中都包含一个目录项:根目录与其他目录之间的唯一区别是根目录位于磁盘上一个特殊的位置并且具有固定的大小。每个目录项的大小为32字节,其内容包括:文件名、扩展名、属性字节、最后一次修改时间和曰期、文件长度、第一簇的编号等,其结构如下:

07字节为文件名

810字节为文件的扩展名

11字节为文件属性

1221字节保留

2223字节为文件创建的时间

2425字节为文件创建的日期

2627字节为文件在卷上的起始簇号

2831字节为文件的大小,单位字节

文件属性中:

0位为1表示只读文件

1位为1表示隐藏文件

2位为1表示系统文件

3位为1表示此记录为卷标

4位为1表示此记录为子目录

57位保留

文件创建的时间占用2字节,共16位,从高到低分配为:

1511位为

105位为

40位为,由于5位二进制数无法表示60,因此应将其值乘以2,得到时间

文件创建日期占用2字节,共16位,从高到低分配为:

15~9位为的偏移量,即19S0年为“0,真实年份需要在读出的数值上加1980

85位为

40位为

假设读出的日期时间4个字节从高到低为0x26967B4E则通过计算可以得知文件创建的日期时间为“1999422152628

FAT表项的排列次序是隐含的,即簇号按顺序依次排列。

如上所述,在FAT目录结构中,每个文件目录占用一个共32字节的目录项,其中第2627字节给出了文件在卷上的起始簇号。起始簇号是文件所使用的第一个簇的地址,它有两个作用,首先,它指出了文件第一个块的文件内容存放的位置(即数据块),其次,它指出了隐含在FAT表中文件的下一个簇号的存放位置(即指针),依据这个指针,可以找到文件的下一个簇的数据块以及FAT表中文件的下一个簇号前存放位置,依此类推直到文件结束。FAT表中的一个簇号(指针即每2个字节的内容既可以是下一个簇的簇号(例如0x0004),也可以是一个指示符(OxFFFF)表明该簇是文件的结尾。这些链接以及文件结尾指示符如图6-31所示。

6-31中有三个文件。文件FILE1.TXT是一个比较大的文件,使用了三个连续的簇。第二个文件FILE2.TXT是一个有碎片的文件,也需要三个簇。FILE3.TXT是一个小文件,完全可以装在一个簇中。在每一种情况中,目录结构都指向文件的第一个簇。

 

FAT文件系统后来经过多次改进,为扩大文件系统的容量将FAT-16扩展为FAT-32即簇号的长度扩展为4字节32位,可以寻址232个簇数据块)。另一种改进是支持长文件名。同时,文件分配表和根目录的位置也有所调整。若希望详细了解此结构的同学可以参阅相关的手册。

6.7.2UNIX文件系统

即使是早期版本的UNIX也有一个相当复杂的多用户文件系统,因为它是从MULTICS继承下来的。下面讨论V7文件系统,这是为PDP-11创建的一个文件系统,它也使得UNIX闻名于世。

V7文件系统中,UNIX目录中为每个文件保留了一项,如图6-32中表示。每个目录项包含了两个域,文件名14字节)和I节点的编号2字节)。

 

UNIXI节点包含一些属性。这些属性包括文件大小、三个时间(创建时间,最后访问时间,最后修改时间)、所有者、所在组、保护信息以及一个计数用于记录指向I节点的目录项的数量最后一个域是为了连接而设的。当一个新的连接加到一个I节点上,I节点里的计数就会加1。当移走一个连接时,该计数就减1。当计数为0时,就收回该I节点,并将对应的磁盘块放进空闲表。

UNIX普通文件的物理结构是三级索引结构,参见图6-5

当打开某个文件时,文件系统必须要获得文件名并且定位它所在的磁盘块。下面介绍怎样查找路径名/usr/ast/mboxUNIX为例,但对所有的树形目录文件系统来说,这个算法是大致相同的。首先,文件系统定位根目录。在UNIX系统中,根目录的I节点存放于磁盘上固定的位置。从这个I节点,系统将可以定位根目录,虽然根目录可以放在磁盘上的任何位置,但假定它放在磁盘块1的位置。

接下来,系统读根目录并且在根目录中查找路径的第一个分量usr以获取/usr目录的I节点号。由I节点号来定位I节点是很直接的,因为每个I节点在磁盘上都有固定的位置。根据这个I节点,系统定位/ua目录并在其中查找下一个分量ast旦找到ast的项,便找到了/usr/ast目录的I节点。依据这个I节点,可以定位该目录并在其中查找mbox然后,这个文件的I节点被读入内存,并且在文件关闭之前会一直保留在内存中。图6-33阐述了查找的过程。

 

相对路径名的查找同绝对路径的查找方法相同,只不过是从当前工作目录开始查找而不是从根目录幵始。每个目录都有和项,它们是在目录创建的时候同时创建的。表项是当前目录的I节点号,而表项是父目录(上一层目录I节点号。这样,查找../dick/prog,c的过程就成为在工作目录中查找寻找父目录的I节点号,并查询dick目录。不需要专门的机制处理这些名字,目录系统只要把这些名字看作普通的ASCII字符串即可,如同其他的名字一样。这里唯一的巧妙之处是在根目录中指向自身。

猜你喜欢

转载自www.cnblogs.com/jtd666/p/12505396.html