操作系统:文件管理

文件

文件的组成

文件则是指具有文件名的若干相关元素的集合,元素通常是记录,而记录又是一组有意义的数据项的集合。基于文件系统的概念,可以把数据组成分为数据项、记录和文件三级。

在文件系统中,数据项是最低级的数据组织形式,可把它分成以下两种类型。第一种是基本数据项,这是用于描述一个对象的某种属性的字符集,是数据组织中可以命名的最小逻辑数据单位,又称为字段。第二种组合数据项,是由若干个基本数据项组成的,简称组项,例如工资可由基本工资、工龄工资和奖励工资等基本项所组成。基本数据项除了数据名外还应有数据类型,因为基本项仅描述某个对象的属性,根据属性的不同,需要用不同的数据类型来描述。
记录是一组相关数据项的集合,用于描述一个对象在某方面的属性。一个记录应包含哪些数据项,取决于需要描述对象的哪个方面。在诸多记录中,为了能唯一地标识一个记录,必须在一个记录的各个数据项中确定出一个或几个数据项,把它们的集合称为关键字(key)
文件是指由创建者所定义的、具有文件名的一组相关元素的集合,可分为有结构文件和无结构文件两种。文件属性可以包括:

属性 说明
文件类型 可以从不同的角度来规定文件的类型,如源文件、目标文件及可执行文件等
文件长度 指文件的当前长度,长度的单位可以是字节、字或块,也可能是最大允许的长度
文件的物理位置 通常用于指示文件所在的设备及所在设备中地址的指针
文件的建立时间 指最后一次的修改时间等

文件名

在不同的系统之间对文件名的规定是不同的,在一些老的系统中名字的长度受到限制,另外一些特殊字符也规定不能用于文件名。扩展名又称为后缀名,是添加在文件名后面的若干个附加字符,用于指示文件的类型。

文件类型

为了便于管理和控制文件,将文件分成若干种类型。由于不同的系统对文件管理方式的不同,因此对文件的分类方法也有很大差异。根据文件的性质和用途的不同,可将文件分为三类:

文件类型 说明
系统文件 由系统软件构成的文件,大多数的系统文件只允许用户调用,不允许读和修改
用户文件 指由用户的源代码、目标文件、可执行文件或数据等所构成的文件
库文件 由标准子例程及常用的例程等所构成的文件,允许用户调用但不允许修改

按文件中数据的形式分类,也可把文件分为三类:

文件类型 说明
源文件 由源程序和数据构成的文件,由终端或输入设备输入的源程序和数据所形成的文件都属于源文件
目标文件 把源程序经过编译程序编译过,但尚未经过链接程序链接的目标代码所构成的文件,后缀名是“.obj”
可执行文件 把编译后所产生的目标代码经过链接程序链接后所形成的文件,后缀名是“.exe”

根据系统管理员或用户所规定的存取控制属性,可将文件分为三类:

文件类型 说明
只执行文件 只允许被核准的用户调用执行,不允许读和写
只读文件 只允许文件主及被核准的用户去读,不允许写
读写文件 允许文件主和被核准的用户去读或写的文件

根据文件的组织形式和系统对其处理方式的不同,可将文件分为三类:

文件类型 说明
普通文件 是由 ASCII 码或二进制码组成的字符文件
目录文件 是由文件目录组成的文件
特殊文件 特指系统中的各类 I/O 设备

文件系统

由于计算机中的内存是易失性设备,所以要将系统和用户需要用到的大量程序和数据以文件的形式存放在外存中,需要时再随时将它们调入内存。在 OS 中又增加了文件管理功能,文件系统的管理功能是将其管理的程序和数据通过组织为一系列文件的方式实现的。它能专门管理在外存上的文件,并把对文件的存取、共享和保护等手段提供给用户。这不仅方便了用户,保证了文件的安全性,还可有效地提高系统资源的利用率。

文件系统层次结构

文件系统的模型可分为三个层次,最底层是对象及其属性,中间层是对对象进行操纵和管理的软件集合,最高层是文件系统提供给用户的接口。

对象及其属性

文件管理系统管理的对象有文件、目录和磁盘存储空间。

