8.1 文件和文件系统
文件系统是OS的一部分,它提供了一种管理机制,以便OS对自身及所有用户的数据与程序进行在线存储和访问。文件系统由两部分组成:文件集合和目录。文件系统的管理功能是通过将其管理的程序和数据组织成一系列文件的方式实现的,而文件则是指具有文件名的若干相关元素的集合。元素通常是记录,而记录又是一组有意义的数据项的集合。由此可见,基于文件系统的概念,可以把数据的组成分为文件、记录和数据项三级。
8.1.1 文件、记录和数据项
1.数据项
- 在文件系统中,数据项是最低级的数据组织形式,它可被分成两种类型。
- ①基本数据项,是用于描述一个对象的某种属性的字符集,是数据组织中可以命名的最小逻辑数据单位,又称为字段。例如,用于描述一个学生的基本数据项有学号、姓名、年龄、班级等。
- ②组合数据项,是由若干个基本数据项所组成的,简称组项。例如,工资是个组项,它可由基本工资、工龄工资和奖励工资等基本数据项组成。
- 基本数据项除了数据名外,还应有数据类型,因为基本数据项用于描述某个对象的属性,根据属性的不同,需要用不同的数据类型来实现其描述。例如,在描述学生的学号时,应使用整数;描述学生的姓名时,应使用字符串(含汉字);描述学生的性别时,可用逻辑变量或汉字。可见,基本数据项的名字和数据类型这两者共同定义了一个基本数据项的“型”,而表征一个实体在基本数据项上的数据则称为“值”,如学号/30211、姓名/王某某、性别/男等。
2.记录
记录是一组相关数据项的集合,用于描述一个对象在某方面的属性。一个记录应包含哪些数据项取决于需要描述对象的哪个方面。由于对象所处的环境不同,可将对象作为不同的存在。例如,一个少年,当把他作为班上的一名学生时,对他的描述应使用学号、姓名、年龄及所在班级,也可能还包括他所学过的课程的名称、成绩等数据项;但若把学生作为一个医疗对象,对他的描述则应使用诸如病历号、姓名、性别、出生年月、身高、体重、血压及病史等数据项。在诸多记录中,为了能唯一地标志一个记录,必须在其各个数据项中确定出一个或几个数据项,并把它们的集合称为关键字(key)。换言之,关键字是唯一能标志一个记录的数据项。通常,只须将一个数据项作为关键字。例如,前面例子中提及的学号或病历号,便可用来从诸多记录中标志出唯一的一个记录。然而有时找不到这样的数据项,这时就只好把几个数据项定为能在诸多记录中唯一地标志某个记录的关键字。
3.文件
- 文件是指由创建者所定义的、具有文件名的一组相关元素的集合,可分为有结构文件和无结构文件两类。在有结构文件中,文件由若干个相关记录组成,而无结构文件则被看成一个字节流。文件在文件系统中是一个最大的数据单位,它描述了一个对象集。例如,可将一个班的学生的记录作为一个文件。
- 文件的主要属性有4个。
- ①文件类型。可以从不同的角度来规定文件的类型,如源文件、目标文件及可执行文件等。
- ②文件长度,指文件的当前长度,长度的单位可以是字节、字或块,也可以是允许的最大长度。
- ③文件的物理位置,通常用于指示文件所在的设备及文件在该设备中地址的指针。
- ④文件的建立时间,亦指文件最后一次的修改时间。图8-2所示为文件、记录和数据项之间的层次关系。
8.1.2 文件名和文件类型
1.文件名和扩展名
- (1)文件名。不同的系统对文件名的规定是不同的,在一些早期的OS中,文件名的长度受到了系统限制。例如,MS-DOS系统最多支持8个字符,老版的UNIX系统支持14个字符。另外,一些特殊字符(如空格)因常被用作分隔命令、参数和其他数据项的分隔符,故被规定不能用于文件名。近年推出的不少OS已放宽了这种限制,如Windows NT及以后的Windows 2000/XP/Vista/7/8/10等所采用的新技术文件系统(new technology file system,NTFS),便可以很好地支持长文件名,即支持255个字符。另外,在早期的OS(如MS-DOS和Windows 95等系统)中是不区分大小写字母的,如MYFILE、MYfile和myfile都是指同一个文件。但在UNIX和Linux系统中是区分大小写的,因此,上面的3个文件名会被用于标志不同的文件。
- (2)扩展名。扩展名是添加在文件名后面的若干个附加字符,又称为后缀名,用于指示文件的类型,它可以方便系统和用户了解文件的类型,是文件名中的重要组成部分。在大多数系统中,是用圆点“.”将文件名和扩展名分隔开的。例如,myfile.txt中的扩展名.txt,表示该文件是文本文件;myprog.bin中的扩展名.bin,表示该文件是可执行的二进制文件。扩展名的长度一般是1~4个字符。
2.文件类型
为了便于管理和控制文件,将文件分成了若干类。由于不同的系统针对文件的管理方式不同,因此它们针对文件的分类方法也有很大差异。下面是常用的几种文件分类方法。
- (1)按性质和用途分类。
根据文件的性质和用途的不同,可将文件分为3类。- ①系统文件,指由系统软件构成的文件。大多数的系统文件只允许用户调用,但不允许用户去读,更不允许用户修改;有的系统文件不直接对用户开放。
- ②用户文件,指由用户的源代码、目标文件、可执行文件或数据等所构成的文件。用户将此类文件委托给系统进行保管。
- ③库文件,这是由标准子例程及常用的例程等所构成的文件。此类文件允许用户调用,但不允许用户修改。
- (2)按文件中数据的形式分类。
按这种方式分类,也可把文件分为3类。- ①源文件,指由源程序和数据构成的文件。通常,由终端或输入设备输入的源程序和数据所形成的文件都属于源文件,它通常是由美国信息交换标准代码(American standard code for information interchange,ASCII)或汉字所组成的。
- ②目标文件,指由“把源程序经过编译程序编译后、但尚未经过链接程序链接的目标代码”所构成的文件,其后缀名是“.obj”。
- ③可执行文件,指源程序经过编译程序编译后所产生的目标代码,再经过链接程序链接后所形成的文件,在Windows系统中,其后缀名是 .exe或.com。
- (3)按存取控制属性分类。
根据系统管理员或用户所规定的存取控制属性,可将文件分为3类:- ①可执行文件,该类文件只允许被核准的用户调用执行,不允许读和写;
- ②只读文件,该类文件只允许文件拥有者及被核准的用户去读,不允许写;
- ③读/写文件,指允许文件拥有者和被核准的用户去读/写的文件。
- (4)按组织形式和处理方式分类。
根据文件的组织形式和系统对其处理方式的不同,可将文件分为3类:- ①普通文件,是指由ASCII或二进制码所组成的字符文件,通常,用户建立的源程序文件、数据文件以及OS自身的代码文件、实用程序等都属于普通文件;
- ②目录文件,是指由文件目录所组成的文件,通过目录文件可以对其下属文件的信息进行检索,对其可执行的文件进行(与普通文件一样的)操作;
- ③特殊文件,特指系统中的各类I/O设备,为了便于统一管理,系统将所有的I/O设备都视为文件,并按文件的使用方式提供给用户使用,如目录的检索、权限的验证等操作都与普通文件相似,只是对这些文件的操作将由设备驱动程序来完成。
8.1.3 文件系统的层次结构
如图8-3所示,文件系统的模型可分为3个层次:最低层是对象及其属性,中间层是对对象进行操纵和管理的软件集合,最高层是文件系统(提供给用户的)接口。
1.对象及其属性
- 文件系统所管理的对象有3类。
- ①文件,在文件系统中有着各种不同类型的文件,它们都作为文件系统的直接管理对象。
- ②目录,为了方便用户对文件进行存取和检索,在文件系统中必须配置目录,且目录的每个目录项中必须含有文件名、对文件属性的说明以及该文件所在的物理地址(或指针)。对目录的组织和管理,是方便用户和提高文件存取速度的关键。
- ③磁盘(磁带)存储空间,文件和目录必定会占用磁盘存储空间,对这部分空间进行有效管理,不仅能提高外存的利用率,而且能提高文件存取速度。
2.对对象进行操纵和管理的软件集合
- 该层是文件系统的核心部分,文件系统的功能大多是在这一层实现的,其中包括:
- ①文件存储空间管理功能;
- ②文件目录管理功能;
- ③用于将文件的逻辑地址变换为物理地址的机制;
- ④文件读/写管理功能;
- ⑤文件的共享与保护功能等。
- 在实现这些功能时,OS通常会采取层次组织结构,即在每一层中都包含一定的功能,处于某个层次的软件只能调用同层或更低层中的功能模块。关于OS层次结构的介绍参见本书第1章。
- 一般地,把与文件系统有关的软件分为4个层次:
- ①I/O控制层,是文件系统的最低层,主要由磁盘驱动程序等组成,也可称为设备驱动程序层;
- ②基本文件系统,主要用于实现内存与磁盘之间数据块的交换;
- ③文件组织模块,也称为基本I/O管理程序,该层负责完成与磁盘I/O有关的事务,如将文件逻辑块号变换为物理块号、管理磁盘中的空闲盘块、指定I/O缓冲等;
- ④逻辑文件系统,用于处理并记录同文件相关的操作,如允许用户和应用程序使用符号文件名访问文件和记录、保护文件和记录等。因此,整个文件系统可用图8-4所示的层次结构表示。
3.文件系统接口
- 为方便用户使用,文件系统以接口的形式提供了一组对文件和记录进行操作的方法和手段。常用的两类接口是:
- ①命令接口,指用户与文件系统直接进行交互的接口,用户可通过该类接口输入命令(如通过键盘终端键入命令),进而获得文件系统的服务;
- ②程序接口,指用户程序与文件系统的接口,用户程序可通过系统调用获得文件系统的服务,例如,通过系统调用Creat创建文件,通过系统调用Open打开文件等。
8.1.4 文件操作
用户可以通过文件系统提供的系统调用对文件进行操作。最基本的文件操作包括创建、删除、读、写和设置文件的读/写位置等。实际上,一般的OS都提供了更多针对文件的操作,如打开和关闭一个文件以及改变文件名等。
1.最基本的文件操作
- 最基本的文件操作介绍如下。
- ①创建文件。在创建一个新文件时,要为新文件分配必要的外存空间,并在文件目录中为之建立一个目录项;目录项中应记录新文件的文件名及其在外存中的地址等属性。
- ②删除文件。在删除文件时,应先从目录中找到要删除文件的目录项,并使之成为空项,然后回收该文件所占用的存储空间。
- ③读文件。在读文件时,根据用户给出的文件名去查找目录,从中得到被读文件在外存中的地址;在目录项中,还有一个指针用于对文件进行读操作。
- ④写文件。在写文件时,根据文件名查找目录,找到指定文件的目录项后,再利用目录中的写指针进行写操作。
- ⑤设置文件的读/写位置。前面所述的文件读/写操作,都只提供了对文件顺序存取的手段,即每次都是从文件的始端开始读或写;设置文件读/写位置的操作,通过设置文件读/写指针的位置,使得在读/写文件时不必每次都从其始端开始操作,而是可以从所设置的位置开始操作,因此可以改顺序存取为随机存取。
- 可以先了解一下外存的组织方式和文件存储空间管理
2.文件的“打开”和“关闭”操作
当用户要求对一个文件实施多次读/写或其他操作时,每次都要从检索目录开始。为了避免多次重复地检索目录,在大多数OS中都引入了“打开”(Open)这一文件系统调用。当用户第一次请求对某文件进行操作时,须先利用系统调用Open将该文件打开。所谓“打开”,是指系统将指定文件的属性(包括该文件在外存中的物理位置),从外存复制到内存中的打开文件表的一个表目中,并将该表目的编号(或称为索引号)返回给用户。换言之,“打开”就是在用户和指定文件之间建立一个连接。此后,用户可通过该连接直接得到文件信息,从而避免再次通过目录检索文件,即当用户再次向系统发出文件操作请求时,系统可以根据用户提供的索引号,直接在打开文件表中查找到文件信息。这样不仅节省了大量的检索开销,还显著地提高了对文件的操作速度。如果用户已不再需要对该文件实施相应的操作,则可利用“关闭”(Close)系统调用来关闭此文件,即断开此连接,而后OS将会把此文件从打开的文件表中的表
目上删除。
3.其他文件操作
OS为用户提供了一系列面向文件操作的系统调用,最常用的一类是关于对文件属性进行操作的,即允许用户直接设置和获得文件的属性,如改变已存文件的文件名、改变文件的拥有者(文件拥有者)、改变对文件的访问权以及查询文件的状态(包括文件类型、大小、拥有者以及对文件的访问权)等;另一类是关于目录的,如创建一个目录、删除一个目录、改变当前目录和工作目录等;此外,还有用于实现文件共享的系统调用,以及用于对文件系统进行操作的系统调用等。
8.2 文件的逻辑结构
- 用户所看到的文件称为逻辑文件,它是由一系列的逻辑记录所组成的。
从用户的角度来看,文件的逻辑记录是能够被存取的基本单位。在进行文件系统高层设计时,所涉及的关键点是文件的逻辑结构,即如何用这些逻辑记录来构建一个逻辑文件。在进行文件系统低层设计时,所涉及的关键点是文件的物理结构,即如何将一个文件存储在外存上。由此可见,系统中的所有文件都存在着以下两种形式的文件结构。- (1)文件的逻辑结构(file logical structure),是指从用户角度出发所观察到的文件组织形式,即文件是由一系列的逻辑记录所组成的,是用户可以直接处理的数据及其结构,它独立文件的物理特性,又称为文件组织(file organization)。对应的文件通常称为逻辑文件。
- (2)文件的物理结构,又称为文件的存储结构,是指系统将文件存储在外存上所形成的一种存储组织形式,是用户所看不见的。文件的物理结构不仅与存储介质的存储性能有关,而且与所采用的外存分配方式也有关。无论是文件的逻辑结构,还是文件的物理结构,都会影响系统对文件的检索速度。
8.2.1 文件逻辑结构的类型
- 对文件逻辑结构所提出的基本要求,首先是有助于提高系统对文件的检索速度,即在将大批记录组成文件时,应采用一种有利于提高检索记录速度和效率的逻辑结构;然后是该结构应方便用户对文件进行维护,即便于用户在文件中增加、删除、修改一个或多个记录;最后是降低文件存放在外存上的存储费用,即尽量减少文件所占用的存储空间,使其不要求系统为其提供大片的连续存储空间。
- 按文件是否有结构来分,可将文件分为两类:一类是有结构文件,指由一个以上的记录所构成的文件,故又将其称为记录式文件;另一类是无结构文件,指由字节流所构成的文件,故又将其称为流式文件。按文件的组织方式来分,有结构文件又可被分为顺序文件、索引文件和索引顺序文件等。
1.按文件是否有结构来分
- (1)有结构文件
在记录式文件中,每个记录都用于描述实体集中的一个实体,各记录有着相同或不同数目的数据项。记录的长度可分为定长和变长两类。
① 定长记录,是指文件中所有记录的长度都是相同的,所有记录中的各数据项都处在记录中相同的位置,具有相同的顺序和长度。文件的长度用记录数目表示。定长记录能有效地提高检索记录的速度和效率,用户能方便地对文件进行处理,因此定长记录是目前较常用的一种记录格式,被广泛应用于数据处理中。
② 变长记录,是指文件中各记录的长度不一定相同。产生变长记录的原因,可能是一个记录中所包含的数据项(如书的著作者、论文中的关键词等)数目并不相同,也可能是数据项本身的长度不定,例如,病历记录中的病因与病史、科技情报记录中的摘要等。不论是哪一种原因导致记录的长度不同,在处理前,每个记录的长度都是可知的。对变长记录的检索速度慢,这不便于用户对文件进行处理。但由于变长记录很适合于某些场合的需要,因此其也是目前较常用的一种记录格式,被广泛应用于许多商业领域。 - (2)无结构文件。
如果说在大量的信息管理系统和数据库系统中,广泛采用了有结构的文件形式的话,即文件是由定长或变长记录构成的,那么在系统中运行的大量源程序、可执行文件、库函数等,所采用的就是无结构的文件形式,即流式文件。此类文件的长度是以字节为单位的。对流式文件的访问,则是指利用读/写指针来指出下一个要访问的字节。可以把流式文件看作记录式文件的一个特例:一个记录仅有一个字节。
2.按文件的组织方式来分
- 根据文件的组织方式,可把有结构文件分为3类:
- ①顺序文件,指由一系列记录按某种顺序排列所形成的文件,其中的记录可以是定长记录或可变长记录;
- ②索引文件,为可变长记录文件建立一张索引表,为每个记录设置一个索引表项,以加速对记录的检索速度;
- ③索引顺序文件,是顺序文件和索引文件相结合的产物,这里,在为每个文件建立一张索引表时,并不是为每个记录建立一个索引表项,而是为一组记录中的第一个记录建立一个索引表项。
8.2.2 顺序文件
文件的逻辑结构中记录的组织方式,来源于用户和系统在管理上的目标和需求。不同的目标和需求产生了不同的组织方式,从而形成了逻辑结构相异的多种文件。其中,最基本也是最常见的文件就是顺序文件(sequential file)。
1.顺序文件的排列方式
顺序文件中的记录可以按照不同的结构进行排列,一般可分为两种情况。
- (1)串结构。串结构文件中的记录,通常是按存入文件的先后时间进行排序的,各记录之间的顺序与关键字无关。在对串结构文件进行检索时,每次都必须从头开始逐个地查找记录,直至找到指定的记录或者查完所有的记录为止。显然,对串结构文件进行检索是比较费时的。
- (2)顺序结构。由用户指定一个字段作为关键字,它可以是任意类型的变量,其中最简单的是正整数,如0到N-1。为了能唯一地标志每个记录,必须使每个记录的关键字值在文件中具有唯一性。这样,文件中的所有记录就可以按关键字来排序,如按关键字值的大小或其对应英文字母的顺序进行排序。在对顺序文件进行检索时,还可以利用某种有效的查找算法(如折半查找法、插值查找法、跳步查找法等)来提高检索效率。因此,顺序文件可以有更高的检索速度和效率。
2.顺序文件的优缺点
- 顺序文件的最佳应用场合是在对文件中的记录进行批量存取时,即每次要读/写一大批记录时。在所有逻辑文件中,顺序文件的存取效率是最高的。此外,对于顺序存储设备(如磁带),也只有顺序文件才能被存储并有效地工作。
- 在交互应用的场合中,如果用户(程序)要求查找或修改单个记录,则系统需要在文件的记录中逐个地进行查找,此时,顺序文件所表现出的性能就可能很差。尤其是当文件较大时,情况更为严重。例如,对于一个含有104个记录的顺序文件,如果采用顺序查找法查找到一个指定的记录,则平均需要查找5×103次。如果顺序文件中存放的是变长记录,则须付出更大的查找代价,这也限制了顺序文件的长度。
- 顺序文件的另一个缺点是,不论是想增加还是删除一个记录,都比较困难。为了解决这一问题,可以为顺序文件配置一个运行记录文件(log file) 或称之为事务文件(transaction file),把试图增加、删除或修改的信息记录于其中,规定每隔一定时间(例如4小时)就将运行记录文件与原来的主文件加以合并,产生一个按关键字排序的新文件。
8.2.3 顺序文件记录寻址
为了访问顺序文件中的一条记录,首先应找到该记录的地址。查找记录地址的方式有两种:隐式寻址方式和显式寻址方式。
1.隐式寻址方式
对于定长记录的顺序文件,如果已知当前记录的逻辑地址,便很容易确定下一个记录的逻辑地址。在读一个文件时,为了读文件,在系统中应设置一个读指针Rptr(见图8-5),令它指向下一个记录的始址;每当读完一个记录,便执行Rptr=Rptr+L操作,使之指向下一个记录的始址,其中的L为记录长度。类似地,为了写文件,也应设置一个写指针Wptr,使之指向要写的记录的始址。同样,在每写完一个记录时,须执行Wptr=Wptr+L操作。
对于变长记录的顺序文件,在顺序读/写时的情况与定长记录的顺序文件相似,只是每次都需要从正在读/写的记录中读出该记录的长度。同样需要分别为它们设置读/写指针,但在每次读/写完一个记录后,均须将读/写指针加上Li,Li是刚读/写完的记录的长度。这种顺序访问的方式可用于所有文件类型,其主要问题是:访问一个指定记录i,必须扫描或读取前面第0~i-1个记录。这实际上是顺序访问,因此访问速度比较慢。
2.显式寻址方式
该方式可用于对定长记录顺序文件实现直接访问或随机访问,因为任何记录的位置都很容易通过记录长度计算出来,而对于变长记录的顺序文件,则不能利用显式寻址方式实现直接访问或随机访问,而必须增加适当的支持机构方能实现。下面通过两种方式对定长记录实现随机访问。
- (1)利用文件中记录的位置。(隐式寻址需要指针)在该方式下,文件中的每个记录均可用从0到N-1的整数来标志,即用一个整数来唯一地标志一个记录。
- 对于定长记录的顺序文件,如果要查找第i个记录,则可直接根据下式计算获得第i个记录相对于第1个记录起始地址的地址:
Ai=i×L- 由于获得任何记录地址的时间都非常短,因此可利用这种方式对定长记录实现随机访问。
- 然而对于变长记录,则不能利用显式寻址方式对一个文件实现随机访问,因为在查找其中的第i个记录时,须首先计算出该记录的起始地址。为此,须顺序地查找每个记录,并从中获得相应记录的长度Li,然后才能计算出第i个记录的起始地址Ai。假定在每个记录前用一个字节指明该记录的长度,则有:
- 可见,用直接存取方式来访问变长记录顺序文件中的一个记录是十分低效的,其检索时间也很难令人接受,因此不能利用这种方式对变长记录实现随机访问。
- 对于定长记录的顺序文件,如果要查找第i个记录,则可直接根据下式计算获得第i个记录相对于第1个记录起始地址的地址:
- (2)利用关键字。在该方式下,用户必须指定一个字段作为关键字,通过指定的关键字来查找该记录。当用户给出要检索记录的关键字时,系统将利用该关键字顺序地从第1个记录开始比较指定关键字和每个记录的关键字,直至找到相匹配的记录。
值得一提的是,基于关键字的变长记录在商业领域很重要,应用很广泛,但因为在专门的数据库系统中已经实现了对它们的支持,并能从不同的角度来管理、组织和显示数据,所以只有一些现代OS的文件系统对它们提供了支持。但是文件目录是个例外,因为对目录的检索是基于关键字来进行的。其中,关键字是符号文件名,相关内容将会在8.3节中进行介绍。
8.2.4 索引文件
结构
1.按关键字建立索引
- 定长记录顺序文件很容易通过简单的计算实现随机查找,但变长记录顺序文件查找一个记录则必须从第一个记录查起,一直顺序查找到目标记录为止,耗时很长。我们为变长记录顺序文件建立一张索引表,为主文件中的每个记录在索引表中分别设置一个索引表项,用于记录指向记录的指针(即记录在逻辑地址空间的起始地址)以及记录的长度。索引表按关键字排序,因此其本身也是一个定长记录的顺序文件,这样就把对变长记录顺序文件的顺序检索,转变成了对定长记录索引文件(index file)的随机检索,从而加快了记录检索速度,实现了直接存取。图8-6所示为索引文件的组织形式。
- 由于是按关键字建立的索引,因此在对索引文件进行检索时,可以根据用户(程序)提供的关键字,利用折半查找法检索索引表,从中找到相应的表项;再利用该表项中所给出的指向记录的指针去访问所需的记录。每当要在索引文件中增加一个新记录时,便须对索引表进行修改。由于索引文件具有较快的检索速度,其主要应用于对信息处理的及时性有较高要求的场合。
2.具有多个索引表的索引文件
- 按关键字建立索引表的索引文件与顺序文件一样,都只能按该关键字进行检索。而实际应用情况往往是:不同的用户为了不同的目的,希望能按不同的属性(或不同的关键字)来检索一条记录。为实现此要求,需要为顺序文件建立多个索引表,即为每种可能成为检索条件的域(属性或关键字)都配置一张索引表。每张索引表都按相应的一种属性或关键字进行排序。例如,有一个图书文件,为每本书建立了一个记录,此时可以为该图书文件建立多个索引表,其中第一个索引表所用的关键字是图书编号,第二个索引表所用的关键字是书名,第三个索引表所用的关键字是作者姓名,第四个索引表所用的关键字是出版时间等。这样,用户就可以根据自己的需要,用不同的关键字来对该图书文件进行检索。
- 索引文件的主要优点是,它将一个需要顺序查找的文件,改造成了一个可随机查找的文件,极大地提高了用户(程序)对文件的查找速度,同时也便于进行记录插入与删除,故索引文件成为了当今应用最为广泛的一种文件形式。只是它除了有主文件外,还须配置一张索引表,而且每个记录都要有一个索引项,因此增加了存储开销。
8.2.5 索引顺序文件
1.索引顺序文件的特征
- 索引顺序文件(index sequential file) 是对顺序文件的一种改进,它基本上克服了变长记录的顺序文件不能被随机访问以及不便于删除和插入记录等缺点,但同时保留了顺序文件的关键特征,即记录是按关键字的顺序组织起来的。
- 它又增加了两个特征:一个是引入了文件索引表,通过该表可以实现对索引顺序文件的随机访问;另一个是增加了溢出(overflow)文件,用它来记录新增加的、删除的和修改的记录。可见,索引顺序文件是顺序文件和索引文件相结合的产物,能有效克服变长记录顺序文件的缺点,而且所付出的代价也不算太大。
2.一级索引顺序文件
- 最简单的索引顺序文件只使用了一级索引。其具体的建立方法是,首先将变长记录顺序文件中的所有记录分为若干组,如50个记录为一组;然后为文件建立一张索引表,并为每组中的第一个记录在索引表中建立一个索引项,其中包含该记录的关键字和指向该记录的指针。索引顺序文件是最常见的一种逻辑文件形式,如图8-7所示。
- 在对索引顺序文件进行检索时,首先也是利用用户(程序)所提供的关键字以及某种查找算法检索索引表,找到该记录所在记录组中第一个记录的表项,从中获知该记录组第一个记录在主文件中的位置;然后,利用顺序查找法查找主文件,从中找到所要的记录。
- 如果一个顺序文件中所含有的记录的数量为N,则为了检索到具有指定关键字的记录,平均须查找N/2个记录。但对于索引顺序文件,为了检索到具有指定关键字的记录, 平均仅须查找个 N \sqrt{N} N 记录数,因而其检索效率比顺序文件约高了 N \sqrt{N} N/2倍。例如,有一个顺序文件,如果其含有10 000个记录,则平均须查找的记录数为5 000;但如果其是一个索引顺序文件,则平均仅须查找100个记录。可见,索引顺序文件的检索效率是顺序文件的50倍。
3.两级索引顺序文件
- 不能忽视的是,对于一个非常大的文件,为找到一个记录而须查找的记录数目仍然很多。例如,对于一个含有106个记录的顺序文件,当把它作为索引顺序文件时,为找到一个记录,平均须查找1 000个记录。为了进一步提高检索效率,可以为顺序文件建立多级索引,即为索引顺序文件再建立一张索引表,从而形成两级索引表。例如,对于一个含有106个记录的顺序文件,可先为该文件建立一张低级索引表,每100个记录为一组,故低级索引表应含有104个表项,在每个表项中存放顺序文件中每组第一个记录的记录键值和指向该记录的指针;然后再为低级索引表建立一张高级索引表,这时,也同样令每100个索引表为一组,故具有102个表项。这里的每个表项中存放的是低级索引表每组第一个表项中的关键字,以及指向该表项的指针。此时,为找到一个具有指定关键字的记录,所须查找的记录数平均为50+50+50=150,或者可表示为 (3/2) N 3 \sqrt[3]{N} 3N ,其中,N是顺序文件中的记录个数。注意:对于未建立索引表的顺序文件,所须查找的记录数平均为500 000个;对于建立了一级索引的顺序文件,平均须查找1 000次;对于建立了两级索引的顺序文件,平均仅须查找150次。
8.2.6 直接文件和哈希文件
定义
1.直接文件
采用前述几种文件结构对记录进行存取时,都须利用给定的记录键值先对线性表或链表进行检索,以找到指定记录的物理地址。然而对于直接文件,则可根据给定的关键字直接获得指定记录的物理地址。换言之,关键字本身决定了记录的物理地址。这种由关键字(的值)到记录的物理地址的变换,被称为键值变换(key to address transformation)。组织直接文件的关键在于,通过什么方法进行从关键字的值到记录的物理地址的变换。
2.哈希文件
哈希(Hash)文件是目前应用最为广泛的一种直接文件。它利用Hash函数(或称散列函数) 可将关键字变换为相应记录的地址。但为了实现文件存储空间的动态分配,利用Hash函数所求得的结果通常并不是相应记录的地址,而是指向某一目录表相应表目的指针,该表目的内容指向了相应记录所在的物理块,如图8-8所示。例如,若令K为记录键值,A为通过Hash函数H()的变换而形成的该记录在目录表中对应表目的位置,则有关系A=H(K)。通常,把Hash函数作为标准函数存于系统中,供存取文件时调用。
8.3 文件目录
- 通常,在现代计算机系统中,都要存储大量的文件。为了能对这些文件实施有效的管理,必须对它们加以妥善组织,这主要是通过文件目录来实现的。文件目录也是一种数据结构,用于标志系统中的文件及其物理地址,供检索时使用。对目录管理的要求如下。
- (1)实现“按名存取”,即用户只须向系统提供所须访问文件的名字,便能快速准确地找到指定文件在外存中的存储位置。这是目录管理中最基本的功能,也是文件系统向用户提供的最基本的服务。
- (2)提高对目录的检索速度,通过合理地组织目录结构,可加快对目录的检索速度,从而提高对文件的存取速度。这是在设计一个大、中型文件系统时所追求的主要目标。
- (3)文件共享,在多用户系统中,应允许多个用户共享一个文件。这样,只须在外存中保留一份该文件的副本供不同用户使用即可,如此便可节省大量的存储空间,同时还可以方便用户使用和提高文件利用率。
- (4)允许文件重名,系统应允许不同用户对不同文件采用相同的名字,以便用户按照自己的习惯给文件命名和使用文件。
8.3.1 文件控制块和索引节点
为了能对一个文件进行正确的存取,必须为文件设置用于描述和控制文件的数据结构,称之为文件控制块(file control block,FCB)。文件管理程序可借助于FCB中的信息对文件施以各种操作。文件与FCB一一对应,而人们把FCB的有序集合称为文件目录,即一个FCB就是一个文件目录项。通常,一个文件目录也被看作一个文件,称为目录文件。
1.FCB
为了能对系统中的大量文件施以有效的管理,在FCB中,通常应含有3类信息,即基本信息类、存取控制信息类及使用信息类。
- (1)基本信息类。基本信息类包括:
- ①文件名,指用于标志一个文件的符号名,在每个系统中,每个文件都必须有唯一的名字,用户利用该名字进行存取 ;
- ②文件物理位置,指文件在外存中的存储位置,它包括存放文件的设备名、文件在外存上的起始盘块号、指示文件所占用的盘块数或字节数的文件长度;
- ③文件逻辑结构,指示文件是流式文件还是记录式文件、文件中的记录数、文件是定长记录还是变长记录等;
- ④文件的物理结构,指示文件在外存中的组织方式,如连续组织方式、链接组织方式或索引组织方式等。
- (2)存取控制信息类。存取控制信息类包括文件拥有者的存取权限、核准用户的存取权限以及一般用户的存取权限。
- (3)使用信息类。使用信息类包括:文件的建立日期和时间,文件上 一次修改的日期和时间,以及当前使用的信息,这些信息包括当前已打开该文件的进程数、是否被其他进程锁住、文件在内存中是否已被修改但尚未复制到盘上等。应该说明,对于不同OS的文件系统,由于功能不同,它们可能只含有上述信息中的部分信息。
- 图8-9所示为MS-DOS系统中的FCB,其中含有文件名、扩展名、文件属性、文件建立日期和时间、文件所在的第一盘块号以及盘块数等。FCB的长度为32B,对于容量为360KB的软盘,其总共可包含112个FCB,共占4KB(而非3.5KB)的存储空间。
2.索引节点
- (1)索引节点的引入(why)。
- 文件目录通常存放在磁盘上。当文件有很多时,文件目录可能要占用大量的盘块。在查找目录的过程中,必须先将存放目录文件的第一个盘块中的目录调入内存,然后将用户所指定的文件名与目录项中的文件名逐一比较。若未找到指定文件,则须将下一盘块的目录项调入内存。假设目录文件所占用的盘块数为N,按此方法查找,则查找一个目录项平均需要调入盘块(N+1)/2次。
- 假如一个FCB为64B,盘块大小为1KB,则每个盘块中只能存放16个FCB。若一个文件目录中共有640个FCB,则须占用40个盘块,因此平均查找一个文件须启动磁盘20次。
- 稍加分析可以发现,在检索目录文件的过程中只用到了文件名,仅当找到一个目录项(即其中的文件名与指定要查找的文件名相匹配)时,才须从该目录项中读出该文件的物理地址。而其他对该文件进行描述的信息,在检索目录时一概不用。显然,这些信息在检索目录时无须调入内存。
- 为此,在有的系统(如UNIX系统)中便采用了把文件名与文件描述信息分开的办法,亦即,使文件描述信息单独形成一个称为索引节点(iNode)的数据结构,简称为i节点。文件目录中的每个目录项,仅由文件名和指向该文件所对应的索引节点的指针所构成。在UNIX系统中,一个目录仅占16B,其中14B为文件名,2B为索引节点指针。在1KB的盘块中可容纳64个目录项,这样,为找到一个文件,可使平均启动磁盘次数减少到原来的1/4,大大节省了系统开销。图8-10所示为UNIX系统的文件目录。
- 文件目录通常存放在磁盘上。当文件有很多时,文件目录可能要占用大量的盘块。在查找目录的过程中,必须先将存放目录文件的第一个盘块中的目录调入内存,然后将用户所指定的文件名与目录项中的文件名逐一比较。若未找到指定文件,则须将下一盘块的目录项调入内存。假设目录文件所占用的盘块数为N,按此方法查找,则查找一个目录项平均需要调入盘块(N+1)/2次。
- (2)磁盘索引节点。
- 磁盘索引节点是指存放在磁盘上的索引节点。每个文件都有唯一的一个磁盘索引节点,
- 它主要包括以下内容:
- ①文件拥有者标识符,即拥有该文件的个人或小组的标识符;
- ②文件类型,包括正规文件、目录文件或特别文件;
- ③文件存取权限,指各类用户对该文件的存取权限;
- ④文件物理地址,每个索引节点中均含有13个地址项,即i.addr(0)~i.addr(12),它们以直接或间接方式给出数据文件所在盘块的编号;其中0到9项为直接寻址,后3项分别为一次、二次和三次间接寻址方式。
- ⑤文件长度,指以字节为单位的文件长度;
- ⑥文件连接计数,表明在本文件系统中,所有指向该(文件的)文件名的指针计数;
- ⑦文件存取时间,指出本文件最近被进程存取的时间、本文件最近被修改的时间以及索引节点最近被修改的时间。
- (3)内存索引节点。
- 内存索引节点是指存放在内存中的索引节点。当文件被打开时,要将磁盘索引节点复制到内存索引节点中,便于以后使用。
- 在内存索引节点中又增加了以下内容:
- ①索引节点编号,用于标志内存索引节点;
- ②状态,指示索引节点是否上锁或被修改;
- ③访问计数,每当有一进程要访问此索引节点时,就将该访问计数加1,访问完再减1;
- ④文件所属文件系统的逻辑设备号;
- ⑤链接指针,设置有分别指向空闲链表和散列队列的指针。
8.3.2 简单的文件目录
目录结构的组织,关系到文件系统的存取速度,也关系到文件的共享性和安全性。因此,组织好文件的目录,是设计好文件系统的重要环节。目前,最简单的文件目录形式是单级文件目录和两级文件目录。
1.单级文件目录
- 单级文件目录是最简单的文件目录,在整个文件系统中只建立一张目录表,每个文件占一个目录项,目录项中含有文件名、扩展名、文件长度、文件类型、物理地址、文件说明以及其他文件属性。此外,为表明每个目录项是否空闲,又设置了一个状态位。单级文件目录如图8-11所示。
- 每当要建立一个新文件时,都必须先检索所有的目录项,以保证新文件名在目录中是唯一的。然后再从目录表中找出一个空白目录项,填入新文件的文件名及其他信息,并置状态位为1。在删除文件时,先从目录中找到要删除文件的目录项,回收该文件所占用的存储空间,然后再清除该目录项。
- 单级文件目录的优点是简单,但它只能实现目录管理中最基本的功能——按名存取,不能满足对文件目录的其他3方面的要求,具体说明如下。
- ①查找速度慢。对于稍具规模的文件系统,为找到一个指定的目录项要花费较多的时间。对于一个具有N个目录项的单级文件目录,为检索出一个目录项,平均须查找N/2个目录项。
- ②不允许重名。在一个目录表中,所有文件都不能与另一个文件具有相同的名字。然而,重名问题在多用户环境下,却又是难以避免的;即使在单用户环境下,当文件数超过数百个时,也会由于不易记忆而难以避免。
- ③不便于实现文件共享。通常,每个用户都有自己的名字空间或命名习惯。因此,应当允许不同用户使用不同的文件名来访问同一个文件。然而,单级文件目录却要求所有用户都只能用同一个名字来访问同一个文件。
- 简而言之,单级文件目录只能满足对目录管理的四点要求中的第一点,因此,它只适用于单用户环境。
2.两级文件目录
- 为了克服单级文件目录所存在的缺点,可以为每个用户再建立一个单独的用户文件目录(user file directory,UFD)。这些UFD具有相似的结构,它们由用户所有文件的FCB组成。此外,在系统中再建立一个主文件目录(master file directory,MFD);在MFD中,每个用户都占有一个目录项,其目录项中包括用户名和指向相应UFD的指针。如图8-12所示,MFD中含有3个用户名,即Wang、Zhang和Gao。
- 在两级文件目录中,用户如果希望有自己的UFD,则可以请求系统为自己建立一个UFD;如果自己不再需要UFD,则也可以请求系统管理员将它撤销。在有了UFD后,用户可以根据自己的需要创建新文件。每当此时,OS只须检查该用户的UFD,并判定在该UFD中是否已有同名的另一个文件即可。若有,则用户必须为新文件重新命名。若无,则在UFD中建立一个新目录项,将新文件名及其有关属性填入该目录项中,并置其状态位为“1”。当用户要删除一个文件时,OS也只须查找该用户的UFD,从中找出指定文件的目录项,在回收该文件所占用的存储空间后,将该目录项删除。两级文件目录已基本能够满足系统对文件目录的4方面的要求,现对能满足第2、3、4方面的要求做进一步的说明。
- (1)提高了检索目录的速度。如果在MFD中有n个子目录,每个UFD最多含m个目录项,则为了查找一指定的目录项,最多只须检索n+m个目录项。但如果采用单级文件目录,则最多须检索n×m个目录项。假定n=m,可以看出,采用两级文件目录可使检索效率提高n/2倍。
- (2)在不同的UFD中,可以使用相同的文件名,只要在用户自己的UFD中每个文件名都是唯一的即可。例如,用户Wang可以用Test来命名自己的一个测试文件,用户Zhang也可以用Test来命名自己的一个(不同于Wang的Test测试文件的)测试文件。
- (3)不同用户还可以使用不同的文件名来访问系统中的同一个共享文件。采用两级文件目录也存在一些问题。该目录结构虽能有效地将多个用户隔开,在各用户之间完全无关时,这种隔离是一个优点,
- 但当多个用户之间要相互合作去完成一个大任务,且一个用户又须去访问其他用户的文件时,这种隔离便成了一个缺点,因为这种隔离会使各用户之间不便于共享文件。
8.3.3 树形目录
1.树形目录简介
在现代OS中,最通用且实用的文件目录无疑是树形目录(tree-structured directory)。它可以明显地提高对目录的检索速度和文件系统的性能。MFD在这里被称为根目录,在每个文件目录中,只能有一个根目录,每个文件和每个目录都只能有一个父目录。把数据文件称为树叶,其他的目录均作为树的节点,或称它们为子目录。图8-13所示为树形目录,图中,方框代表目录文件,圆圈代表数据文件。在该树形目录中,根目录中有3个用户的总目录项A、B、C。在B项所指出的B用户的总目录B中,又包括3个分目录F、E、D,其中每个分目录中又包含多个文件。如B目录中的F分目录中,包含J和N两个文件。为了提高文件系统的灵活性,应允许在一个目录文件中的目录项既是目录文件的FCB,又是数据文件的FCB,这可以通过用目录项中的一位来指示它属于哪一种FCB加以实现。例如,在图8-13中,在A用户的总目录中,目录项A是目录文件的FCB,而目录项B和目录项D则是数据文件的FCB。
2.路径名和当前目录
- (1)路径名(path name)。在树形目录中,从根目录到任何数据文件都只有一条唯一的通路。在该路径上,从树的根(即主目录)开始,把全部目录文件名与数据文件名依次用“/”连接起来,即可构成该数据文件的路径名。系统中的每个文件都有唯一的路径名。例如,在图8-13中,用户B若要访问文件J,则应使用其路径名/B/F/J来实现。
- (2)当前目录(current directory)。当一个文件系统含有许多级时,每访问一个文件,都要使用从树根开始到树叶(数据文件)为止的、包括各中间节点(目录)名的全路径名,这是相当麻烦的一件事。同时,由于一个进程在运行时其所访问的文件大多仅局限于某个范围,因而每次从根目录开始访问文件非常不便。基于这一点,可为每个进程设置一个 “当前目录”,又称为 “工作目录”。进程对各文件的访问都是相对于当前目录而进行的。此时各文件所使用的路径名,只须从当前目录开始,逐级经过中间的目录文件,最后到达要访问的数据文件。把这一路径上的全部目录文件名与数据文件名用“/”连接起来,即可形成路径名,如用户B的当前目录是F,则此时文件J的相对路径名仅是J本身。这样,把从当前目录开始到数据文件为止所构成的路径名称为相对路径名(relative path name),而把从树根开始的路径名称为绝对路径名(absolute path name)。
- 较两级文件目录而言,树形目录的查询速度更快,同时其层次结构更加清晰,能够更加有效地进行文件的管理和保护。在多级文件目录中,不同性质、不同用户的文件,可以构成不同的目录子树。不同层次、不同用户的文件,分别呈现在系统目录树中的不同层次或不同子树中,可以很容易地赋予文件不同的存取权限。但是若想在树形目录中查找一个文件,则须按路径名逐级访问中间节点,这样就增加了磁盘访问次数,无疑会影响查询速度。目前,大多数OS(如UNIX、Linux和Windows系列)均采用了树形目录。
3.目录操作
- (1)创建目录。在树形目录中,用户可为自己建立UFD,并可再创建子目录。当用户要创建一个新文件时,只须查看在自己的UFD及其子目录中有无与新建文件相同的文件名。若无,便可在UFD或其某个子目录中增加一个新目录项。
- (2)删除目录。对于一个已不再需要的目录,应如何删除其目录项,须视情况而定。
- 如果所要删除的目录是空的,即在该目录中已不再有任何文件,则可简单地将该目录项删除,使它在其上一级目录中对应的目录项为空。
- 如果要删除的目录不空,即其中尚有几个文件或子目录,则可采用下述两种方法进行处理。
- ①不删除非空目录。当目录(文件)不空时,不能将其删除;若要删除一个非空目录,则必须先删除目录中的所有文件,使之成为空目录,然后再予以删除。如果目录中还包含有子目录,则必须采取递归调用方式来将其删除,在MS-DOS系统中就采用了这种删除方式。
- ②删除非空目录。当要删除一个目录时,如果在该目录中还包含有文件,则目录中的所有文件和子目录也会同时被删除。上述两种方法实现起来都比较容易,第二种方法比较方便,但却比较危险,因为整个目录结构虽然用一条命令即能删除,但如果是一条错误的命令,则后果可能会很严重。
- (3)改变目录(cd)。使用绝对路径名对用户来说是比较麻烦的。用户可利用改变目录的命令,通过指定目录的绝对或相对路径名来设置当前目录。如果在使用改变目录的命令时没有明确指明任何目录,则在默认的情况下当前目录通常会自动地改变到主目录(与指定用户相关的最顶层目录)。
- (4)移动目录。到了一个阶段,通常需要对目录组织进行调整,即将文件或子目录在不同的父目录之间移动。文件或子目录经移动后,它们的路径名将随之改变。
- (5)链接操作。对于树形目录,每个文件和每个目录都只允许有一个父目录,这样不利于文件共享,但可以通过链接操作让指定文件具有多个父目录,从而方便了文件共享。关于链接操作,将在8.4节(文件共享)中做详细介绍。
- (6)查找操作。当文件目录非常庞大时,要查找一个指定文件是比较困难的。因此在所有的OS中都支持以多种方式进行查找,例如,可以从根目录或当前目录位置开始进行查找,查找方式可选用精确匹配或局部匹配等。
8.3.4 无环图目录
- 假设两个程序员正在合作开发一个项目,与该项目关联的文件可以保存在一个子目录中,以区分两个程序员的其他项目文件,但是,两个程序员都希望该子目录在自己的目录中。在这种情况下,公共子目录应该共享。一个共享的目录或文件可同时位于文件系统的两个(或多个)地方。
- 在严格的树形目录中,每个文件只允许有一个父目录,父目录可以有效地拥有该文件,其他用户要想访问它,都必须经过其所属主目录来实现。这就是说,对文件的共享是不对称的,或者说,树形目录是不适合文件共享的。假设允许一个文件可以有多个父目录,即有多个属于不同用户的目录同时指向同一个文件,这样虽会破坏树的特性,但这些用户可用对称的方式实现文件共享,而不必再通过其所属主目录来进行访问。
- 有向无环图,即没有循环的有向图,它允许目录共享子目录或文件。同一个文件或子目录可出现在两个或多个目录中。无环图目录是树形目录的自然扩展,如图8-14所示,图中文件F8有3个父目录,分别是D5、D6、D3,其中D5和D3还使用了相同的名字p;目录D6有两个父目录D2和D1。
8.3.5 目录查询技术
当用户要访问一个已保存的文件时,系统首先会利用用户提供的文件名对目录进行查询,找出该文件的FCB或对应的索引节点。然后,根据FCB或索引节点中记录的文件物理地址(盘块号),换算出文件在磁盘上的物理位置。最后,通过磁盘驱动程序将所需文件读入内存。目前,对目录进行查询的方法主要有两种:线性检索法和Hash方法。
1.线性检索法
- 线性检索法又称为顺序检索法。在单级文件目录中,基于用户提供的文件名,可以利用顺序查找法直接从文件目录中找到指定文件的目录项。在树形目录中,用户提供的文件名是由多个文件分量名所组成的路径名,此时须对多级文件目录进行查找。假设用户指定的文件路径名是/usr/ast/mbox,则查找/usr/ast/mbox的过程如图8-15所示。
- 上述查找过程具体说明如下。
- 首先,系统应读入第一个文件分量名usr,用它与根目录文件(或当前目录文件)中各目录项中的文件名依次进行比较,从中找出匹配项,并得到匹配项的索引节点编号为6;再从6号索引节点中得知usr目录文件放在132号盘块中,将该盘块内容读入内存。
- 然后,系统读入路径名中的第二个分量名ast,用它与放在132号盘块中的第二级目录文件中各目录项的文件名依次进行比较,从中找到匹配项,并得知ast的目录文件放在26号索引节点中,再从26号索引节点中得知/usr/ast存放在496号盘块中,将该盘块的内容读入内存。
- 最后,系统读入该文件的第三个分量名mbox,用它与第三级目录文件/usr/ast中各目录项中的文件名依次进行比较,得知/usr/ast/mbox的索引节点编号为60,即在60号索引节点中存放了指定文件的物理地址。目录查询操作到此结束。如果在顺序查询过程中发现有一个文件分量名不能被找到,则应停止查询,并返回“文件未找到”信息。
2.Hash 方法
- 在8.2.6小节中曾介绍了Hash文件。如果我们建立了一张Hash索引文件目录,则可利用Hash方法进行查询,即系统将用户提供的文件名变换为文件目录的索引值,再利用该索引值到目录中去查询,这样会显著提高检索速度。
- 顺便指出,在现代OS中,通常会提供模式匹配功能,即在文件名中使用了通配符,如 “*”、“?” 等。对于使用了通配符的文件名,系统无法利用Hash方法查询目录,此时,系统还是需要利用线性查找法来查询目录。
- 在进行文件名的转换时,有可能把n个不同的文件名转换为相同的Hash值,即出现所谓的 “冲突”。一种处理此类“冲突”的有效规则介绍如下。
- (1)在利用Hash方法查询目录时,如果目录表中相应的目录项是空的,则表示系统中并无指定文件。
- (2)如果目录项中的文件名与指定文件名相匹配,则表示该目录项正是所要寻找的文件所对应的目录项,故而可从中找到该文件的物理地址。
- (3)如果在目录表的相应目录项中的文件名与指定文件名并不匹配,则表示发生了“冲突”,此时须将其Hash值再加上一个常数(该常数应与目录的长度值互质)以形成新的索引值,然后返回第一步重新开始查询。
8.4 文件共享
- 在现代计算机系统中,必须提供文件共享手段,即指系统应允许多个用户(进程)共享同一份文件。这样,在系统中只须保留该共享文件的一份副本即可。如果系统不能实现文件共享功能,则意味着凡是需要该文件的用户,都须各自备有此文件的副本,显然这会造成对存储空的极大浪费。随着计算机技术的发展,文件共享的范围也在不断扩大,从单处理机系统中的共享扩展为多处理机系统中的共享,进而又扩展为计算机网络中的共享,甚至是全世界范围内的共享。
- 早在20世纪60—70年代,就已经出现了不少实现文件共享的方法,如绕弯路法、连访法以及利用基本文件实现文件共享的方法;而现代的一些文件共享方法,也是在早期的这些方法的基础上发展起来的。下面仅介绍当前常用的两种文件共享方法,它们是在树形目录的基础上经适当的修改而形成的。
8.4.1 利用有向无环图实现文件共享
1.有向无环图
- 在8.3.4小节中介绍了无环图目录,该目录是树形目录的一个自然扩展,基于该目录可以实现文件共享。图8-14所示的无环图目录中,文件F8有3个父目录,分别是D5、D6、D3,其中D5和D3还使用了相同的名字p;目录D6有2个父目录D2和D1。当有多个用户要共享一个子目录或文件时,必须将共享文件或子目录链接到多个用户的父目录中,这样才能方便地找到该文件。
- 现在的问题是,如何建立父目录D5与共享文件F8之间的链接?如果在文件目录中所包含的是文件的物理地址,即文件所在盘块的盘块号,则在建立链接时,必须将文件的物理地址复制到D5目录中。但如果以后D5或D6还要继续向该文件中添加新内容,则必然要相应地再增加新的盘块,这将会由附加操作Append来完成。而这些新增加的盘块,也只会出现在执行了操作的目录中。可见,这种变化对其他用户而言是不可见的,因而新增加的这部分内容已不能被共享。
2.利用索引节点解决文件共享问题
- 为了解决上述问题,可以引用索引节点,即诸如文件的物理地址及其他文件属性等信息不再放入目录项中,而是放在索引节点中。在文件目录中只设置文件名及指向相应索引节点的指针,如图8-16所示。该方法在UNIX系统中被称为硬链接(hard link)。在图8-16中的用户Wang和Lee的文件目录中,都设置有指向共享文件的索引节点指针。此时,由任何用户对共享文件所进行的Append操作或修改,都将引起相应索引节点内容的改变(如增加了新的盘块号和文件长度等),这些改变是其他用户可见的,从而也就可以将该文件提供给其他用户来共享。
- 在索引节点中还应有一个 链接计数count,用于表示链接到本索引节点(亦即文件)上的用户目录项的数目。例如,count=2表示有2个用户目录项链接到了本文件上,或者说有2个用户共享着此文件。
- 当用户C创建一个新文件时,它便是该文件的所有者,此时将count置1。当用户B要共享此文件时,在用户B的目录中增加一目录项,并设置一指针指向该文件的索引节点,此时,文件拥有者仍是C,count=2。如果用户C不再需要此文件,那么是否能将此文件删除呢?回答是否定的。因为若删除了此文件,则必然会删除此文件的索引节点,这样便会使B的指针悬空,而B则可能正在此文件上执行写操作,此时将因此半途而废。但如果C不删除此文件而等待B继续使用,则由于文件拥有者是C,因此倘若系统要记账收费,则C必须为B使用此共享文件而付账,直至B不再需要。图8-17所示为用户B建立链接前后的情况。
8.4.2 利用符号链接实现文件共享
1.利用符号链接实现文件共享的基本思想
利用符号链接(symbolic link)实现文件共享的基本思想是,允许一个文件或子目录有多个父目录,但其中仅有一个作为主(属主)父目录,其他父目录都是通过符号链接方式与之相链接的,故将它们简称为链接父目录。图8-18与图8-14基本相同,差别仅在于将图8-14中的某些实线改为了虚线,如在图8-14中有三条实线指向了文件F8,而在图8-18中仅有D6指向F8的一条实线,另外两条指向F8的实线都已成为虚线。这表示F8仍然有3个父目录,但只有D6才是其主父目录,而D5和D3都是其链接父目录。类似地,D6的主父目录是D2,D1是其链接父目录。这样做的最大好处是,属主结构(用实线连接起来的结构)仍然是简单树,这对于文件的删除、查找等操作而言都更为方便。
2.利用符号链接实现文件共享的具体过程
为使链接父目录D5能共享文件F,可以由系统创建一个LINK类型的新文件,也取名为F,并将F写入链接父目录D5中,以实现D5与文件F8的链接。在新文件F的内容中只包含被链接文件F8的路径名。这样的链接方法被称为符号链接或软链接。新文件F中的路径名被看作符号链。当用户通过D5访问被链接的文件F8且正要读LINK类型的新文件时,此要求将被OS截获,OS会根据新文件中的路径名去查询文件F8,然后对它进行读/写操作,这样就实现了用户D5对文件F的共享。
3.利用符号链接实现文件共享的优点
在利用符号链接实现文件共享时,只是文件拥有者才拥指向其索引节点的指针,而共享该文件的其他用户则只有该文件的路径名,并不拥有指向其索引节点的指针。这样,也就不会发生在文件拥有者删除一个共享文件后留下一个悬空指针的情况。当文件的拥有者把一个共享文件删除后,如果其他用户又试图通过符号链接去访问一个已被删除的共享文件,则会因系统找不到该文件而使访问失败,此时再将符号链接删除,则不会产生任何影响。值得一提的是,在计算机网络中,Web浏览器所使用的文件是HTML类型的文件。在HTML文件中有着许多链接符,通过这些链接符能够(通过计算机网络)链接到世界上任何地方的机器中的文件。在利用符号链接实现文件共享时,同样可以通过网络来链接到分布在世界各地的计算机系统中的文件。
4.利用符号链接实现文件共享的缺点
利用符号链接实现文件共享也存在着一些问题:当其他用户去读共享文件时,系统会根据给定的文件路径名逐个分量(名)地去查找目录,直至找到该文件的索引节点。因此,在每次访问共享文件时都可能要多次读盘。这使每次访问文件的开销甚大,且增加了启动磁盘的频率。此外,要为每个共享用户建立一条符号链接,而由于链接本身实际上是一个文件(尽管该文件非常简单),因此要为它配置一个索引节点,这也要耗费一定的磁盘空间。
需要说明的是,上述链接方式存在一个问题,即每个共享文件都有多个文件名,换言之,每增加一条符号链接,就增加一个文件名。这在实质上就是每个用户都会使用自己的路径名去访问共享文件。当我们试图去遍历(traverse)整个文件系统时,将会多次遍历到该共享文件。例如,当有一个程序员要将一个目录中的所有文件都转存到磁盘上时,就可能会使一个共享文件产生多个复制。
8.5 文件保护
- 在现代计算机系统中,存放了越来越多的宝贵信息供用户使用,这给用户带来了极大的好处和方便,但同时也有着潜在的不安全性。影响文件安全性的主要因素有:
- ①人为因素,人们有意或无意的行为会使文件系统中的数据遭到破坏或丢失;
- ②系统因素,系统的某部分出现异常情况会造成数据的破坏或丢失,特别是作为存储数据的主要介质——磁盘,其一但出现故障将会产生难以估量的影响;
- ③自然因素,随着时间的推移,存放在磁盘上的数据会逐渐消失。
- 为了确保文件系统的安全性,可针对上述因素而采取3个方面的措施:
- ①通过存取控制机制,防止人为因素导致文件不安全;
- ②采取系统容错技术,防止系统某部分的故障导致文件不安全;
- ③建立后备系统,防止自然因素导致文件不安全。本节主要介绍第一方面的措施——存取控制机制,第二方面和第三方面的措施将会在第12章中进行介绍。
8.5.1 保护域
在现代OS中,几乎都配置了用于对系统中资源进行保护的保护机制,并引入了“保护域”和“访问权”的概念,规定每一个进程仅能在 保护域(protection domain) 内执行操作,而且只允许进程访问它们具有“访问权”的对象。
1.访问权
为了对系统中的对象加以保护,应由系统来控制进程对对象的访问。对象可以是硬件对象,如磁盘驱动器、打印机等;也可以是软件对象,如文件、程序等。进程对对象所施加的操作也有所不同,如对文件可以进行读操作,也可以进行写或执行操作。我们把一个进程能对某对象进行操作的权力,称为访问权(access right)。每个访问权都可以用一个有序对(对象名,权集)来表示,例如,某进程有对文件F1进行读和写操作的权力,则可将该进程的访问权表示成(F1, {RW})。
2.保护域
为了对系统中的资源进行保护,引入了保护域的概念。保护域简称为“域”,是进程对一组对象的访问权的集合。进程只能在指定域内执行操作,这样,“域”也就规定了进程所能访问的对象和所能执行的操作。图8-19所示为3个保护域。在域1中有两个对象,即文件F1和F2,只允许进程对F1读,而允许其对F2读和写;而对象Printer1同时出现在域2和域3中,这表示在这两个域中运行的进程,都能使用打印机。
3.进程和域间的静态联系
进程和域之间可以一一对应,即一个进程只联系着一个域。这意味着,在进程的整个生命期中,其可用资源是固定的,我们把这种进程联系的域称为 “静态域”。在这种情况下,进程运行的全过程都受限于同一个域,这将会使赋予进程的访问权超过实际需要。例如,某进程在运行开始时需要用磁带机输入数据,而在进程快结束时,又需要用打印机打印数据。在一个进程只联系着一个域的情况下,需要在该域中同时设置磁带机和打印机这两个对象,这将超过进程运行的实际需要。
4.进程和域间的动态联系
在进程和域之间,也可以是一对多的关系,即一个进程可以联系着多个域。在此情况下,可将进程的运行分为若干个阶段,每个阶段联系着一个域,这样便可根据运行的实际需要来规定在运行的每个阶段中进程所能访问的对象。同样针对上面第3部分中的例子,我们可以把进程的运行分成3个阶段:进程在开始运行的阶段联系着域D1,其中包括用磁带机输入数据;在运行快结束的第3阶段联系着域D3,其中包括用打印机打印数据;中间运行阶段联系着域D2,其中既不含磁带机,也不含打印机。我们把这种一对多的联系方式称为动态联系方式,在采用这种联系方式的系统中,应增设保护域切换功能,以使进程能在不同的运行阶段从一个保护域切换到另一个保护域。
8.5.2 访问矩阵的概念
1.基本的访问矩阵
- 我们可以利用一个矩阵来描述系统的访问控制,并把该矩阵称为访问矩阵(access matrix)。访问矩阵中的行代表域,列代表对象,矩阵中的每一项都是由一组访问权所组成的。因为对象已由列显式地定义,故可以只写出访问权而不必写出是对哪个对象的访问权,每一项访问权access(i, j)都定义了在域Di中执行的进程能对对象Qj所施加的操作集。访问矩阵中的访问权,通常是由资源的拥有者或者管理者所决定的。当用户创建一个新文件时,创建者便是授权者,系统会在访问矩阵中为新文件增加一列,然后由用户决定在该列的某个项中应具有哪些访问权,而在另一项中又应具有哪些访问权。当用户删除此文件时,系统也要相应地在访问矩阵中将该文件对应的列撤销。
- 图8-19对应的访问矩阵如图8-20所示,它是由3个域和8个对象所组成的。当进程在域D1中运行时,它能读文件F1、读和写文件F2;在域D2中运行时,它能读文件F3、F4、F5,写文件F4、F5以及执行文件F4,此外还可以使用打印机1;只有在域D3中运行时,才可使用绘图仪2。
2.具有域切换权的访问矩阵
- 为了实现进程和域之间的动态联系,应能将进程从一个保护域切换到另一个保护域。为了能对进程进行控制,同样应将切换作为一种权力,仅当进程有切换权时,才能进行切换。为此,在访问矩阵中又增加了几个对象,分别把它们作为访问矩阵中的几个域;当且仅当switch∈access(i, j)时,才允许进程从域i切换到域j。例如,在图8-21中,由于域D1和域D2所对应的项目中有一个S(即switch),故而允许在域D1中运行的进程切换到域D2中。类似地,在域D2和域D3所对应的项中也有一个S,这表示在域D2中运行的进程可以切换到域D3中,但不允许该进程再从域D3返回域D1。
8.5.3 访问矩阵的修改
在系统中建立起访问矩阵后,随着系统的发展及用户的增加和改变,必然要对访问矩阵进行修改。因此,应当允许系统或用户可控性地修改访问矩阵中的内容,这可通过在访问权中增加复制权、所有权及控制权的方法来实现。
1.复制权
- 我们可利用复制权(copy right)将某个域所拥有的访问权access(i, j)扩展到同一列的其他域中,亦即,为进程在其他域中也赋予对同一对象的访问权access(k, j),如图8-22所示。
- 在图8-22中,凡是在访问权access(i, j)上加单引号“ ’ ” 者,都表示在域i中运行的进程能将其对对象j的访问权复制成在任何域中对同一对象的访问权。例如,在域D2中对文件F2的读访问权加上“’”号时,表示运行在域D2中的进程可以将它对文件F2的读访问权扩展到域D3中去。再如,在域D1中对文件F3的写访问权加上“’”号时,表示运行在域D1中的进程可以将它对文件F3的写访问权扩展到域D3中去,使在域D3中运行的进程也具有对文件F3的写访问权。应该注意的是,把带有“’”号的复制权,如R’,由access(i, j)复制成access(k, j)后,其所建立的访问权只是R而不是R’,这使得域Dk上运行的进程不能再将其复制权进行扩散,从而限制了访问权的进一步扩散。这种复制方式被称为限制复制。
2.所有权
- 人们不仅要求能将已有的访问权进行有控制的扩散,而且要求能增加某种访问权,或者能删除某种访问权。此时,可利用所有权(owner right) 来实现这些操作。如图8-23所示,如果在access(i, j)中包含所有访问权,则在域Di上运行的进程可以增加或删除其在j列上任何项中的访问权。换言之,进程可以增加或删除在任何其他域中运行的进程对对象j的访问权。例如,在图8-23(a)中,在域D1中运行的进程(用户)是文件F1的所有者,它能增加或删除在其他域中运行的进程对文件F1的访问权;类似地,在域D2中运行的进程(用户)是文件F2和F3的拥有者,该进程可以增加或删除在其他域中运行的进程对这两个文件的访问权。图8-23(b)所示为在域D1中运行的进程删除了在域D3中运行的进程对文件F1的执行权;在域D2中运行的进程增加了在域D3中运行的进程对文件F2和F3的写访问权。图8-23中的 “O”表示所有权。
3.控制权
复制权和所有权都是用于改变矩阵内同一列的各项访问权的,或者说,是用于改变在不同域中运行的进程对同一对象的访问权的。控制权(control right)则可用于改变矩阵内同一行(域)中的各项访问权,亦即,用于改变在某个域中运行的进程对不同对象的访问权。如果在access(i, j) 中包含了控制权,则在域Di中运行的进程可以删除在域Dj中运行的进程对各对象的任何访问权。例如在图8-24中,若在access(D2, D3) 中包括了控制权,则一个在域D2中运行的进程能够改变在域D3中运行的进程对各对象的访问权。通过比较图8-21和图8-24可知,在域D3中已无对文件F6的写访问权。
8.5.4 访问矩阵的实现
- 访问矩阵虽然在概念上是简单的(极易理解),但在具体实现上,却有一定的困难,因为在稍具规模的系统中,域的数量和对象的数量都可能很大,例如,在系统中有100个域,106个对象,此时在访问矩阵中便会有108个表项,即使每个表项只占一个字节,此时也须占用100MB的存储空间来保存这个访问矩阵。另外,对这个矩阵(表)进行访问,必然是十分费时的。简言之,访问该矩阵所花费的时空开销是令人难以接受的。
- 事实上,每个用户(进程)所须访问的对象通常很有限,例如只有几十个,因而在这个访问矩阵中的绝大多数项都会是空项,或者说,这是一个非常稀疏的矩阵。目前针对这一问题的解决方法是,将访问矩阵按列或按行划分,以分别形成访问控制表或访问权限表。
1.访问控制表
- 对访问矩阵按列(对象)进行划分,并为每一列建立一张访问控制表。在该表中,已把矩阵中属于该列的所有空项删除,此时的访问控制表由一有序对(域,权集)组成。由于在大多数情况下矩阵中的空项远多于非空项,因而使用访问控制表可以显著地减少所占用的存储空间,并能提高查找速度。在不少系统中,当对象是文件时,便把访问控制表存放在该文件的文件控制表中,或存放在文件的索引节点中,作为该文件的存取控制信息使用。
- 域是一个抽象的概念,可用各种方式实现。最常见的一种情况是,每个用户是一个域,而对象则是文件。此时,用户能够访问的文件集和访问权限取决于用户的身份。通常,在一个用户退出而另一个用户进入(即用户发生改变)时,要进行域的切换;另一种情况是,每个进程是一个域,此时,进程能够访问的对象集中的各访问权取决于进程的身份。
- 访问控制表也可用于定义默认的访问权集,即在该表中列出了各个域对某对象的默认访问权集。在系统中配置了这种表后,当某用户(进程)要访问某资源时,通常是首先由系统到默认的访问控制表中去查找该用户(进程)是否具有对指定资源进行访问的权力,如果找不到,则再到相应对象的访问控制表中去找。
2.访问权限表
- 对访问矩阵按行(即域)进行划分,并为每一行建立一张访问权限表,该表是由一个域对每个对象可以执行的一组操作所构成的表。表中的每一项即该域对某对象的访问权限。当域为用户(进程)、对象为文件时,访问权限表便可用于描述一个用户(进程)对每个文件所能执行的一组操作。
- 表8-1所示为对应于图8-21中域D2的访问权限表。在该表中共有3个字段,其中类型字段用于说明对象的类型;权力字段是指域D2对该对象所拥有的访问权限;对象字段是一个指向相应对象的指针,对于UNIX系统而言,它就是索引节点的编号。由该表可以看出,域D2可以访问的对象有4个,即文件3、文件4、文件5和打印机,对文件3的访问权限是只读,对文件4的访问权限是读、写和执行等。
- 应当指出,仅当访问权限表安全时,由它所保护的对象才可能是安全的。因此,访问权限表不能允许直接被用户(进程)访问。通常会将访问权限表存储到系统区内的一个专用区中,只供通过访问合法性检查的程序对该表进行访问,以实现对访问控制表的保护。
- 目前,大多数系统都同时采用访问控制表和访问权限表,在系统中为每个对象配置一张访问控制表。当一个进程第一次试图去访问一个对象时,必须先检查访问控制表,检查进程是否具有对该对象的访问权。如果无权访问,则会由系统来拒绝进程的访问,并构成一个例外(异常)事件;否则(有权访问),允许进程对该对象进行访问,并为该进程建立一个访问权限,以将之连接到该进程。以后,该进程便可直接利用这一访问权限去访问该对象,这样,便可快速地验证其访问的合法性。当进程不再需要对该对象进行访问时,便可撤销该访问权限。
8.6 Linux文件系统实例
- Linux系统保留了UNIX标准文件系统模型。在UNIX系统中,文件不必存储在本地磁盘上,UNIX系统可以通过网络从远程服务器上获取文件。实际上,UNIX文件可以是能够处理数据流I/O的任何实体。例如,设备驱动程序可以被当作文件,进程间的通信信道或网络连接对用户而言也是文件。
Linux系统内核通过在虚拟文件系统的软件层之后隐藏任何单个文件类型的实现细节,来实现对所有类型文件的处理。下面,首先概述虚拟文件系统,然后讨论标准的Linux ext2文件系统。
8.6.1 实例 1 :虚拟文件系统
- 在Linux ext2文件系统中,提供了一个虚拟文件系统(virtual file system,VFS)。VFS隐藏了各种硬件的具体细节,包括本地存储设备和远程网络存储设备等,并且把文件系统的相关操作和不同文件系统的具体细节分离开,为所有的设备提供了统一的接口。VFS使得Linux系统可以支持多达数十种不同的文件系统。
- 在Linux系统中,用户程序在需要访问文件时,首先会调用文件系统提供的系统调用,如open()、read()、write()、close()等,这些系统调用会访问VFS的数据结构,以确定要访问的文件属于哪个文件系统;然后通过存储在VFS数据结构中的函数指针实现对该文件系统相关操作的调用。图8-25所示为VFS文件访问过程,即在VFS中访问文件的过程。
- VFS支持的4个主要文件系统对象为超级块superblock、目录项dentry、索引节点iNode、文件file。其中,超级块superblock是对一个文件系统的描述;索引节点iNode是对一个文件物理属性的描述;目录项dentry是对一个文件逻辑属性的描述;文件file是对当前进程打开的文件的描述。它们具体介绍如下。
- (1)超级块superblock:表示一个文件系统。它包含管理文件系统所需的信息,包括文件系统名称(如ext2)、文件系统的大小和状态、块设备的引用和元数据信息(如空闲列表等)。超级块通常存储在存储介质上,但是如果超级块不存在,则可以实时地创建它。
- (2)索引节点iNode:文件系统处理文件所需要的所有信息都保存在索引节点中。iNode代表的是物理意义上的文件,记录的是文件物理上的属性,如索引节点编号、文件大小、访问权限、修改日期、数据位置等。索引节点和文件一一对应,它跟文件内容一样,都会被持久化地存储到磁盘中。
- (3)目录项dentry:每个文件除了需要有一个结构体(struct iNode) 外,还需要有一个目录项,用于描述文件逻辑上的属性,其没有对应的磁盘数据结构。目录项是由内核维护的一个内存数据结构,根据字符串形式的路径名现场创建而成,记录文件名、索引节点指针以及与其他目录项的关联关系。多个关联的目录项即会构成文件系统的目录结构。
- (4)文件file:存放打开的文件与进程之间进行交互的相关信息。
8.6.2 实例 2 :Linux ext2 文件系统
- Linux系统最早采用的文件系统是MINIX,该文件系统由MINIX系统定义,有一定的局限性,如文件名最长为14个字符,文件最大为64MB。第一个专门为Linux系统而设计的文件系统是扩展文件系统(extended file system),通常亦称ext文件系统。该文件系统发展至今衍生出了许多新版本,其中第二版(即ext2文件系统)的设计最为成功,目前流传最广的是ext4文件系统。
- ext2文件系统功能强大、易扩充,是所有Linux系统所安装的标准文件系统模型。ext2文件系统将自身所占用的逻辑分区划分成块组(block group),每个块组的结构如图8-26所示。
- 通常,一个文件在磁盘中除了存储文件实际内容外,还需要存储很多属性,如文件的权限与文件属性(如所有者、群组、时间参数等)。文件系统通常会将这两部分数据放在不同的块组,权限和属性放在索引节点中,至于实际的数据则放在数据块中。另外,还有一个超级块会记录文件系统的整体信息,包括索引节点与数据块的总量、使用量、剩余量等。
- 在文件系统的整体规划中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装引导装载程序,这样就能够将不同的引导装载程序安装到个别的文件系统最前端,而不用覆盖整块硬盘唯一的主引导记录(master boot record,MBR)扇区,进而即可制作出多重引导环境。
- 同时,为了方便管理,ext2文件系统在格式化的时候基本上被区分为多个块组,每个块组都有独立的iNode/block/superblock系统,该系统包括6个组成部分:超级块、组描述符、块位图、索引节点位图、索引节点表、数据块。
- (1)超级块(superblock):记录整个文件系统的信息。
- (2)组描述符(group description):即描述每个组块的开始与结束时的数据块号码。
- (3)块位图(block bitmap):即数据块位示图,用一个二进制位来表示数据块是否空闲。通过块位图可以知道并快速找到空的数据块,进而进行文件的添加操作。
- (4)索引节点位图(iNode bitmap):类似数据块位示图,用一个二进制位来表示索引节点是否被使用。通过索引节点位图可以快速找到未被使用的索引节点编号。
- (5)索引节点表(iNode table):每个索引节点的固定大小为128B,每个文件仅占用一个索引节点,文件系统能够创建的文件数量与索引节点的数量有关。系统读取文件时需要先找到索引节点,并分析索引节点所记录的权限与用户权限是否符合,若符合,才能开始实际读取数
据块的内容。 - (6)数据块(data block):ext2文件系统中支持的数据块的大小有1KB、2KB、4KB三种,每个数据块中只能放一个文件的数据,而不能将多个文件的数据放在一个数据块中,如果文件的数据大于数据块的大小,则该文件将会占用多个数据块,但是一般只有一个索引节点。在分配文件时,ext2文件系统首先会为这个文件选择块组。对于数据块,它会试图分配文件到与文件索引节点相同的块组。对于索引节点,它会选择文件的父目录驻留在非目录文件中的块组。目录文件并不会被放在一起,而是会被分散到整个可用块组。这些策略的应用,不仅可以实现在同一块组中保存相关信息,而且可以将磁盘负荷分散到盘块组中,以减少任何区域的磁盘碎片。
8.7 本章小结
- 本章主要介绍了文件和文件系统的基本概念、文件逻辑结构的类型、文件目录、文件的共享与保护等内容。
- 文件是由OS定义和实现的抽象数据类型。它是逻辑记录的一个序列,而逻辑记录可以是字节、记录或更为复杂的数据项。
- 文件的逻辑结构是指从用户角度所看到的文件组织形式,分为有结构文件和无结构文件两种。有结构文件可分为顺序文件、索引文件和索引顺序文件;无结构文件又称为流式文件。文件目录是用来管理文件的数据结构,可分为单级文件目录、两级文件目录、树形目录、无环图目录等。
- 为了防止浪费存储空间,系统提供文件共享功能显得尤为必要。文件的共享取决于系统所提供的语义,可以在单处理机系统、多处理机系统甚至计算机网络中进行文件共享。因为文件是大多数计算机存储信息的主要机制,其如果处于不安全状态,则可能会产生难以估量的影响,所以需要进行文件保护。文件保护可以通过存取控制机制或其他技术来实现。
虚拟文件系统