第六章-文件管理
1.文件
(1)概念和命名
①概念
- 文件是由文件名字标识的一组信息的集合。
- 文件是一个抽象机制,提供了把文件保存在磁盘上,用户不必了解信息存储细节且便于读取的方法,这一抽象机制中最重要的是文件命名。
②命名
文件名是字母或数字组成的字母数字串,它的格式和长度因系统而异。
(2)类型和属性
①类型
可按各种方法进行分类:
- 按用途分
- 按信息流向分
- 按保护级别分
- 按存放时限分
- 按设备类型分
- 按文件的逻辑结构或物理结构分
- 按文件内容是否用于阅读理解、编辑分
1)按用途分
- 系统文件
- 库文件
- 用户文件
2)按信息流向分
- 输入文件
- 输出文件
- 输入输出文件
3)按保护级别分
- 只读文件
- 读写文件
- 不保护文件
4)按存放时限分
- 临时文件
- 永久文件
- 档案文件
5)按设备类型分
- 磁盘文件
- 磁带文件
- 软盘文件
6)按文件的逻辑结构或物理结构分
- UNIX操作系统支持不同类型文件
- 普通文件
- 目录文件
- 由文件目录组成的系统文件
- 特殊文件:设备文件
- 块设备文件
- 用于磁盘、光盘或磁带等块设备的I/O操作
- 字符设备文件
- 用于终端、打印机等字符设备的I/O操作
- 块设备文件
7)按文件内容是否用于阅读理解、编辑分
- ASCII文件(可以采用文本编辑器打开阅读和编辑)
- 二进制文件(二进制文件采用文本编辑器打开以后显示乱码,如可执行文件以及库文件为常见的二进制文件)
②属性
文件属性用于文件的管理控制和安全保护,文件属性包括:
- 文件基本属性
- 文件类型属性
- 文件保护属性
- 文件管理属性
- 文件控制属性
1)文件基本属性
- 文件名字
- 扩展名
- 文件属主ID
- 文件所属组ID
2)文件类型属性
- 普通文件
- 目录文件
- 系统文件
- 隐式文件
- 设备文件
- ASCII码文件
- 二进制文件
3)文件保护属性
- 可读
- 可写
- 可执行
- 可更新
- 可删除
4)文件管理属性
- 文件创建时间
- 最后存取时间
- 最后修改时间
5)文件控制属性
- 文件的逻辑结构信息
- 记录键
- 记录类型
- 记录个数
- 记录长度
- 成组因子数
- 文件物理结构信息
- 文件的物理结构信息
- 文件所在设备名
- 物理设备类型
- 记录存放的盘块号或文件信息首盘块号或文件索引表的位置等
(3)存取方法
①文件存储单位
磁盘等文件存储设备属于典型的块设备,块设备I/O以物理块为单位执行,文件内容以物理块(物理记录)为单位存取。
不同块设备的物理块大小可能并不相同。
文件系统定义独立于任何物理块的尺寸统一的逻辑块(逻辑记录)。
物理块大小与逻辑块大小通常并不一致,逻辑块(逻辑记录)大小通常设定为物理块尺寸的整数倍,即一个逻辑块占用若干个物理位置相邻的物理块。读写一个逻辑块意味着访问若干个物理位置相邻的物理块。
如果逻辑块小于物理块,理块中分离出所需逻辑块。执行写操作时,需要定位逻辑块写入到物理块中的位置。
②文件访问方式
- 顺序访问
- 随机访问(直接访问)
- 索引访问
1)顺序访问
顺序访问从文件开头或者当前位置顺序读取文件的字节或记录,不能跳过某一些内容,文件后面的内容不能先于文件前面部分的内容读取出来。写入与此类似。
后面的访问起点依赖于前面访问后确定的文件指针位置。
需要顺序访问的情况
- 缺乏索引的文件通常只能顺序访问
- 对存储介质上的信息不提供定位参数(物理地址)的存储设备也只能顺序访问
例如:
- 磁带上的文件适合顺序访问
- 磁盘上的链接文件也适合顺序访问
2)随机访问(直接访问)
能够以任意次序读取其中字节或记录的文件称为随机存取文件或直接访问文件。
直接访问文件可以立即访问需要的那部分信息,而不必涉及不需要的信息部分。
例如,航班订票程序必须能够直接存取乘客预订的航班记录,而不必先读出其它航班的成千上万个记录。
数据库系统使用的文件往往属于随机存取文件。磁盘文件可以直接访问,因为磁盘访问可以指定物理块地址。
3)索引访问
索引访问建立在直接访问方式上。
索引访问需要为文件创建索引,这样的文件称为索引文件。
索引类似文件内容目录,包含指向各内容块的指针。
查找索引文件时,首先查找索引块,获得目标内容块的指针,再从目标内容块中找到所需记录。
(4)操作
①分类
操作系统提供的文件操作系统调用主要有:
- 创建文件(create)
- 打开文件(open)
- 写文件(write)
- 读文件(read)
- 调整读写指针(seek)
- 关闭文件(close)
- 删除文件(delete)
②打开文件表(外存目录的缓冲)
系统为每个用户进程建立一张内存打开文件表,称为活动文件表。
打开文件时,把该文件的目录项复制到打开文件表中。
当不再使用该文件时,使用“关闭”操作切断用户进程与该文件目录项的联系。
UNIX/Linux设置了两种打开文件表:
- 用户打开文件表
- 系统打开文件表
1)用户打开文件表
进程PCB结构中的files_struct实现用户打开文件表或文件描述符表。
表项的序号是文件描述符fd,每项登记了系统打开文件表的入口指针fp。
通过此系统打开文件表项链接到打开文件的活动inode节点。
2)系统打开文件表
为跟踪多个用户进程共享文件、父子进程共享文件情况,系统设置系统打开文件表,其数据结构为file_struct,内存开辟系统打开文件表区域。
打开文件时,通过此表项把用户打开文件表的表项与文件活动inode链接起来,实现数据访问和信息共享。
③系统调用
1)创建文件(create系统调用)
创建不包含任何数据的文件。
在目录中为新文件创建目录条目,设置文件属性信息,如文件名等。
2)打开文件(open系统调用)
在使用文件之前,必须先打开文件。
open调用将文件属性和磁盘地址表装入内存,便于后续操作访问。
3)写文件(write系统调用)
write调用针对已经打开的文件执行写操作。
一般从当前位置开始写入信息。
如果当前位置是文件末尾,则文件长度增加。
如果当前位置在文件中间,则现有数据被覆盖。
4)读文件(read系统调用)
read调用针对已经打开的文件执行读操作。
读出的数据一般来自文件当前位置。
调用者需要指定读取的数据量和数据存放的缓冲区。
5)调整读写指针(seek系统调用)
seek调用调整读写指针的位置。
6)关闭文件(close系统调用)
文件访问结束时,关闭文件以释放文件属性及磁盘地址等不再需要的管理数据所占内存空间,同时写入文件的最后一块。
7)删除文件(delete系统调用)
删除不需要的文件,释放其所占外存空间。
8)内存映射文件
也称映射文件I/O(Memory Mapped File,MMF)
- 实现把磁盘访问转变为内存访问的手段
- 通过结合虚存管理和文件管理技术首创的另一种文件访问方法,可解决文件读写操作效率低下问题。
1)原理
- 把进程需要访问的文件映射到其虚地址空间中,于是,便可通过读写相应虚地址进行文件访问
- 内存映射文件是按照文件名来访问的
- 多个进程可同时把同一个文件映射到各自的虚地址空间中,且虚地址不必相同
- 随着进程的运行,被引用的映射文件由存储管理程序装入内存,多个进程读写虚存的映射文件区,就可以共享文件信息
2)借助于文件系统的文件访问操作
通过文件系统访问文件时,进程调用文件系统功能,在执行读写前,分配好存放文件内容的内存空间。
读文件时,先执行读系统调用,将文件从外存读入内存,然后从内存读取内容。
写文件时,先将内容写入内存,然后执行写系统调用,将文件从内存写入外存。
通过内存映射文件系统访问文件时,进程调用虚拟内存管理功能,在执行读操作前,分配给文件虚拟内存空间。
以指令形式读文件内容所属虚拟内存区时,发生缺页中断,系统为文件分配物理内存,启动设备I/O操作,装入文件内容到内存。读文件的操作隐含执行。
以指令形式修改文件内容所属虚拟内存区时,该虚拟内存区已映射到物理内存区,所做修改会改变物理内存中的文件内容,根据建立内存映射文件时的参数,可以决定是否将内存中的内容同步保存到磁盘文件中。
(5)结构
- 逻辑结构
- 物理结构
①逻辑结构
1)概念
文件的逻辑结构是从用户角度看到的反映一定逻辑意义的文件内容组成单位及各部分之间的关系。
2)分类
- 流式文件(无结构文件)
- 记录式文件(有结构文件)
流式文件(无结构文件):
流式文件将文件内容看做字节流,即整个文件由一个字节流组成。
这种看法忽略了可能存在的文件内在的逻辑结构,实际上将文件看成是无结构的。
大多数现代操作系统对用户仅仅提供流式文件。
记录式文件(有结构文件):
记录式文件是一种有结构的文件,包含若干逻辑记录。
逻辑记录是文件中按信息的逻辑含意划分的信息单位。
单位职工工资文件、学生信息文件、储户信息文件等都是有结构的文件,属于记录式文件。
记录式文件是数据库管理系统支持的基本文件类型。
②物理结构
1)概念
文件的物理结构是指文件内容及其各部分之间逻辑关系在物理存储空间中的存储和实现方法。
这时文件看作物理文件,是相关物理块的集合。
2)分类
- 顺序文件(连续文件)
- 链接文件(串联文件)
- 直接文件(哈希文件)
- 索引文件
顺序文件(连续文件):
顺序文件是逻辑记录顺序和物理记录顺序完全一致的文件。
FCB中保存第一个物理块的地址和文件信息块的总块数。
磁带文件、打印机等都属于顺序文件。
顺序文件顺序存取记录时速度较快。
但是增、删、改文件需要大量移动记录。
链接文件(串联文件):
当文件存储的物理记录顺序与逻辑记录顺序不一致时,采用指针表示文件中各个逻辑记录之间的顺序关系,形成链表结构的文件即链接文件。
第一块文件信息的物理地址存放在文件目录中。
每一块的指针指出文件下一个物理块的位置。链接文件便于增、删、改,但是仅适宜于顺序存取,不便于随机存取。
直接文件(哈希文件):
直接文件是以记录关键字换算其存储地址,实现内容存取的文件。
直接文件在记录关键字与其存储地址之间利用散列法或杂凑法以关键字为自变量,以物理地址为因变量构造映射函数(哈希函数)。
需要解决可能的映射地址冲突。
索引文件:
索引文件在存储逻辑记录的同时,将记录关键字与其存储地址的对应关系表即索引表一并存储,形成索引文件。
FCB存放索引表或其地址,访问索引表即可存取文件。
(6)共享
①概念
指不同用户(进程)静态或动态地共同使用同一个文件。
②分类
- 静态共享
- 动态共享
- 符号链接共享
1)静态共享
静态共享也称为文件链接,允许多个文件拥有相同的索引节点号,这些文件的目录项指向同一个索引节点,即同一个文件。
实际上静态共享就是一个文件拥有多个别名。
表示静态共享的链接关系独立于进程而存在,因此称为静态的。
2)动态共享
文件动态共享是指系统中不同进程并发访问同一文件。
文件动态共享关系随着进程的存在而存在,一旦进程消亡,其动态共享关系自动消失。
3)符号链接共享
符号链接共享又称软链接,是只包含文件路径名而不指向inode的文件。
删去符号链接,文件实体内容依然存在。
将文件名和自身的inode链接起来,称为硬链接。
4)硬链接和软链接区别
本质不同:
硬链接:同一个文件,多个名称。
软链接:不同的文件。
跨分区:
硬链接:不支持跨分区。
软链接:支持跨分区。
目录:
硬链接:不支持对目录创建。
软链接:支持对目录创建。
相互关系:
硬链接:删除某一个硬链接,另一个硬链接不影响使用。
软链接:原始文件和软链接有依赖关系,原始文件删了,软链接就失效了。
inode编号:
硬链接:inode编号是相同的。
软链接:inode编号不同。
链接数:
硬链接:删除一个硬链接,硬链接的链接数会有变化。
软链接:删除一个软链接,链接数不会有变化,删除的相当于是一个文件(或快捷方式)。
相对路径:原始文件路径:
硬链接:硬链接的相对路径,是相对的当前工作目录的相对路径。
软链接:软链接的原始文件路径是,相对的软链接的相对路径,而不是相对当前工作目录。
文件类型:
硬链接:硬链接的文件类型是,原来是什么就是什么,例如:原来是普通文件,还是普通文件。
软链接:软链接的文件类型是L。
命令的实现不一样:
硬链接:ln
软链接:ln -s
2.目录
文件目录是文件系统实现“按名存取”文件的重要手段。
目录本身也以文件形式保存在外存上,需要查找文件时调入内存。
(1)信息
①目录项信息
目录提供了访问文件的入口,每个文件在目录表中都有一个目录项。
目录项用于记载文件的属性信息,如名称、位置、大小和类型等。
目录项也称为文件控制块(FCB)。
②FCB包括的信息
- 文件标识和控制信息
- 文件逻辑结构信息
- 文件的物理结构信息
- 文件使用信息
- 文件管理信息
1)文件标识和控制信息
如文件名、用户名、文件主存取权限、授权者存取权限、文件口令、文件类型等。
2)文件逻辑结构信息
如记录类型、记录个数、记录长度等。
3)文件的物理结构信息
如文件所在设备名、文件物理结构类型,记录在外存的盘块号或文件信息首块盘块号,文件索引的位置等。
4)文件使用信息
共享文件的进程数、文件被修改情况、文件最大长度和当前大小等。
5)文件管理信息
文件建立日期、最近修改日期、最近访问日期、文件保留期限、记帐信息等。
(2)结构
①目录文件
全部目录项也可构成文件,称为目录文件。
目录文件非空,至少包含当前目录项和父目录项。
②文件目录的作用
文件目录的作用是将逻辑名转换为物理名,即将文件名转换为文件的磁盘地址。
③目录项结构
1)索引节点型目录项结构
目录结构影响磁盘I/O数据量以及缓冲内存消耗量,从而影响目录访问效率。
2)导致目录访问低效的原因
在找到文件前,加载了大量与查找文件无关的文件属性信息。
3)目录访问低效的解决方法
将查找所需信息与无关查找的属性信息分开存放,在文件查找过程中,仅加载查找所需信息;
找到文件后,再加载特定于该文件的属性信息。
④索引节点
1)概念
索引节点是一种目录项结构,该结构将目录中的文件名和其余属性信息分离存放,以便分开加载。
文件名以外的属性信息存放在称为索引节点(inode)的数据结构中。
索引节点与文件一一对应,每个索引节点都有唯一的编号,称为索引节点号。
在目录项中存放文件名和索引节点号,而非索引节点内容。
根据索引节点号可以检索对应索引节点中的文件属性信息。
由文件名和索引节点号构成的目录项称为基本目录项,其结构如下:
文件名 | 索引节点号 |
---|
索引节点集中存放在磁盘上的索引节点区(inode区)。
2)索引节点目录项的查找
检索目录项时,先访问基本目录项表,找到目标文件的索引节点号,然后从外存装入该索引节点的文件属性内容到内存,即可存取文件内容。
3)索引节点数据结构
每个文件都有一个外存索引节点与之对应。
外存索引节点部分内容如下:
4)Linux索引节点型目录结构示意图
(3)层次
①一级目录
一级目录在一个目录中包含所有的文件,该目录称为根目录。
一级目录缺点
一级目录不方便按用户、按文件类别管理文件,文件重名问题无法解决。
②层次目录系统(多级目录、树型目录)
层次目录系统允许用户创建多级目录,各级目录形成树型结构,也称为目录树。
文件可以分门别类存放在各级目录下。
便于分组查找和控制文件访问权限。
③层次目录实例
④文件的定位
从根目录到文件的路径唯一确定存储设备上的任意文件。
访问文件时给出文件路径名以指定要访问的文件。
1)路径名
是表示文件或目录位置的以斜线隔开的各级子目录名及文件名。
2)目录路径名
由各级目录名组成的路径串称为目录路径名。目录路径名的末端为目录名。
3)文件路径名
目录路径和文件名组成文件路径名。
4)绝对路径名
从根目录到文件的路径串称为绝对路径名。
5)相对路径名
不以根开始的路径串称为相对路径名。
6)当前目录或工作目录
当前正在其中工作的目录称为当前目录或工作目录。
7)./ 和 ../
每个目录创建时都自动包含2个特殊目录项:
.
项指当前目录,指出目录自身的inode入口
..
项指其父目录,指出其父目录的inode入口
根目录自身和其父目录都指向同一个inode。
(4)操作
- 创建目录
- 打开目录
- 链接目录
- 关闭目录
- 删除目录
①创建目录
创建目录产生一个包含目录项.
和..
的空目录。
②打开目录
在读取目录中的文件名之前,先打开目录。
③链接目录
建立已存在文件到一个路径名的链接,使多个目录中出现同一个文件。
④关闭目录
读目录结束后,关闭目录以释放目录表所占内存资源。
⑤删除目录
链接目录的反操作。
指定文件的索引节点计数器减1,若为0,则删除该文件。
否则,只删除指定路径名的链接。
3.文件空间管理
(1)文件存储方法
指文件的物理存储结构,有内容的磁盘块的组织方法。
- 连续存储(连续分配)
- 链接存储(链接分配)
- 索引存储(索引分配)
- 多级索引存储(多级索引分配)
①连续存储(连续分配)
连续存储将文件存放在外存连续存储区中,即为磁盘文件分配一组连续的块,文件内容的逻辑顺序与物理存储顺序一致。
通过分配连续块建立的文件称为连续文件。
随着文件的创建和删除,磁盘连续分区被分配和回收,整个磁盘空间被分割为文件区和空闲区交替出现的格局;系统需要登记各个空闲区的位置和大小以供分配使用。
文件区的位置和大小需要登记在目录中以供文件查找访问。
若此时文件A要拓展,需要再增加一个磁盘块(总共需要连续的4个磁盘块)。由于采用连续结构,因此文件A占用的磁盘块必须是连续的,因此只能将文件A全部“迁移”到绿色区域。
结论:物理上采用连续分配的文件不方便拓展。
总结
逻辑地址(逻辑块号,块内地址)→ 物理地址(物理块号,块内地址)
- 检查逻辑块号是否合法:逻辑块号 < 长度
- 物理块号 = 起始块号 + 逻辑块号
连续分配的文件在顺序读/写时速度最快。
物理上采用连续分配:存储空间利用率低,会产生难以利用的磁盘碎片,虽可以用紧凑来处理碎片,但需要耗费很大的时间代价;不方便拓展。
优点:支持顺序访问和直接访问(即随机访问);连续分配的文件在顺序访问时速度最快。
缺点:不方便文件拓展;存储空间利用率低,会产生磁盘碎片。
②链接存储(链接分配)
链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。
分为隐式链接和显式链接两种。
1)隐式链接
总结
隐式链接:除文件的最后一个盘块之外,每个盘块中都存有指向下一个盘块的指针;文件目录包括文件第一块的指针和最后一块的指针
- 优点:很方便文件拓展,不会有碎片问题,外存利用率高。
- 缺点:只支持顺序访问,不支持随机访问,查找效率低,指向下一个盘块的指针也需要耗费少量的存储空间。
2)显示链接
总结
把用于链接文件各物理块的指针显式地存放在一张表中。即,文件分配表(FAT,File Allocation Table) 一个磁盘仅设置一张FAT:
- 开机时,将FAT读入内存并常驻内存。
- FAT 的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。
优点:采用链式分配(显式链接)方式的文件,支持顺序访问,也支持随机访问(想访问 i 号逻辑块时,并不需要依次访问之前的 0 ~ i - 1号逻辑块),由于块号转换的过程不需要访问磁盘,因此相比于隐式链接来说,访问效率高很多,显式链接也不会产生外部碎片,也可以很方便地对文件进行拓展,外存利用率高。
缺点:文件分配表需要占用一定的存储空间。
③索引存储(索引分配)
访问文件时,从目录项出发获取索引表,根据索引表记载的文件块地址即可访问文件各部分的内容。
带有索引表的文件称为索引文件。
索引表分为无键索引和有键索引。
1)无键索引
2)有键索引
3)稠密索引和稀疏索引
索引项分为两类:一类是稠密索引,即对每个数据记录建立一个索引项;另一类是稀疏索引,对每一组数据记录建立一个索引项。
4)索引顺序文件
为一组记录建立一个表项构成的索引文件称为索引顺序文件。
5)总结
优点:便于直接存取,便于文件的增、删、改。
缺点:增加了索引表的空间开销和查找时间。
④多级索引存储(多级索引分配)
1)多个索引块
2)多层索引
3)混合索引
(2)文件空间管理
常用方法:
- 位示图
- 空闲区表
- 空闲链表
- 成组空闲块链(成组链接法)
①位示图
位示图:每个二进制位对应一个盘块,位示图一般用连续的“字”来表示,字中的每一位对应一个盘块。
可以用(字号,位号)对应一个盘块号,当然有的题目中也描述为(行号,列号)。
(字号, 位号) = (i, j) 的二进制位对应的 盘块号 b = ni + j。
b号盘块对应的字号 i = b / n,位号 j = b % n
如何分配:若文件需要K个块,
- 顺序扫描位示图,找到K个相邻或不相邻的“0”;
- 根据字号、位号算出对应的盘块号,将相应盘块分配给文件;
- 将相应位设置为“1”。
如何回收:
- 根据回收的盘块号计算出对应的字号、位号;
- 将相应二进制位设为“0”。
②空闲区表
适用于 “连续分配方式”。
如何分配磁盘块:与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间;同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间
如何回收磁盘块:需要注意表项的合并问题
- 回收区的前后都没有相邻空闲区;
- 回收区的前后都是空闲区;
- 回收区前面是空闲区;
- 回收区后面是空闲区。
③空闲链表
- 空闲盘块链
- 空闲盘区链
1)空闲盘块链
2)空闲盘区链
④成组空闲块链(成组链接法)
适用于大型文件系统,UNIX系统中采用了成组链接法对磁盘空闲块进行管理。
文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存,并且要保证内存与外存中的“超级块”数据一致。
如何分配?Eg:需要100个空闲块
- 检查第一个分组的块数是否足够。100 = 100,是足够的。
- 分配第一个分组中的100个空闲块。但是由于300号块内存放了再下一组的信息,因此300号块的数据需要复制到超级块中。
如何回收?Eg:假设每个分组最多为100个空闲块,此时第一个分组已有100个块,还要再回收一块
需要将超级块中的数据复制到新回收的块中,并修改超级块的内容,让新回收的块成为第一个分组。
4.虚拟文件系统
(1)原理
虚拟文件系统(VFS)定义了一个代表不特定文件系统通用特征和行为的文件模型。
VFS抽象出所有文件系统的公共部分,形成一个简单、统一的抽象文件系统接口提供给用户。
用户仅通过抽象文件系统接口层表达文件操作意图,文件操作的具体执行则由底层的实际文件系统来完成。
从抽象文件系统到某一具体文件系统的转换工作由映射模块完成。
(2)结构
VFS由若干对象组成,每个对象包含数据和函数指针。
这些函数指针指向操作这些数据的文件系统的实现函数。
- 超级块对象
- 索引节点对象
- 目录项对象
- 文件对象
①超级块对象
代表一个特定的已挂载的文件系统。
超级块对象对应位于磁盘上特定扇区的文件系统超级块或文件系统控制块。
②索引节点对象
代表一个特定的文件。
索引节点对象包含文件属性信息。
③目录项对象
代表一个特定的目录项。
目录项对象包括一个指向索引节点的指针和超级块,还包括一个指向父目录的指针和指向子目录的指针。
④文件对象
代表一个与进程相关的打开的文件。
文件对象包含的操作函数有open、read、write等。