对象 说明
文件 在文件系统中有着各种不同类型的文件,都是文件管理的直接对象
目录 在目录的每个目录项中,含有文件名、对文件属性的说明,以及该文件所在的物理地址(或指针)
磁盘(磁带)存储空间 文件和目录必定占用存储空间

对对象操纵和管理的软件集合

该层是文件管理系统的核心部分,包含文件系统的大部分功能:

  1. 对文件存储空间的管理;
  2. 对文件目录的管理;
  3. 用于将文件的逻辑地址转换为物理地址的机制;
  4. 对文件读和写的管理;
  5. 对文件的共享与保护等功能。

在实现这些功能时,OS 通常都采取了层次组织结构,处于某个层次的软件只能调用同层或更低层次中的功能模块。一般地把与文件系统有关的软件分为四个层次:

层次 说明
I/O 控制层 是文件系统的最低层,主要由磁盘驱动程序等组成
基本文件系统层 用于处理内存与磁盘之间数据块的交换
基本 I/O 管理程序 用于完成与磁盘 I/O 有关的事务
逻辑文件系统 用于处理与记录和文件相关的操作

文件系统的接口

为方便用户的使用,文件系统以接口的形式提供了一组对文件和记录操作的方法和手段。通常是下面两种类型的接口:

接口 说明
命令接口 是指作为用户与文件系统直接交互的接口,用户可通过键盘终端键入命令取得文件系统的服务
程序接口 是指作为用户程序与文件系统的接口,用户程序可通过系统调用取得文件系统的服务

文件操作

用户可以通过文件系统提供的系统调用实施对文件的操作,除了最基本的文件操作,一般的 OS 都提供了更多对文件的操作。

最基本的文件操作

最基本的文件操作包含下述内容:

文件操作 说明
创建文件 为新文件分配必要的外存空间,并在文件目录中为之建立一个目录项,目录项中应记录新文件的属性
删除文件 先从目录中找到要删除文件的目录项,然后回收该文件所占用的存储空间
读文件 根据用户给出的文件名去查找目录,从中得到被读文件在外存中的位置
写文件 根据文件名查找目录,找到指定文件的目录项,再利用目录中的写指针进行写操作
设置文件的读/写位置 通过设置文件读/写指针的位置,以便读/写文件时从所设置的位置开始操作

文件的“打开”和“关闭”操作

当用户要求对一个文件实施多次读/写或其它操作时,每次都要从检索目录开始。为了避免多次重复地检索目录,当用户第一次请求对某文件进行操作时,须先利用 open 系统调用将该文件打开。打开是打开就是在用户和指定文件之间建立起一个连接,具体指系统将指名文件的属性(包括该文件在外存上的物理位置),从外存拷贝到内存打开文件表的一个表目中,并将该表目的编号(或称为索引号)返回给用户。
如果用户已不再需要对该文件实施相应的操作,可利用关闭”(close)系统调用来关闭此文件,即断开此连接,OS 将会把该文件从打开文件表中的表目上删除掉。

其它文件操作

OS 为用户都提供了一系列文件操作的系统调用,其中最常用的一类是有关对文件属性的操作,即允许用户直接设置和获得文件的属性另一类是有关目录的操作,如创建一个目录,删除一个目录,改变当前目录和工作目录等。此外,还有用于实现文件共享的系统调用,以及用于对文件系统进行操作的系统调用等。

文件的逻辑结构

文件的逻辑结构(File Logical Structure)是从用户观点出发所观察到的文件组织形式,即文件是由一系列的逻辑记录组成的,用户可以直接处理的数据及其结构。与之对应的是文件的物理结构或存储结构,指系统将文件存储在外存上所形成的一种存储组织形式,是用户不能看见的。

逻辑结构的类型

对文件逻辑结构首先是有助于提高对文件的检索速度,其次是该结构应方便对文件进行修改,第三是尽量减少文件占用的存储空间,不要求大片的连续存储空间。文件的逻辑结构从是否有结构来分,可分为有结构文件和另一类是无结构文件。从文件的组织方式来分,可以分为顺序文件、索引文件和索引顺序文件几种。

按文件是否有结构分类

