概述
文件的定义:文件就是一组有意义的信息/数据的集合
文件的属性:文件名、标识符、类型、位置、大小、时间信息、保护信息
文件内部应该如何被组织起来:文件的逻辑结构
文件之间应该如何被组织起来:目录结构
操作系统应该向上层提供哪些功能:create、delete、open、close、read、write系统调用
文件应如何存放在外存中:文件的物理结构
操作系统如何管理外存中的空闲块:存储空间的管理
操作系统需要提供的其他文件管理功能:文件共享、文件保护
文件的逻辑结构
文件的逻辑结构可以分为无结构文件和有结构文件
无结构文件
文件内部的数据就是一系列二进制流或字符流组成,又称“流式文件”。由于无结构文件没有明显的结构特性,因此也不用讨论无结构文件的逻辑结构
有结构文件
由一组相似的记录组成,又称“记录式文件”,每条记录由若干个数据项组成
根据各条记录的长度是否相等,又可以分为定长记录和可变长记录两种
有结构文件的的逻辑结构
顺序文件
文件中的记录一个接一个顺序排列,记录可以是定长的,也可以是可变长的。各个记录在物理上可以顺序存储或链式存储
顺序文件又可以按照记录之间的顺序与关键字的关系分为串结构和顺序结构
串结构:记录之间的顺序与关键字无关
顺序结构:记录之间的顺序按关键字顺序排列
在顺序文件中,物理上采用链式存储,无论是定长还是可变长记录,都无法实现随机存取;物理上采用顺序存储的可变长记录,也无法实现随机存取;而物理上采用顺序存储的定长记录,可以实现随机存取,并且若采用顺序结构,由于记录之间是按照关键字顺序排列,还可以快速找到某个关键字对应的记录(串结构只能实现随机存取)。
索引文件
使用索引表,每个记录对应一个表项。各记录不用保持顺序,方便增删记录;索引表本身是定长记录的顺序文件,因此可以快速找到第i个记录对应的索引项(支持随机存取);若索引表按关键字顺序排序,则可以快速检索
索引顺序文件
将记录分组,每组对应一个索引表项,检索记录时先顺序查找索引表,找到分组,再顺序查找分组
文件目录
文件目录的实现
一个文件对应一个文件控制块(FCB),一个FCB就是一个目录项,多个FCB组成文件目录。
对目录的操作:搜索、创建文件、删除文件、显示文件、修改文件
目录结构
单级目录
系统中只有一张目录表,因此不允许文件重名
两级目录
系统有一张主文件目录(记录了用户名与对应用户目录文件目录存放位置),每个用户各自有一张自己的用户文件目录,因此不同用户之间允许文件重名,但是不能对文件进行分类
多级目录
又称为树形目录结构,每个目录下面可以有更低一级的目录,同时在各个目录下面也可以有普通文件,系统根据文件路径找到目标文件(区分“绝对路径”和“相对路径”),但是不方便文件共享
无环图目录
在多级目录结构的基础上,增加了一些指向同一结点的有向边(不同目录可以对应同一个文,实现了文件共享),使整个目录变成一个有向无环图,为对应多个目录的文件设置一个共享计数器,当计数器为0时才真正删除该文件
索引结点
在检索目录时,我们一般通过文件名检索,因此目录表中有很多并不重要的数据项,所以,我们将除了文件名之外的所有信息都放到索引结点中,每个文件对应一个索引结点,而目录表中只包含文件名和索引结点指针,这样就可以减小每个目录项的大小,进而增加每个磁盘块中存放的目录项数量,以减少检索文件时磁盘IO次数
文件的物理结构
在文件的物理结构中,我们要探讨文件数据应该怎样存放在外存中
文件分配方式
连续分配
定义:连续分配方式要求每个文件在磁盘上占有一组连续的块
实现:在文件目录中记录存放的起始块号和长度,用户给出要访问的逻辑块号,操作系统只需要找到该文件对应的FCB,用起始块号 + 逻辑块号 = 物理块号
优点
可以支持顺序访问(要访问逻辑块号k,就必须先访问k前的逻辑块号)和直接访问(直接找到逻辑块号k,不需要访问k之前的逻辑块号)
由于在读取磁盘快时,需要移动磁头,访问的两个磁盘块相隔越远,移动磁头所需的时间就越长,连续分配方式所需要移动磁头的距离是最短的,因此在顺序读写文件时速度最快
缺点
对文件的拓展不方便
磁盘空间利用率低,会产生难以利用的磁盘碎片(可以用紧凑在处理碎片)
链接分配
定义:链接分配采取离散分配的方式,可以为文件分配离散的磁盘块,分为隐式链接和显式链接两种
隐式链接
实现:在文件目录中记录存放的起始块号和结束块号,各个块之间会存储指向下一个块的链接指针,用户给出要访问的逻辑块号,操作系统只需要找到该文件对应的FCB并找到对应的起始块号,将0号逻辑块读入内存,由此知道1号逻辑块存放的物理块,依次类推
优点:方便文件拓展,不会有碎片问题,外存利用率高
缺点:只支持顺序访问,不支持随机访问,查找效率低
显式链接
实现:把用于连接文件各物理块的指针显式存放在一张表中,即文件分配表(FAT),FAT会在开机之后常驻内存,在文件目录中只需记录文件的起始块号,用户给出要访问的逻辑块号,操作系统只需要找到该文件对应的FCB并找到对应的起始块号,然后系统会去内存查询FAT,顺序找到逻辑块号对应的物理块号;由于FAT是存放在内存中的,因此查询过程不需要访问磁盘,相较于隐式链接来说,访问速度快很多
优点:很方便文件拓展,不会有碎片问题,外存利用率高,并且支持随机访问(相对于必须在磁盘上顺序遍历的隐式链接,FAT被看作"支持随机访问"。这是一种实用主义的说法,强调它避免了最昂贵的磁盘顺序遍历);相比于隐式链接来说,地址转换不需要访问磁盘,因此文件的访问效率更高
缺点:文件分配表需要占用一定的内存空间
索引分配
定义:索引分配允许文件离散地分配在各个磁盘中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(类似于页表),存放索引表的磁盘块称为索引块,存放文件数据的磁盘块称为数据块
实现:在文件目录中记录文件的索引块的磁盘块号,用户给出要访问的逻辑块号,操作系统只需要找到该文件对应的FCB并找到对应的索引块的磁盘块号,将索引表读入内存,根据索引表中逻辑块号对应的物理块号就可以直接读取
若文件太大,索引表项太多,可以采取以下三种方法
链接方案
将多个索引块链接起来存放,若索引表很长,就需要将很多个索引表链接起来,要想找到i号索引块,就要依次读入i之前的索引块,查找效率低下
多层索引
建立多级索引(类似于多级页表),k级索引只需要k + 1次读磁盘操作,访问磁盘次数减小,但是即使是小文件,访问一个数据块依然需要k + 1次读磁盘
混合索引
多种索引分配方式的结合;在顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引,还包含两级间接索引;对于小文件来说,一般存放在直接地址索引,访问一个数据块所需的读磁盘次数减少
文件存储管理
存储空间的划分与初始化
操作系统会将磁盘划分为一个一个分区(文件卷),每个分区又会初始化划分为为目录区和文件区,有的系统支持超大型文件,可以支持多个物理磁盘组成一个文件卷
存储空间管理
空闲表法
系统会存储一个空闲表,空闲表中记录了每个连续空闲区的起始盘块号、盘块数,分配时可以采取首次适应、最佳适应、最坏适应等策略
空闲链表法
空闲盘块链
以盘块为单位组成一条空闲链,分配时从链头依次取出空闲块,回收时将空闲块依次插入链尾
空闲盘区链
以盘区为单位组成一条空闲链,分配时可采用首次适应、最佳适应、最坏适应等策略
位示图法
一个二进制对应一个盘块(字号,位号)与盘块号一一对应
成组链接法
UNIX采用的策略,适合大型文件系统
文件的基本操作
create系统调用:分配外存空间,创建目录项
delete系统调用:回收外存空间,删除目录项
open系统调用:将目录项中的信息复制到内存中的打开文件表中,并将打开文件表的索引号返回给用户
close系统调用:将进程打开文件表中的相应表项删除
read系统调用:根据读指针将数据从外存读入内存
write系统调用:根据写指针将数据从内存写入外存
文件共享
基于索引结点的共享方式(硬链接)
在索引结点中会设置一个链接计数变量count,用于表示链接到本索引结点上的用户目录项数,当count > 0时,说明还有用户要使用该文件,暂时不能把文件数据删除,否则会导致空指针,只有当count = 0时,系统才会删除文件
基于符号链的共享方式(软链接)
系统会创建一个link类型的文件,记录了共享文件的存放路径,当用户想要访问共享文件时,系统会根据link文件中保存的路径找到共享文件的位置
文件保护
口令保护
为文件设置一个“口令”,用户请求访问该文件时必须提供“口令”;“口令”一般存放在文件对应的FCB或索引结点中,操作系统会读出正确口令并与用户提供的口令对比,若正确,则允许该用户访问文件
优点:保存口令的空间开销不多,验证口令的时间开销也很小
缺点:正确的“口令”存放在系统内部,不够安全
加密保护
使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密
优点:保密性强,不需要在系统中存储“密码”
缺点:编码、译码(加密、解密)需要花费一定的时间
访问控制
在门个文件的FCB中增加一个访问控制列表(ACL),该表中记录了各个用户可以对该文件执行哪些操作;但是当系统中用户太多,就会导致访问控制列表太长,因此可以设置一个精简的访问列表:列表以“组”为单位,标记各个“组”用户可以对文件执行哪些操作;当用户想要访问文件时,系统会检查该用户所属分组是否有相应的访问权限
文件系统的层次结构

