第六章 文件管理
6.1 文件系统概述
一 为什么要引入文件和文件系统
1 持久存储数据
2 方便用户使用
3 有效利用空间
二 什么是文件?文件系统有何作用?
1 什么是文件?
文件是有名字的记录在外存中的一组有逻辑意义的数据项的序列。
名字:文件名
数据项:构成文件内容的基本单位
长度:文件的字节数
文件内容的含义:由文件的建立者和使用者解释
2 文件命名
每个操作系统都有自己的命名规则。比如长度、数字和特殊字符、是否大小写敏感、文件拓展名等等。
3 什么是文件系统?
文件系统就是操作系统中用来管理文件的那一部分软件。
如果需要设计一个文件系统,需要做哪些方面的设计?
4 文件系统的功能
- 统一管理文件的存储空间,实施存储空间的分配与回收。
- 实现文件信息的共享,提供文件的保护和保密措施。
- 实现文件的按名访问,用户不必关心文件的物理位置和存储结
构(访问的透明性)
- 向用户提供一个方便使用的接口,提供对文件系统操作的命令
- 尽可能地实现与I/O的统一接口。
5 文件的分类
文件分类的角度很多:
- 按文件的性质和用途:系统文件、用户文件、库文件。
- 文件中数据的形式:文本文件、二进制文件
- 文件的保护方式:只读文件、读写文件、可执行文件
- 文件的逻辑结构:流式结构、记录式文件
- 文件的物理结构:顺序文件、链式文件、索引文件
三 看待文件系统的两种观点
1 用户观点
文件如何呈现在用户面前:一个文件由什么组成,怎么样去命名,如何去保护文件以及可以进行什么样的操作等等。需要尽可能的方便用户使用。
2 系统观点
文件目录怎么实现,怎么样管理文件存储空间、存储位置,与设备管理的接口等等。尽可能的提高效率。
6.2 文件的结构与存取方式
一 文件的逻辑结构
1 字节流文件(流式文件):无结构文件
这种文件其结构是一个无结构的字节序列,其含义由使用者自己定义。
示例:
ÿØÿà^@^PJFIF^@^A^A^A^A^A^@^@ÿá^@^Exif^@^@MM^@^00^00^00^@^V^B^G^100^01^02^00^06^00^00^00^01^00^01^00^00^01^02^00^06^00^00^00^01^00^01^00^00^^E^jf^Ob^@^@(^^@^B^F^J^P^W^J^L^L^L^D^D^Q^S^I^L^T^T^D^I^T^T^T^V^P^T^T^T^a^T^V^<Metadata^@^V^B^G^155^01^06^00^08^00^00^00^01^00^1
2 记录文件(有结构文件)
这种文件是一种记录的序列,每条记录都有其内部结构。记录可以有定长和不定长之分。
示例:
Name Age Gender Occupation
John Doe 32 Male Engineer
Jane Smith 28 Female Teacher
Bob Johnson 35 Male Doctor
Mary Lee 42 Female Lawyer
二 文件的物理结构
文件的存储结构,指文件在外存上的存放形式,即从系统的角度看文件的组织方式。
一般来说,基本结构有三种:连续结构(物理结构)、链式结构(串联结构)、索引结构。
对于块设备来说(比如磁盘),块(由多个连续扇区组成)是文件分配的最小单位,一个块内不会存储多个文件的内容。
1 连续结构
文件的数据存放在若干连续的物理块中。优点很明显,就是只要记住首块的地址和文件长度就行。顺序存取和随机存取的速度很快,所需要的磁盘寻道时间最少。
这种结构缺点也很明显:
- 不利于文件的动态增长:如果预留空间过大,就会造成浪费。
如果预留空间过小,由于事先不知道文件的最大长度,所以可能不够。
- 不利于文件内容的插入和删除
- 存在外部碎片
2 链式结构
一个文件的数据如果存放在若干不连续的物理块中,各块之间通过指针链接。每个物理块指向下一个物理块。
相较于连续结构,优点很明显,就是提高了磁盘空间利用率,还有就是不存在外部碎片,有利于文件的动态扩充、文件内容的插入和删除。
缺点:
- 随机存取相当缓慢
- 需要更多的寻道空间,连续结构只需要找到第一个物理块,顺
序读下去就行了,但是链式结构每次找到一个物理块都要读一次磁盘。
- 链接指针占用一定的空间。
3 文件分配表FAT(链式结构的变形)
一般以簇为单位分配空间,簇由若干连续物理块组成。
FAT放在内存当中,一次就可以知道所有物理块的地址。
4 索引结构
一个文件的数据存放在若千不连续的物理块中,系统为每个文件建立一个专用数据结构--索引表。索引表存放逻辑块号与物理块号的对应关系一个索引表就是磁盘块地址(块号)数组,其中第i个条目存放的是逻辑块号i对应的物理块号。文件目录的目录项中指出索引表的物理地址。
优点:保持了链接结构的优点,又避免了其缺点。既能顺序存取,又能随机存取。能满足文件动态增长、插入、删除的要求能充分利用外存空间
缺点:索引表本身带来了系统开销
索引表的结构:对于一个小文件来说,一般将其索引表保存在一个单独的物理块中。如果文件很大,索引表过大,超过了一个物理块,就必须考虑索引表的组织方式。
索引表的组织:
- 连续方式:索引表占用多个连续的盘块。
- 链接方式:索引表按照链式结构组织,占用多个不连续的盘块。
- 多级索引:例如二级索引将一个大文件的所有索引表(二级索引)的地址放在另外一个索引表中。此外还有三级索引等等。
几个问题:
1)在连续结构、基本链式结构、FAT、索引结构中,哪一种好?2)为什么适合于内存的数据结构不一定适合于磁盘?
3)如何减少磁盘的访问次数?
4)如何兼顾小文件和大文件?
三 文件的存取方式
主要有顺序存取和随机存取两种方式。顺序存取指的是对文件中的数据按照逻辑顺序进行读/写的存取方式。随机存取指的是对文件中的数据按任意顺序进行读写的存取方式。
四 文件结构、存取方式与存储介质的关系
6.3 文件目录
一 几个基本概念
1 文件控制块
文件控制块是操作系统为了管理文件而设置的数据结构,存放了为管理文件所需的所有相关信息(文件属性)。也称为文件说明或者文件目录项。文件控制块是文件存在的标志。
文件控制块的内容:
(1)基本信息:文件的名字、地址(起始的物理块号)、长度、结构(逻辑结构、物理结构)、类型等等。
(2)存取控制信息:文件属主、存取权限或者口令。
(3)使用信息:共享计数,文件的建立、修改日期等等。
2 文件目录
把所有的FCB组织在一起,就构成了文件目录。也就是所有文件控制块的集合。
3 目录项
构成文件目录的项目,其实就是FCB
4 目录文件
为了实现对文件目录的管理,通常将文件目录以文件的形式保存在外存,这个文件就叫做目录文件。
目录主要是为了系统实现“按名访问”而引入的。查目录是文件系统最频繁的操作,因此目录的合理组织很重要。
二 目录结构
1 单级目录结构
为所有的文件建立一个目录文件(组成一个线性表)。
优点就是简单并且容易实现。缺点就是:
- 限制了用户对文件的命名(容易出现命名冲突)
- 顺序检索文件的时候,平均检索时间很长
- 不利于对文件的共享
2 二级目录结构
目录分成两级:一级称为主文件目录,给出用户名,用户子目录所在的位置。二级称为用户文件目录(又称用户子目录),给出该用户所有文件的FCB。
特点是在一定程度上解决了文件重名和文件共享问题。(用户名|文件名),并且查找时间缩短了。
3 多级目录结构(树型目录)
对二级目录简单扩充可得三级或三级以上的多级目录结构,
即允许每一级目录中的FCB要么指向文件,要么指向下一级子目录。这是当今主流OS普遍采用的目录结构
优点:
√层次结构清晰,便于管理和保护;
√有利于文件分类;
√能较好地避免重名问题;
√提高了文件检索速度;
√有利于访问权限的控制。
三 文件目录检索
访问文件的时候,必须先确定读写文件的地址,分为以下两步:
- 目录检索:根据文件名,查目录,确定文件的起始地址。
- 文件寻址:确定所需要访问的文件内容的起始地址。
1 目录检索
文件的“按名存取“是通过查目录实现的,系统按照文件的路径名检索,基本的目录检索技术主要有:线性检索法和hash方法。
为了加快文件检索的速度,许多系统引入当前目录(工作目录)和相对路径名等等。
2 文件寻址
根据FCB中记录的文件物理地址等信息,求出文件的任意记录或者字节在存取介质上的地址。
√文件寻址与文件的物理结构和逻辑结构以及设备的物理特性有关√文件的内容是以块为单位存储的
√在存取文件时,对于记录式文件,是以逻辑记录为单位提出存取要求的,因此,存储介质上的物理块长度与逻辑记录的长度是否匹配直接影响到对文件的寻址。
四 文件目录的实现
1 把文件说明信息都放在目录项中
文件说明信息就是FCB。当查找文件的时候,依次把存放目录的物理块装入内存,逐一比较文件名,直到找到为止。
例如,文件说明占128B,每个块占512B,那么每块就可以存放4个目录项。100个文件就需要25个物理块。
假设目录文件占用的磁盘数量是N个,则要找到一个目录项,平均需要读入多少个磁盘块?
答:每个物理块被读入的可能性都是1/N。所以答案是:
(1/N)*(1+2+3+4+5+……+n)=(N+1)/2。
注:把文件说明信息都放在目录项中的缺点:
- 查找文件缓慢,因为目录项比较大。
- 文件目录平常放在外存,当文件很多的时候,可能占用大量的
物理内存块。
2 将文件说明分成两部分(目录项分解法)
把FCB分成两部分:
- 符号目录项:文件名,文件号(基本目录项编号)
- 基本目录项:除文件名以外的所有文件说明
目录项分解法的典型实现:
(1)基本文件目录+符号文件目录
(2)目录项+l节点
Unix/Linux采用此方法,它把符号目录项称为目录项,而把基本目录项称为l节点(Index node,索引节点),这样,目录项中的文件号就是l节点号。
6.4 空闲存储空间的管理
一 空闲区表
将所有的空闲区记录在一个表中,适合连续文件的外存分配与回收。
二 空闲块链
把所有的空闲块链成一个链。适合离散分配。
(1)每个空闲块中指出下一个空闲块的块号。
(2)采用多个空闲块构成的链表存放空闲块号。
三、位图
√用一串二进制位反映磁盘空间的分配情况,每个物理块对应1位,已分配的
物理块为1,否则为O
√申请物理块时,可以在位图中查找为0的位,返回对应的物理块号√归还时,将对应位设置为0
√描述能力强,适合各种物理结构
6.5 文件的使用
一 文件的使用
为了方便用户使用文件,文件系统提供对文件的各种操作。使用的形式包括系统调用或者命令。
- 提供设置和修改用户对文件访问权限的操作。
- 提供建立、修改、删除目录的操作
- 提供文件共享、设置访问路径的操作
- 提供创建、打开、读、写、关闭、删除等操作
1 文件操作的基本形式
- 为什么要打开/关闭文件。
open:把文件说明信息装入内存,以便以后的快速访问。
(1)根据指定的文件路径名,查目录,找到相应的文件目录项。检查权限。
(2)将文件说明信息装入内存。
(3)分配一个id(文件描述符)。后面通过该id实施对文件的操作。
Close:
- 释放文件说明信息所占用的内存空间。
- 把文件缓冲区中已修改的内容写回文件。
二 文件共享
文件共享指的是一个文件被多个用户或者进程使用。共享的目的是:节省时间和存储空间,减少用户工作量。同时进程之间可以通过文件交换信息。
1 普通的文件共享方法
- 按照路径名访问共享文件。
实现起来比较简单,不需要建立另外的目录项。但是路径名可
能比较长,检索起来也比较慢。
- 链接法
在相应的目录项之间建立连接。即一个目录项中含有指向另外
一个目录项的指针。
实现方法:
在目录项中设置一个“链接属性”,
表示目录项中的“物理地址”是指向另一目录项的指针。同时,在共享文件的目录项中包含“用户计数”。
(3)基本文件目录BFD
√整个文件系统有1个基本文件目录BFD:
每个文件(及目录)有1个目录项,包含系统赋予的唯一标识符ID(整数)以及其他的文件说明信息
每个目录有1个符号文件目录SFD:除了ID =0,1,2外,
每个目录项仅包含文件名和ID
√系统把ID = 0,1,2的目录项分别作为BFD、FFD、MFD的标识符√共享方法:
若一个用户想共享另一用户的文件,只需在自己的目录文件中增加一个目录项,填上自己起的文件名和该共享文件的唯一ID即可。如ID=6的文件。
2 基于I节点的文件共享(Unix采用)
- 硬链接
多个目录项指向同一个I结点。引入链接计数count,表示链接
到本I节点的文件数。
- 符号链接(软链接)
文件内容是所链接文件的路径名。
三 文件存取控制
1 存取控制矩阵
给出每个用户对每个文件的访问权限。一维是所有用户,另一维是所有文件,对应的矩阵元素是用户对文件的访问权限。例如,访问操作分为:
√读操作(r)
√写操作(w)
√执行操作(x)
√不能执行任何操作(-)当用户和文件较多时,很庞大。
2 存储控制表
每个文件一张ACL,将用户分类,规定每类用户的访问权限。例如,Unix/Linux将用户分类为:
√文件主(owner)
√文件主的同组用户(group)
√其他用户(other)
- 存储权限表(CL)
每个用户一张CL,规定对每个文件的访问权限。