有结构文件也称记录式文件,每个记录都用于描述实体集中的一个实体,记录的长度可分为定长和不定长两类。定长记录是指文件中所有记录的长度都是相同的,文件的长度用记录数目表示。定长记录能有效地提高检索记录的速度和效率,能方便对文件进行处理和修改,所以这是目前较常用的一种记录格式。

变长记录是指文件中各记录的长度不相同,可能是由于一个记录中所包含的数据项数目并不相同,也可能是数据项本身的长度不定。不论是哪一种,在处理前每个记录的长度都是可知的。对变长记录的检索速度慢,也不便于对文件进行处理和修改。但由于变长记录很适合于某些场合的需要,所以也是较常用的一种记录格式。

无结构文件是文件内部的数据就是一系列二进制流或字符流组成的文件,又称“流式文件”。流式文件的长度是以字节为单位的,访问时是利用读、写指针来指出下一个要访问的字符。

按文件的组织方式分类

根据文件的组织方式,可把有结构文件分为三类:

文件分类 说明
顺序文件 指由一系列记录按某种顺序排列所形成的文件,其中的记录可以是定长记录或可变长记录。
索引文件 指为可变长记录文件建立一张索引表,为每个记录设置一个表项以加速对记录的检索速度。
索引顺序文件 将顺序文件和索引文件相结合

顺序文件

顺序文件的排列方式

在顺序文件中的记录,可以按照各种不同的顺序进行排列。一般地可分为两种情况,第一种是串结构,在串结构文件中的记录通常是按存入时间的先后进行排序的,各记录之间的顺序与关键字无关。在对串结构文件进行检索时必须从头开始,直到找到指定的记录或查完所有的记录为止,显然对串结构文件检索是比较费时的。

第二种是顺序结构,由用户指定一个字段作为关键字唯一地标识记录,关键字值在文件中具有唯一性。文件中的所有记录就可以按关键字来排序,可以利用某种有效的查找算法提高检索效率。顺序文件常用于每次要读或写一大批记录时,在所有逻辑文件中它的存取效率是最高的。对于顺序存储设备(如磁带),只能使用顺序存储。在交互应用的场合,如果用户(程序)要求查找、删除或修改单个记录,系统需要在文件的记录中逐个地查找,性能就被降低了。

顺序文件的寻址

访问顺序文件中的一条记录需要先找到该记录的地址,查找记录地址的方法有隐式寻址和显式寻址方式两种。隐式寻址方式是对于定长记录的顺序文件,如果已知当前记录的逻辑地址,可以设置一个读指针 ptr。每当读写完一个记录时,便执行 ptr = ptr + L 操作就可以指向下一个记录的首地址,其中的 L 为记录长度。对于变长记录的顺序文件,每次都需要从正在读写的记录中读出该记录的长度 Li,然后执行 ptr = ptr + Li 操作。主要问题是访问一个指定记录 i,必须扫描或读取前面第 0 ~ i - 1个记录,访问速度是比较慢的。

显式寻址方式可用于对定长记录的文件实现直接或随机访问,而对于可变长度记录的文件须增加适当的支持机构实现。在文件中的每一个记录都可以用一个整数来唯一地标识一个记录,对于定长记录文件如果要查找第 i 个记录,可直接根据下式计算获得第 i 个记录相对于第一个记录首址的地址。

Ai = i × L


显式寻址也可以利用关键字,当用户给出要检索记录的关键字时,系统将利用该关键字顺序地与每一个记录的关键字进行比较,直到找到匹配的记录。

索引文件

对于可变长记录文件,要找到第 i 个记录,必须先顺序第查找前 i-1 个记录,搜索效率较低。为了解决这个问题,可以为变长记录文件建立一张索引表,为主文件中的每个记录在索引表中分别设置一个表项,记录指向记录的指针以及记录的长度 L。索引表本身是定长记录的顺序文件,因此可以快速找到第 i 个记录对应的索引项。

可将关键字作为索引号内容,若按关键字顺序排列,则还可以支持按照关键字折半查找。每当要增加/删除一个记录时,需要对索引表进行修改。由于索引文件有很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合。同时实际应用中不同的用户,希望能按不同的属性(或不同的关键字)来检索一条记录。此时需要为顺序文件建立多个索引表,即为每一种可能成为检索条件的属性或关键字都配置一张索引表。