用户接口:文件基本操作
文件目录系统:文件目录
存取控制模块:文件保护
逻辑文件系统与文件信息缓冲区:文件的逻辑结构
物理文件系统:文件的物理结构
辅助分配模块:文件的存储管理
设备管理模块:磁盘管理
文件系统布局
文件系统在外存中的结构
物理格式化:划分扇区,检测坏扇区,并用备用扇区替换坏扇区
逻辑格式化:磁盘分区,完成各分区的文件系统初始化

文件系统在内存中的结构

虚拟文件系统与文件系统的挂载
虚拟文件系统(VFS)
VFS会向上层用户进程提供统一的系统调用接口,屏蔽底层具体文件系统的实现差异
VFS要求下层文件系统必须实现某些规定的函数功能,否则就不被该VFS支持
每当打开一个文件后,VFS会为该文件在主存中创建一个vnode,其中包含了该文件各种各样的信息,这样无论该文件来自于什么样的文件系统,VFS都可以提供一个统一的数据结构来表示文件的信息
vnode中会保存有函数功能指针,指向对应文件的文件系统的函数功能列表,当对该文件操作时,会通过指针找到对应的函数功能列表,通过函数功能列表去执行对应的函数
文件系统的挂载
文件系统安装/装载
在VFS中注册新挂载的文件系统;内存的挂载表包含了每个文件系统的相关信息,包括文件系统类型、容量大小等
新挂载的文件系统要向VFS提供一个函数地址列表
将新文件系统加到挂载点,也就是将新文件系统挂载到某个父目录下