概述
文件特性:可长期存储;可在进程间共享;有特定结构。
文件系统提供对文件操作的功能接口:创建、删除、打开、关闭、读和写。
域(field):基本数据单元,一个域包含一个值。
记录(record):一组相关域的集合。
文件(file):一组相似记录的集合,可通过名字访问。
数据库(database):一组相关数据的集合,数据元素之间存在明确的联系。
使用文件时需要的典型操作:
retrieve_all
:检索文件全部记录。
retrieve_one
:检索一条记录。
retrieve_next
:检索当前访问记录后面的一条记录。
retrieve_previous
:检索当前访问记录前面的一条记录。
insert_one
:在文件中插入一条新记录。
delete_one
:删除一条已存在的记录。
update_one
:检索一条记录,更新该记录内容并写回到文件。
retrieve_few
:检索部分记录。
文件管理系统(FMS):为使用文件的用户和应用程序提供服务,是访问文件的唯一方式。
FMS 目标:
- 满足数据管理的要求和用户需求。(最小需求如下)
- 每个用户应能创建、删除、修改和读取文件。
- 受控访问其他用户文件。
- 控制允许对用户文件进行哪种类型的访问。
- 能在文件之间移动数据。
- 备份文件和恢复文件。
- 通过名字访问文件。
- 最大限度保证文件中数据有效。
- 优化性能。
- 提供 I/O 支持。
- 减少数据损坏的可能性。
- 为进程提供标准 I/O 接口例程集。
- 为多个用户提供 I/O 支持。
文件系统软件架构:
设备驱动:负责启动设备 I/O 操作,处理 I/O 请求的完成。
基本文件系统:处理外存和内存缓冲区中数据的位置。
基本I/O管理程序:负责所有文件I/O的初始化和终止。
逻辑I/O:使用户和应用程序能访问记录。
文件组织和访问
文件组织原则:快速访问、维护简单、易于修改、可靠性和节约存储空间。
基本组织方式:
- 堆:数据按照到达的顺序收集,每条记录由一串数据组成。最简单。
- 顺序文件:每条记录使用一种固定格式,其中有一个关键域唯一标识每条记录。最常用。
- 索引顺序文件:在顺序文件的基础上,增加了支持随机访问的文件索引和溢出(overflow)文件。索引文件中每条记录由两个部分组成:关键域和指向主文件的指针。查找文件时先查找索引文件中关键域,能匹配直接根据对应的指针定位到主文件对应记录位置;不能则根据索引文件找到距离目前位置最近的主文件位置。
- 索引文件:访问文件只能通过索引。增加新记录时需要更新所有的索引。
- 直接文件或散列文件:直接访问磁盘中任何一个地址已知的块。
B 树例子:
文件目录
文件目录包含关于文件的信息,其自身也是一个文件。
可在目录上执行的操作:
- 查找:找到文件对应目录项。
- 创建文件:新增一个目录项。
- 删除文件:删除对应目录项。
- 显示目录:查看目录内容。
- 修改目录:修改目录项内容。
路径名:从根目录到某个特定文件经过的所有目录名加上该文件名构成该文件的路径名。
工作目录:当前程序所在的目录路径。
文件共享
访问权限:无、知晓存在、执行、读、追加、更新、改变保护权限和删除文件。
用户划分:特定用户、用户组和全部用户。
记录组块
组块组织方式:
- 定长组块:定长的记录保存在一个块中。
- 变长跨越式组块:变长记录可以横跨多个块存储(存在一个块保存多个文件的部分内容的情况)。
- 变长非跨越式组块:变长记录不能横跨多个块存储(不存在一个块保存多个文件的部分内容的情况)。
外存管理(辅存)
文件分配
- 预分配:在发出创建文件的请求时,声明该文件的最大尺寸。
- 动态分配:在需要时才给文件分配空间。
文件分区
- 大小可变的大规模连续分区:能提供较好的性能。
- 块:提供更多的灵活性。
连续分区可采用的策略
- 首次适配
- 最佳适配
- 最近适配:选择与前面分配给该文件的组块最近的组。为提高局部性。
文件分配方法
- 连续分配:创建文件时,分配一组连续的块。存在外部碎片。
- 链式分配:基于单个块,链中的每块包含指向下一块的指针。局部性原理不适用。
- 索引分配:每个文件在文件分配表中都有一个一级索引,分配给该文件的每个分区自索引中都有一个表项。可克服前两种分配方式中存在的问题之一。如图
空闲空间的管理方式
- 位表:使用一个向量,每一位对应磁盘中每一块,0 表示空闲,1 表示已使用。较容易找到连续空闲块、占用空间较小。
- 链接空闲区:空闲区通过指向下一个空闲区的指针和记录下一个空闲区的长度链接成串。会出现碎片。
- 索引:将空闲区看作文件,使用索引。
- 空闲块列表:每个块指定一个序号,所有空闲块的序号保存在磁盘的一个保留区中。
卷是逻辑磁盘。一组在外存上可寻址的扇区集合,OS 或者应用程序用来存储数据。物理存储设备上不需要连续。
参考
[1] William Stallings, 操作系统——精髓与设计原理(8th), 2017.