文件,就是一组有意义的信息/数据集合,计算机中存放了各种各样的文件。
文件内部的数据通过文件的逻辑结构联系起来,文件之间通过目录结构联系起来,文件通过物理结构存放在外存中。
操作系统对文件提供create、delete、open、close、read、write等功能,还提供文件共享文件保护等功能。
文件的逻辑结构
要注意逻辑结构和物理结构的区分。
逻辑结构就是在用户看来文件内部的数据是如何组织起来的;物理结构就是在操作系统看来文件的数据是如何存放在外存当中的。
比如数据结构中线性表是一种逻辑结构,用于实现线性表的链表是一种物理结构
无结构文件
文件内部的数据是一系列二进制字符流组成,比如.txt。又称为流式文件,没有明显的结构特性更没有逻辑结构之分
有结构文件
由一组相似的记录组成,每条记录由若干个数据项组成,比如.xls。又称为记录式文件,可分为定长记录和可变长记录
顺序文件
文件中的记录逻辑上顺序排列,记录可以是定长或变长的,物理上可以用顺序存储(物理上相邻,用连续分配实现)或链式存储(物理上不相邻,用链接分配实现)。有两种存储结构,串结构(记录之间的顺序与关键字无关)和顺序结构(记录之间的顺序按关键字顺序排列)。
如果使用链式存储,那么不管是定长记录还是可变长记录都无法实现随机存储。如果使用顺序存储,就有可变长记录和定长记录之分。
- 可变长记录:无法实现随机存取,每次只能从第一个记录依次往后查找。
- 定长记录:可实现随机存储。如果使用串结构,无法快速查找某个关键字对应的记录;如果使用顺序结构,可以通过折半查找等方法快速找到某个关键字对应的记录,但是难以增加或删除记录。
索引文件
可变长记录无法实现随机存储,需要每次都从头遍历,这时候就可以使用索引表。
索引表本身是定长记录的顺序文件,每个记录对应一个表项,关键字作为索引号内容,记录长度和指针,若通过关键顺序排列,则支持快速检索。可以给不同的数据项建立多个索引表。解决了顺序文件不方便增删记录的问题,同时让不定长记录的文件实现了随机存取,但索引表可能占用很多空间。
索引顺序文件
将记录分组,每组对应一个索引表项。检索记录时先顺序查索引表,找到分组,再顺序查找分组。当记录过多时,可建立多级索引表。要会计算平均查找次数。
比如把顺序文件的关键字按照首字母分组,用索引表记录每种首字母的起始位置。当需要查找某个表项时,先看索引表找分组,再在分组中找对应的表项
文件目录
我们打开电脑上的任意一个文件夹,会发现里面可能有文件和子目录。其实目录本身也是一种有结构文件,由一条条记录组成,每条记录对应一个存放在该目录下的文件,一条记录就是一个文件控制块FCB。
FCB的有序集合称为文件目录,一个FCB就是一个文件目录项,包含了文件的基本信息,文件名物理地址逻辑结构物理结构等。
可以对目录进行搜索、创建文件、删除文件、修改文件、显示文件
目录结构分为四种:
- 单级目录结构:一个系统只有一张目录表,不允许文件重名,不适用于多用户操作系统
- 两级目录结构:不同用户的文件可以重名,但不能对文件进行分类
- 多级(树形)目录结构:不同目录下的文件可以重名,可以对文件进行分类,不方便文件共享
- 系统根据文件路径找到目标文件
- 从根目录触发的路径是绝对路径
- 从当前目录出发的路径是相对路径
- 无环图目录结构:在树形目录结构的基础上,增加一些指向同一节点的有向边,使整个目录成为一个有向无环图。为共享节点设置一个共享计数器,计数器为0时才真正删除该节点
FCB最重要的是文件名和物理地址,其他的信息都比较冗余,会占用大量空间。为了优化目录所占空间及访问代价,提出了索引节点的概念。
我们把除了文件名之外的所有信息都放到索引节点中,每个文件对应一个索引节点。目录项中只包含文件名、索引结点指针,因此每个目录项的长度大幅缩小。由于目录项长度减小,因此每个磁盘块可以存放多个目录项,因此检索文件时的磁盘IO次数就减少了很多。
物理结构
物理结构就是操作系统进行文件存储时对空间的的几种分配方式,如何实现逻辑地址和物理地址的转换和二者之间的映射。
操作系统需要对文件和磁盘进行管理,包含对非空闲磁盘块(存放了文件数据的磁盘块)的管理(也就是文件的物理结构/分配方式,文件应该怎样存放在外存中?)和对空闲磁盘块的管理(也就是文件存储空间管理)。
连续分配
物理上的连续分配要求每个文件在磁盘上占有一组连续的块。
- 优点:支持顺序访问和随机访问,顺序访问时读写速度最快
- 缺点:不方便文件拓展,且存储空间利用率低,会产生难以利用的磁盘碎片。可以采用紧凑来处理碎片,但会耗费很大的时间代价
链接分配
采用离散分配的方式,可以为文件分配离散的磁盘块,分为隐式链接和显式链接,默认为隐式链接
- 隐式链接:除文件的最后一个盘块之外,每个盘块中都有指向下一个盘块的指针,文件目录中记录了文件存放的起始块号和结束块号。访问i号逻辑块对应的物理块只能从0号逻辑块开始顺序读取i+1次磁盘
- 优点:方便文件拓展,不会有碎片问题,外存利用率高
- 缺点:只支持顺序访问不支持随机访问,查找效率低,指向下一个盘块的指针需要耗费少量的存储空间
- 显式链接:把用于链接文件的物理块的指针显式地存放在一张表中,即文件分配表FAT,文件目录中只需要记录文件的起始块号。一个磁盘仅设置一张FAT,开机时将FAT读入并常驻内存。从目录项中找到起始块号后查询FAT即可找到i号逻辑块对应的物理块,转换过程无需读磁盘
- 优点:方便文件拓展,不会有碎片问题,支持随机访问。相比于隐式链接,地址转换时无需访问磁盘,文件的访问效率更高
- 缺点:文件分配表需要占用一定的存储空间
索引分配
文件离散地存储在各个磁盘块中,系统为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(类似页表)。索引表存放的磁盘称为索引块,文件数据存放的磁盘称为数据块。
如果文件太大,一个索引块放不下,则可以采用如下几种方案:
- 链接方案:将多个索引块链接起来存放。如果了文件太大就需要非常多的索引块,要访问最后一个逻辑块就要找到最后一个索引块,就要先访问前面所有的索引块,低效。
- 多级索引:建立多层索引,类似多级页表。第一层索引指向第二层索引块。采用k层索引结构且顶级索引表未调入内存,则访问一个数据块只需要k+1次读磁盘操作。但如果是小文件也需要k+1次读磁盘
- 混合索引:多种索引方式的结合,一个文件的顶级索引表中既包含直接索引地址指向数据块,又包含一级间接索引指向单层索引表,还包含二级间接索引指向两层索引表。对于小文件来说,访问数据块需要的读磁盘次数更少
文件存储空间管理
就是对空闲磁盘的管理。我们知道电脑的磁盘是有分区的,其实这就是物理磁盘划分成多个逻辑盘。每个盘都有目录区和文件区,目录区存放文件目录信息FCB,文件区存放文件数据。
有几种文件存储空间管理方法
空闲表法
用一个空闲盘块表来记录磁盘中的空闲盘块:每个表项包含起始盘块号和空闲盘块数。适用于连续分配方式
分配磁盘块时类似于内存管理中的动态分区,用多种算法为文件分配连续的存储空间。
回收磁盘块时需要注意回收区前后有没有空闲区,要注意表项的合并问题。
空闲链表法
分为空闲盘块链(以盘块为单位)和空闲盘区链(以盘区为单位),操作系统保存链头和链尾指针。
- 空闲盘块链:适用于离散分配
分配空间时从链头开始依次摘下k个盘块分配,并修改空闲链的链头指针
回收空间时把回收的盘依次挂到链尾,并修改空闲链的链尾指针 - 空闲盘区链:适用于离散分配和连续分配,为一个文件分配多个盘块时效率更高
分配空间时采用某些算法找到大小符合规则的盘区,也可以把不同盘区分配给同一个文件。记得修改链指针和盘曲大小
回收空间时需要判断是否和空闲盘区相邻,可能需要合并盘区。如果没有相邻则将回收区作为单独的一个空闲盘区挂到链尾
位示图法
每个二进制位对应一个盘块,字号位号与盘块号一一对应。
分配时顺序扫描位示图,找到k个相邻或不相邻的0,根据字号位号算出相应的盘块号,把盘块分配给文件并将相应位置设为1
回收时根据回收的盘块号计算出相应的字号位号并把相应的二进制位设为0
成组链接法
不会考啊啊啊啊,白学了
文件卷的目录区中专门用一个磁盘块作为超级块,当系统启动时需要将超级块读入内存并保证内存与外存的超级块数据一致。具体就是套娃,看图比较直观
分配空间时,先检查第一个分组的块数是否足够,如果足够就分配第一个分组的最后一个空闲块修改空闲盘块数;如果所需空间刚好等于空闲盘块数,就把第一个分组的所有空间都分配出去并且把头部存放的下一分组的信息复制到超级块中
回收空间时需要检查分组中的空闲块有没有满,如果没有满就放后面,如果满了放不下了就把超级快的数据复制到新回收的块中并且把新回收的块作为第一个分组
文件的基本操作
比较简单,直接看ppt总结就好了
文件共享
文件保护
文件系统结构
虚拟文件系统
- 向上层用户进程提供统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异
- VFS要求下层的文件系统必须实现某些规定的函数功能,如:open/read/write。一个新的文件系统想要在某操作系统上被使用,就必须满足该操作系统VFS的要求
- 每打开一个文件,VFS就在主存中新建一个vnode,用统一的数据结构表示文件,无论该文件存储在哪个文件系统。(vnode只存在于主存中,而inode既会被调入主存,也会在外存中存储)