索引顺序文件

一级索引顺序文件

索引文件的每个记录对应一个索引表项,因此索引表可能会很大。比如文件的每个记录平均只占 8B,而每个索引表项占 32 个字节,那么索引表都要比文件内容本身大 4 倍。索引顺序文件(Index Sequential File)是索引文件和顺序文件思想的结合,它同样会为文件建立一张索引表,一组记录对应一个索引表项。

检索效率分析

若一个顺序文件有 10000 个记录,则根据关键字检索只能从头开始顺序查找,平均须查找 5000 个记录。若采用索引顺序文件结构,可把 10000 个记录分为 100 组,每组 100 个记录。则需要先顺序查找索引表找到分组(平均需要查 50 次),找到分组后再在分组中顺序查找记录(平均需要查 50 次),采用索引顺序文件结构后平均查找次数减少为 50 + 50 = 100次。

两级顺序索引文件

对于一个非常大的文件,为找到一个记录而须查找的记录数目仍然很多。例如对于一个含有 10^6 个记录的顺序文件,找到一个记录平均须查找 1000 个记录。为了进一步提高检索效率,可以为顺序文件建立多级索引,即为索引文件再建立一张索引表,从而形成两级索引表

直接文件和哈希文件

采用前述几种文件结构对记录进行存取时,都须利用给定的记录键值,对线性表进行检索以找到指定记录的物理地址。对于直接文件则可根据关键字直接获得指定记录的物理地址,关键字本身就决定了记录的物理地址,这种由关键字到记录物理地址的转换被称为键值转换。
哈希(Hash)文件是目前应用最为广泛的一种直接文件,它利用 Hash 函数(或称散列函数)可将关键字转换为相应记录的地址。但为了能实现文件存储空间的动态分配,通常由Hash函数所求得的并非是相应记录的地址,而是指向某一目录表相应表目的指针。

文件目录

目录管理的要求

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

要求 说明
实现“按名存取” 用户向系统提供所需访问文件的名字,能快速准确地找到指定文件在外存上的存储位置
提高对目录的检索速度 通过合理地组织目录结构加快对目录的检索速度,从而提高对文件的存取速度
文件共享 允许多个用户共享一个文件,节省大量的存储空间并方便用户和提高文件利用率
允许文件重名 允许不同用户对不同文件采用相同的名字

目录的构成

文件控制块

为了能对一个文件进行正确的存取,必须为文件设置用于描述和控制文件的数据结构,称之为文件控制块 FCB(File Control Block)。文件管理程序可借助于文件控制块中的信息对文件施以各种操作,文件与文件控制块一一对应,把文件控制块的有序集合称为文件目录。为了能对系统中的大量文件施以有效的管理,在文件控制块中,通常应含有三类信息:基本信息、存取控制信息及使用信息。基本信息类包括文件名、文件物理位置、文件逻辑结构和文件的物理结构,存取控制信息类包括文件的存取权限,使用信息类包括文件的建立日期和时间、文件上一次修改的日期和时间,以及当前使用信息。

索引结点

文件目录通常是存放在磁盘上的,当文件很多时,文件目录可能要占用大量的盘块。在查找目录的过程中,必须先将存放目录文件的第一个盘块中的目录调入内存,然后将被搜索的文件名与目录项中的文件名逐一比较。若未找到指定文件,还需要将下一盘块的目录项调入内存。假设目录文件所占用的盘块数为 N,则查找一个目录项平均需要调入盘块 (N + 1) / 2 次。
在检索目录文件的过程中,只用到了文件名,仅当找到一个目录项时,才需从该目录项中读出该文件的物理地址。为此在有的系统中,把文件名与文件描述信息分开,使文件描述信息单独形成一个称为索引结点的数据结构,在文件目录中的每个目录项仅由文件名和指向该文件所对应的索引结点。

对目录操作

