概述
文件(File),诞生的目的是为了专门负责管理外存储器上的信息,使用户可以按文件名高效快速的存取信息而不用关心底层实现。
**文件是具有符号名的、在逻辑上具有完整意义的一组相关信息项的集合。**信息项是构成文件的基本单位,里面可以是字符,也可以是记录。一个文件包含文件体和文件说明。文件体是文件的真实内容。文件说明是操作系统管理文件所需的信息,包括文件名、文件内部标识、文件类型、存储地址、长度、权限、建立时间、访问时间等等。
文件的关键在命名,文件名是进程创建文件时确定的,创建后文件将独立于进程直到它被删除。当其他进程要使用文件时也要指定文件名,不同的操作系统对文件命名规则略有不同。
对文件根据不同的方式可做如下分类:
- 按性质用途分类:系统文件、库文件、用户文件
- 按保存期限分类:临时文件、档案文件、永久文件
- 按保护方式分类:只读文件、读/写保护文件、可执行文件、无保护文件
- UNIX类系统分类:普通文件、目录文件、设备文件
文件的结构
文件的结构指的是文件的组织形式,在用户角度角度来看文件称为文件的逻辑结构,因为用户只需要知道文件名就可以存取信息,无需知道文件实际位于的位置。而在实现的角度看则成为物理结构。
文件的逻辑结构
文件的逻辑结构主要分为两类:
-
有结构的记录式文件
它是由一个以上的记录构成的,故称为记录式文件,其中的记录通常都是描述实体集的,有相同或不一的数据项,记录的长度可分为以下两类:
-
定长记录
指文件中所有记录的长度都相同,所有记录中的数据项都处于记录中的相同位置,具有相同的顺序和长度,文件长度用记录数目表示。定长记录的特点是处理方便,系统开销小,是目前较为常用的记录格式。
-
变长纪录
指文件中记录长度各不相同,一个记录中包含的数据项目可以是不同的。
-
-
无结构的流式文件
文件体为字节流,不划分记录,这种文件一般使用顺序访问方式,并且每次读写访问可以指定任一数据的长度。流式文件可以看做是一种特殊的记录式文件。在UNIX系统中,所有文件都被看作是流式文件,即使是有结构的文件也当做流式文件处理。
文件的物理结构
文件的物理结构主要是指文件内部的组织形式,即如何在存储设备上存放。下面是几种常见的物理结构:
-
连续结构
最普通的方法,即存放在连续编号的物理块上,只需知道文件其实块号和长度,就可以方便的进行文件的存取。连续结构是所有逻辑文件中存取效率最高的,但缺点是插入和删除较浪费时间,现在主要利用**事务文件(Transactor File)**记录,然后规定每隔一段时间就与主文件合并。这样就不用在每次插入、删除时都去移动文件所在的物理块。
-
链接结构
类似于编程领域中的链表,也叫串联结构,即每个物理块都设置一个指针指向下一个物理块,只需知道第一个物理块号,就可以顺序找出所有的物理块。
-
索引结构
在采用索引结构时,逻辑上连续的文件信息存放在不连续的物理块,每个文件都会有一张索引表,其中记录逻辑块号对应的物理块号,并将索引表的位置记录在文件的目录项中。
-
多个物理块索引表
即多重的索引结构,其实现各不相同,如UNIX系统采用了3级索引结构。
文件目录
之前提到过,进程有PCB给系统提供必要信息,文件也有一个类似的结构,称为 文件控制块(FCB, File Control Block) ,文件控制块的有序集合称为文件目录。也就是说,文件目录是由FCB组成的,专用于文件的检索。因此FCB也称为目录项。
FCB一般包含三类信息:
- 基本信息:文件名、物理地址、长度、块数等
- 存储控制信息:读写权限、用户组等
- 使用信息:建立日期、修改日期、访问日期等
另外目录结构的组织方式直接影响文件的存取速度,曾经有过一级目录结构与二级目录结构,但现代操作系统中主要都是使用多级目录结构。这种目录结构像一颗倒置的树,所以也称为树型目录结构,从树根往下结点代表目录,叶结点则代表文件。
存储空间管理
要将文件保存到外存上,首先必须要知道存储空间的使用情况,即哪些物理块被使用了,哪些是空闲的。
因此文件系统必须对磁盘空间进行管理,外存空闲空间管理通常使用一种 磁盘分配表(Disk Allocation Table) 来实现。常用的方法有4种:
-
空闲区表
将外存空间的一个连续未分配区域称为空闲区,操作系统会为磁盘上所有空闲区间建立一个空闲表,每个表项对应一个空闲区,空闲表中包含序号、空闲区的第一块块号、空闲块块数和状态等信息,这种方法适用于连续文件结构。
-
位示图
在外存上建立一张位示图,记录文件存储器的使用情况,每一位对应存储器上的一个物理块。这种方法描述能力强,适用于各种物理结构。
-
空闲块链
使每个空闲块含有指向下一个空闲物理块的指针,即构成链表,而头指针则置于特定位置。不需要磁盘分配表,较节省空间。
-
成组链接法
UNIX系统使用的方法,让系统将空闲区分为若干组,每100个空闲块为一组,每组中的第一个空闲块中有指针指向下一组空闲组。这是一种成组后使用指针链接的方式。
文件的保护
文件系统保护文件的方式一般都是存取控制,即对不同用户给予规定的不同权限,以防止文件未经文件主同意被修改。为了保存不同用户对文件的访问权限,一般采用如下方法:
-
存储控制矩阵
这是最简单的一种方法,即令一二维矩阵囊括所有用户对文件的访问权限,这一二维矩阵 M i j M_{ij} Mij指的是用户 i i i对文件 j j j的访问权限,实现比较简单,清晰。
但实际上当用户数和文件数量都很大时,这个矩阵就要耗费非常多的空间,因此一般并不采用。
-
存取控制表
这是矩阵的改进方式,由于文件一般只与少数用户有关,因此将用户分为三类: 文件主 、 同组用户 、其他用户 。而不分开按每个用户存储,这样就可以节省巨大的空间。类UNIX系统就采用了这种方法。
-
用户权限表
这其实算是存储控制表的另外一种实现,它是以用户组为单位,将文件集存入表中,而不是以文件的单位。但实际上大同小异。
-
密码,文件存储时加密,在访问时询问密码解密,安全性很高,但缺点是加密解密需要耗费大量的时间。