操作 说明
搜索 当用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项
创建文件 创建一个新文件时,需要在其所属的目录中增加一个目录项
删除文件 当删除一个文件时,需要在目录中删除相应的目录项
显示目录 用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性
修改目录 某些文件属性保存在目录中,因此这些属性变化时需要修改相应的目录项

简单的文件目录

最简单的文件目录形式是单级目录和两级目录。

单级文件目录

单级文件目录是最简单的文件目录,在整个文件系统中只建立一张目录表,每个文件占一个目录项,目录项中含文件名、文件扩展名、文件长度、文件类型、文件物理地址以及其它文件属性。为表明每个目录项是否空闲,又设置了一个状态位。每当要建立一个新文件时,必须保证新文件名在目录中是唯一的,然后再从目录表中找出一个空白目录项,填入新文件的文件名及其它说明信息,并置状态位为 1。删除文件时先从目录中找到该文件的目录项,回收该文件所占用的存储空间,然后再清除该目录项。

单级文件目录的优点是简单,但它只能实现目录管理中最基本的功能——按名存取,具有查找速度慢、不允许重名、不便于实现文件共享的缺点。

两级文件目录

为了克服单级文件目录所存在的缺点,可以为每一个用户再建立一个单独的用户文件目录 UFD(User File Directory),这些文件目录由用户所有文件的 FCB 组成。此外在系统中再建立一个主文件目录 MFD(Master File Directory),每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录文件的指针。
如果用户希望有自己的用户文件目录 UFD,可以请求系统为自己建立一个用户文件目录,如果自己不再需要 UFD,也可以请求系统管理员将它撤消。UFD 用户可以根据自己的需要在 UFD 创建新文件,OS 只需检查该用户的 UFD 判定是否已有同名的另一个文件。若有用户必须为新文件重新命名,若无便在 UFD 中建立一个新目录项,将新文件名及其有关属性填入目录项中,并置其状态位为“1”。当用户要删除一个文件时,OS 也只需查找该用户的 UFD,在回收该文件所占用的存储空间后,将该目录项删除。

两级文件目录提高了检索目录的速度,在不同的用户目录中,可以使用相同的文件名,不同用户还可使用不同的文件名访问系统中的同一个共享文件。但是该结构虽然能有效地将多个用户隔开,当一用户需去访问其他用户的文件时,这种隔离会使诸用户之间不便于共享文件。

树形结构目录

在现代 OS 中,最通用且实用的文件目录是树形结构目录(Tree-Structured Directory)。主目录在这里被称为根目录,在每个文件目录中,只能有一个根目录,每个文件和每个目录都只能有一个父目录。把数据文件称为树叶,其它的目录均作为树的结点,或称为子目录。

在树形结构目录中,从根目录到任何数据文件都只有一条唯一的通路。在该路径上从树的根(即主目录)开始,把全部目录文件名与数据文件名依次地用“/”连接起来,即构成该数据文件唯一的路径名(path name)。如果每访问一个文件都要使用从树根开始,这是相当麻烦的事,同时由于一个进程运行时所访问的文件大多仅局限于某个范围,因而非常不便。可为每个进程设置一个“当前目录”(Current Directory),又称为“工作目录”,进程对各文件的访问都相对于“当前目录”而进行。
树形结构目录的查询速度更快,同时层次结构更加清晰,能够更加有效地进行文件的管理和保护。不同性质、不同用户的文件,可以构成不同的目录子树,不同层次、不同用户的文件,分别呈现在系统目录树中的不同层次或不同子树中,可以容易地赋予不同的存取权限。但是查找一个文,需要按路径名逐级访问中间节点,增加了磁盘访问次数。

文件共享

系统应允许多个用户(进程)共享,这样在系统中只需保留该共享文件的一份副本。如果系统不能提供文件共享功能,就意味着凡是需要该文件的用户,都须各自备有此文件的副本,显然这会造成对存储空间的极大浪费。

有向无循环图

在严格的树形结构目录中,每个文件只允许有一个父目录,其它用户要想访问它必须经过其属主目录来访问该文件。树形结构目录是不适合文件共享的,如果允许一个文件可以有多个父目录,这些用户可用对称的方式实现文件共享,而不必再通过其属主目录来访问,此时的结构是有向无循环图 DAG(Directed Acyclic Graph)。当有多个用户要共享一个子目录或文件时,必须将共享文件或子目录链接到多个用户的父目录中。

索引结点

将文件的物理地址及其它的文件属性等信息放在索引结点中,在文件目录中只设置文件名及指向相应索引结点的指针。索引结点中设置一个链接计数变量 count,用于表示链接到本索引结点上的用户目录项数。若某个用户决定“删除”该文件,则只是要把用户目录中与该文件对应的目录项删除,且索引结点的 count 值减 1。若 count > 0 说明还有别的用户要使用该文件,暂时不能把文件数据删除,当 count = 0 时系统负责删除文件。

符号链接

利用符号链接(Symbolic Linking)实现文件共享的基本思想,是允许一个文件或子目录有多个父目录,但其中仅有一个作为主(属主)父目录,其它的几个父目录都是通过符号链接方式与之相链接的(简称链接父目录)。当用户访问被链接的文件且正要读 LINK 类新文件时,OS 根据新文件中的路径名去找到被连接文件,然后对它进行读写。在利用符号链方式实现文件共享时,只是文件主才拥有指向其索引结点的指针,而共享该文件的其他用户则只有该文件的路径名。这样不会发生在文件主删除一共享文件后留下一悬空指针的情况,如果其他用户又试图通过符号链去访问一个已被删除的共享文件,则会因系统找不到该文件而使访问失败,此时再将符号链删除。
但是当其他用户去读共享文件时,系统是根据给定的文件路径名逐个分量(名)地去查找目录,因此在每次访问共享文件时都可能要多次地读盘。同时每增加一条链接,就增加一个文件名,当试图去遍历(traverse)整个文件系统时将会多次遍历到该共享文件。

文件保护

文件安全性的因素

影响文件安全性的主要因素有:

因素 说明
人为因素 人们有意或无意的行为,会使文件系统中的数据遭到破坏或丢失
系统因素 由于系统的某部分出现异常情况,而造成数据的破坏或丢失
自然因素 随着时间的推移,存放在磁盘上的数据会逐渐消失

为了确保文件系统的安全性,可针对上述原因而采取三方面的措施:

措施 说明
通过存取控制机制 防止由人为因素所造成的文件不安全性
采取系统容错技术 防止系统部分的故障所造成的文件的不安全性
建立后备系统 防止由自然因素所造成的不安全性

保护域

在现代 OS 中,几乎都配置了用于对系统中资源进行保护的保护机制,并引入了“保护域”和“访问权”的概念。规定每一个进程仅能在保护域内执行操作,而且只允许进程访问它们具有“访问权”的对象。访问权(Access right)是一个进程能对某对象执行操作的权力。保护域是进程对一组对象访问权的集合,进程只能在指定域内执行操作。

文件保护的方式

可以为文件设置一个“口令”,用户请求访问该文件时必须提供“口令”。口令一般存放在文件对应的 FCB 或索引结点中,OS 会将用户提供的口令与 FCB 中存储的口令进行对比,如果正确,则允许该用户访问文件。优点是保存口令的空间开销不多,验证口令的时间开销也很小。缺点是正确的“口令”存放在系统内部,不够安全。
可以使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。优点是保密性强,不需要在系统中存储“密码”,缺点是加密/解密要花费一定时间。
也可以在每个文件的 FCB(或索引结点)中增加一个访问控制列表(Acce ss-Control List,ACL),该表中记录了各个用户可以对该文件执行哪些操作。精简的访问列表以组为单位,标记各组用户可以对文件执行哪些操作。当某用户想要访问文件时,系统会检查该用户所属的分组是否有相应的访问权限。访问权限一般有:

访问权限 说明
从文件中读数据
向文件中写数据
执行 将文件装入内存并执行
添加 将新信息添加到文件结尾部分
删除 删除文件,释放空间
列表清单 列出文件名和文件属性

参考资料

《计算机操作系统(第四版)》,汤小丹 梁红兵 哲凤屏 汤子瀛 编著,西安电子科技大学出版社

posted @ 2021-08-13 15:38  乌漆WhiteMoon  阅读(1468)  评论(0编辑  收藏  举报