第四章 文件管理
- 一、初识文件管理
- 1.1 文件有哪些属性
- 1.2 文件内部的数据应该怎样组织起来?(逻辑结构)
- 1.3 文件之间应该怎么组织起来?(目录结构)
- 1.4 操作系统应该提供哪些功能?
- 1.5 文件应如何存放在外存?(物理结构)
- 1.6 其他需要由操作系统实现的文件管理功能
- 二、文件的逻辑结构
- 2.1 无结构文件
- 2.2 有结构文件
- 2.2.1 顺序文件
- 2.2.2 索引文件
- 2.2.3 索引顺序文件
- 三、文件目录
- 3.1 文件控制块
- 3.2 目录结构
- 3.2.1 单极目录结构
- 3.2.2 两极目录结构
- 3.2.3 多极目录结构
- 3.2.4 无环图目录结构
- 3.3 索引节点(FCB的改进)
- 目录查询技术(理解!!!!!)
- 四、文件的物理结构(很重要!!!)
- 4.1 对非空闲磁盘块的管理
- 文件块、磁盘块(补充知识)
- 4.1.1 文件分配方式--连续分配
- 重要!!一定要理解这个逻辑!!!
- 4.1.2 文件分配方式--链接分配
- 4.1.2.1 隐式链接
- 4.1.2.2 显式链接
- 4.1.3 文件分配方式--索引分配
- 如果索引表太大,一个索引块放不下怎么办?
- 总结
- 小结
- 4.2 对空闲磁盘块的管理
- 4.2.1 存储空间的划分与初始化
- 4.2.2 空闲空间管理方法
- 4.2.2.1 空闲表法
- 4.2.2.2 空闲链表法
- 空闲盘块链
- 空闲盘区链
- 4.2.2.3 位示图法
- 4.2.2.4 成组链接法(不太考察)
- 小结
- 五、逻辑结构VS物理结构
- 无结构文件
- 逻辑结构
- 物理结构
- 连续分配
- 链接分配
- 索引分配
- 顺序文件
- 逻辑结构
- 物理结构
- 连续分配
- 链接分配
- 索引分配
- 易混淆点:
- 索引文件
- 逻辑结构
- 物理结构
- 索引结构
- 小结
一、初识文件管理
主要从以上几个方面展开本小节
1.1 文件有哪些属性
同一目录下不允许有重名文件
标识符只是操作系统用于区分各个文件的一种内部名称。
1.2 文件内部的数据应该怎样组织起来?(逻辑结构)
无结构文件(如文本文件)——由一些二进制或字符流组成,又称“流式文件”,以字节为单位
有结构文件(如数据库表)——由一组相似的记录组成,又称“记录式文件”
注意上图红框,了解记录和数据项的概念
1.3 文件之间应该怎么组织起来?(目录结构)
总之,文件通过目录这样的功能将文件有序地一层一层地组织起来。
1.4 操作系统应该提供哪些功能?
1.5 文件应如何存放在外存?(物理结构)
1.6 其他需要由操作系统实现的文件管理功能
小结
二、文件的逻辑结构
文件的逻辑结构,就是指在用户看来,文件内部的数据应该是如何组织起来的。
而文件的物理结构是指在操作系统看来,文件的数据是如何存放在外存的
算法的具体实现与逻辑结构、物理结构都有关(文件也一样,文件操作的具体实现与文件的逻辑结构、物理结构都有关)因此有必要对文件的逻辑结构和物理结构进行了解。
2.1 无结构文件
无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。
文件内部的数据其实就是一系列字符流,没有明显的结构特性。因此也不用探讨无结构文件的“逻辑结构”问题。
2.2 有结构文件
有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录由若干个数据项组成
每条记录有一个数据项可作为关键字(作为识别不同记录的ID)
根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录和可变长记录两种
有结构文件的三种逻辑结构如上图所示。
是根据有结构文件中的各条记录在逻辑上如何组织来划分的
2.2.1 顺序文件
顺序文件:文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个计录在物理上可以顺序存储或链式存储
定长记录的顺序文件,若采用顺序存储,则可实现随机存取;若能再保证记录的顺序结构,则可实现快速检索(即根据关键字快速找到对应记录)
考试题目中所说的“顺序文件”指的是物理上顺序存储的顺序文件。
缺点:增加/删除一个记录比较困难。
对于可变长记录文件,要找到第 i 个记录,必须先顺序第查找前 i-1 个记录,但是很多应用场景中又必须使用可变长记录。如何解决这个问题?引入了下面的索引文件
【注意:上图中的链式存储和顺序存储与之后的链接分配和连续分配是不同的。
链式存储说的是文件内部的这些记录的先后顺序是用链接指针把他们连起来的,由创建文件的用户自己设计的。(链式存储的链式下手对象是文件中的一个个记录)
而物理结构中的链接分配是操作系统做的事情,它会把整个文件(在操作系统眼里不过是一堆二进制代码而已)拆分成一个一个块,然后在磁盘中存放这些块的时候,操作系统用链接的方式来记录这些块之间的先后顺序(链接分配的链接下手对象是块)
】
2.2.2 索引文件
建立一张索引表以加快文件检索速度。每条记录对应一个索引项。
索引表本身是定长记录的顺序文件。因此可以快速找到第 i 个记录对应的索引项。
上图中的逻辑文件在物理上可以离散存放,但索引表在物理上需要连续存放
由于索引文件有很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合。
思考索引文件的缺点:每个记录对应一个索引表项,因此索引表可能会很大。比如:文件的每个记录平均只占 8B,而每个索引表项占32个字节,那么索引表都要比文件内容本身大4倍,这样对存储空间的利用率就太低了。因此引入了索引顺序文件
2.2.3 索引顺序文件
索引顺序文件中,同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。
若一个顺序文件有10000个记录,则根据关键字检索文件,平均须查找 5000 个记录。
若采用索引顺序文件结构,可把 10000 个记录分为 √10000 = 100 组,每组 100 个记录。则需要先顺序查找索引表找到分组(共100个分组,因此索引表长度为 100,平均需要查 50 次),找到分组后,再在分组中顺序查找记录(每个分组100 个记录,因此平均需要查 50 次)。可见,采用索引顺序文件结构后,平均查找次数减少为 50+50 = 100 次。
总结,若一个顺序文件有2n个记录,根据关键字检索晚间,平均查找n次
同理,若文件共有 106个记录,则可分为 1000 个分组,每个分组 1000 个记录。根据关键字检索一个记录平均需要查找 500+500 = 1000 次。这个查找次数依然很多,如何解决呢?
小结
顺序文件默认在物理上顺序存储
要会计算索引顺序文件的平均查找次数
三、文件目录
(即文件之间应该如何组织起来?)
【目录不是虚的概念,它是实实在在存在于外存的东西】
3.1 文件控制块
目录本身就是一种有结构文件,由一条条记录组成。每条记录对应一个放在该目录下的文件。
目录文件中的一条记录就是一个文件控制块(FCB)
FCB 的有序集合称为“文件目录”,一个FCB就是一个文件目录项。
FCB 中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息(是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)。最重要,最基本的还是文件名、文件存放的物理地址。
FCB 实现了文件名和文件之间的映射。使用户(用户程序)可以实现“按名存取”
需要对目录进行哪些操作?
搜索:当用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项
创建文件:创建一个新文件时,需要在其所属的目录中增加一个目录项
删除文件:当删除一个文件时,需要在目录中删除相应的目录项
显示目录:用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性
修改目录:某些文件属性保存在目录中,因此这些属性变化时需要修改相应的目录项(如:文件重命名)
3.2 目录结构
3.2.1 单极目录结构
实现了按名存取,但是不允许文件重命名
3.2.2 两极目录结构
分为主文件目录和用户文件目录
3.2.3 多极目录结构
多级目录结构访问文件的过程:
例如:自拍.jpg 的绝对路径是 “/照片/2015-08/自拍.jpg”
系统根据绝对路径一层一层地找到下一级目录。刚开始从外存读入根目录的目录表;找到“照片”目录的存放位置后,从外存读入对应的目录表;再找到“2015-08”目录的存放位置,再从外存读入对应目表;最后才找到文件“自拍.jpg”的存放位置。整个过程需要3次读磁盘I/O操作
树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。
但是,多级目录结构不便于实现文件的共享,为此提出了“无环图目录结构”
3.2.4 无环图目录结构
无环图目录结构在树形目录的基础上,增加了一些指向同一节点的有向边,使得整个目录成为一个有向无环图,可以实现多个用户间的文件共享。
需要为每个共享结点设置一个共享计数器,只有共享计数器减为0时,才删除结点。
共享文件不同于复制文件。
3.3 索引节点(FCB的改进)
索引结点机制:将原本的目录变成了上图的两块东西,一块仅包含文件名和索引结点指针,另一块就是索引结点(包含除了文件名之外的文件描述信息)
原理:因为查询所需要的文件时,只要用到文件名,把与文件名无关的信息一起加载进内存会增加磁盘的I/O次数。
存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。
小结
目录查询技术(理解!!!!!)
当用户要访问一个文件时,系统首先利用用户提供的文件名对目录进行查询,找出该文件的文件控制块或对应的索引结点。然后根据FCB或索引结点中记录的文件物理地址(盘块号),结合用户给出的逻辑地址,换算出文件在磁盘上的物理位置。最后通过磁盘驱动程序将所需文件读入内存。目前,对目录进行查询的方式主要有两种:线性检索法和Hash方法。
线性检索法:
线性检索法又称顺序检索法。在单级目录中,利用用户提供的文件名,用顺序查找法直接从文件目录中找到对应文件的目录项。在树形目录中,用户提供的文件名是由多个文件分量名组成的路径名,此时需对多级目录进行查找。假定用户给定的文件名是/usr/ast/mbox,则查找过程如下;
- 首先,系统应先读入第一个文件分量名usr,用它与根目录文件(或当前目录文件)中各目录项中的文件名顺序地进行比较,从中找出匹配者,并得到匹配项的索引结点号 6,再从6号索引结点中得知usr目录文件放在132号盘块中,将该盘块内容读入内存。
- 其次,系统再将路径名中的第二个分量名ast 读入,用它与放在132号盘块中的第二级目录文件中各目录项的文件名顺序进行比较,又找到匹配项,从中得到ast的目录文件放在26号索引结点中,再从26号索引结点中得知/usr/ast存放在496号盘块中,再读入496号盘块。
- 然后,系统又将该文件的第三分量名mbox读入,用它与第三级目录文件/usr/ast 中各目录项中的文件名进行比较,最后得到/usr/ast/mbox的索引结点号为60,即在60号索引结点中存放了指定文件的物理地址。目录查询操作到此结束。如果在顺序查找过程中,发现有一个文件分量名未能找到,则应停止查找,并返回“文件未找到”信息。
四、文件的物理结构(很重要!!!)
文件实际上是一种抽象数据类型,我们要研究它的逻辑结构、物理结构以及关于它的一系列操作。文件的物理结构就是研究文件的实现,即文件数据在物理设备上是如何分布和组织的。有两方面的回答:一是文件的分配方式,讲的是对磁盘非空闲块的管理;二是文件存储空间管理,讲的是对磁盘空闲块的管理。
4.1 对非空闲磁盘块的管理
即:文件数据该怎样存放在外存中
文件块、磁盘块(补充知识)
类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同
内存与磁盘之间的数据交换(即读/写操作、磁盘I/O)都是以“块”为单位进行的。即每次读入一块,或每次写出一块
在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为了一个一个的文件“块”
于是文件的逻辑地址可以表示为(逻辑块号,块内地址)的形式。
操作系统为文件分配存储空间都是以块为单位的
用户通过逻辑地址来操作自己的文件,操作系统负责实现从逻辑地址到物理地址的映射
4.1.1 文件分配方式–连续分配
连续分配方式要求每个文件在磁盘上占有一组连续的块。
用户通过逻辑地址来操作自己的文件,那么在连续分配方式下,操作系统如何实现从逻辑地址到物理地址的映射呢?
- 为了实现这个功能,在文件的目录中,需要记录文件存放的起始块号和长度(总共占了几个块)
- 操作系统根据用户给出的逻辑块号找到文件对应的目录项(FCB)
- 物理块号 = 起始块号 + 逻辑块号
当然,还需要检查用户提供的逻辑块号是否合法(逻辑块号 ≥ 长度 就不合法)
可以直接算出逻辑块号对应的物理块号,因此连续分配支持顺序访问和直接访问(即随机访问)
重要!!一定要理解这个逻辑!!!
*疑问1:用户是通过什么方式向系统给出逻辑块号的? *
疑问2:操作系统找文件目录的过程是怎样的?文件目录(相当于一个文件)刚开始不是在外存吗,难道要先调进内存吗?
回答1:写代码的时候,给操作系统输入的就是逻辑地址,逻辑地址转为逻辑块号是操作系统完成的
回答2:逻辑文件的记录也顺序存储在相邻的块中
回答2:用户不仅会提供文件的逻辑块号,还会提供文件名。在单极目录中,提供的文件名格式:mbox,而在树形目录中提供的文件格式:/usr/ast/mbox。操作系统会根据文件名一级一级将目录调进内存进行查找。查找到最后一级目录时,根据FCB或索引结点中记录的文件物理地址(盘块号),结合用户给出的逻辑地址,换算出文件在磁盘上的物理位置。
连续分配的文件在顺序读/写时速度最快
缺点1:物理上采用连续分配的文件不方便拓展
缺点2:物理上采用连续分配,存储空间利用率低,会产生难以利用的磁盘碎片
4.1.2 文件分配方式–链接分配
链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显式链接两种。
4.1.2.1 隐式链接
目录中记录了文件存放的起始块号和结束块号。
除了文件的最后一个磁盘块之外,每个磁盘块中都会保存指向下一个盘块的指针,这些指针对用户是透明的
如何实现文件的逻辑块号到物理块号的转变?
- 用户给出要访问的逻辑块号 i,操作系统找到该文件对应的目录项(FCB)
- 从目录项中找到起始块号(即0号逻辑块的物理块号),将0号逻辑块读入内存,由此知道1号逻辑块存放的物理块号,于是读入1号逻辑块,再找到2号逻辑块的存放位置……以此类推。因此,读入i号逻辑块,总共需要 i+1 次磁盘I/O。
结论:采用链式分配(隐式链接)方式的文件,只支持顺序访问,不支持随机访问,查找效率低,另外,指向下一个盘块的指针也需要耗费少量的存储空间。
结论:采用隐式链接的链接分配方式,很方便文件拓展。另外,所有的空闲磁盘块都可以被利用,不会有碎片问题,外存利用率高。
4.1.2.2 显式链接
把用于链接文件各物理块的指针显式地存放在一张表中。即 文件分配表(FAT,File Allocation Table)
【注意:一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。】
理解这句话看看上图中文件“aaa”和文件“bbb”在FAT中与其对应的地方
【FAT 的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的】
记录中只需记录文件的起始块号
如何实现文件的逻辑块号到物理块号的转变?
- 用户给出要访问的逻辑块号 i,操作系统找到该文件对应的目录项(FCB)
- 从目录项中找到起始块号,若i>0,则查询内存中的文件分配表FAT,往后找到 i 号逻辑块对应的物理块号。逻辑块号转换成物理块号的过程不需要读磁盘操作。
结论:采用链式分配(显式链接)方式的文件,支持顺序访问,也支持随机访问(想访问 i 号逻辑块时,并不需要依次访问之前的 0 ~ i-1号逻辑块,但是查FAT表是要一步一步查的,FAT在内存,查得也快),由于块号转换的过程不需要访问磁盘,因此相比于隐式链接来说,访问速度快很多。
显然,显式链接也不会产生外部碎片,也可以很方便地对文件进行拓展。
考试题目中遇到未指明隐式/显式的“链接分配”,默认指的是隐式链接的链接分配
4.1.3 文件分配方式–索引分配
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表——建立逻辑页面到物理页之间的映射关系)。
索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。
可以用固定的长度表示物理块号(相当于每个索引表项长度相等)。因此,索引表中的“逻辑块号”可以是隐含的。
目录中需要记录文件的索引块是几号磁盘块
注:在显式链接的链式分配方式中,文件分配表FAT 是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张。
如何实现文件的逻辑块号到物理块号的转换?
- 用户给出要访问的逻辑块号 i,操作系统找到该文件对应的目录项(FCB)
- 从目录项中可知索引表存放位置,将索引表从外存读入内存,并查找索引表即可只 i 号逻辑块在外存中的存放位置。
可见,索引分配方式可以支持随机访问。文件拓展也很容易实现(只需要给文件分配一个空闲块,并增加一个索引表项即可)但是索引表需要占用一定的存储空间
如果索引表太大,一个索引块放不下怎么办?
①链接方案:
②多层索引:
若采用多层索引,则各层索引表大小不能超过一个磁盘块
采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要K+1次读磁盘操作。
【文件最大长度的计算】
【查一级索引表的几号?(1026/256 = 4)查二级索引表的几号?(1026%256 = 2)】
③混合索引:
总结
小结
4.2 对空闲磁盘块的管理
学习时注意从三个方面进行理解:
- 用什么方式记录、组织空闲块?
- 如何分配磁盘块
- 如何回收磁盘块
4.2.1 存储空间的划分与初始化
存储空间的划分:将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)
存储空间的初始化:将各个文件卷划分为目录区、文件区
目录区主要存放文件目录信息(FCB)、用于磁盘存储空间管理的信息
有的系统支持超大型文件,可支持由多个物理磁盘组成一个文件卷
4.2.2 空闲空间管理方法
4.2.2.1 空闲表法
适用于连续分配方式
如何分配磁盘块:与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。
如何回收磁盘块:与内存管理中的动态分区分配很类似,当回收某个存储区时需要有四种情况——①回收区的前后都没有相邻空闲区;②回收区的前后都是空闲区;③回收区前面是空闲区;④回收区后面是空闲区。总之,回收时需要注意表项的合并问题。
4.2.2.2 空闲链表法
空闲盘块链
操作系统保存着链头、链尾指针
适用于离散分配的物理结构
空闲盘区链
操作系统保存着链头、链尾指针
离散分配、连续分配的物理结构都适用
4.2.2.3 位示图法
位示图:每个二进制位对应一个盘块。
重要重要重要:要能自己推出盘块号与(字号, 位号)相互转换的公式
注意题目条件:盘块号、字号、位号到底是从0开始还是从1开始
如何分配:若文件需要K个块
①顺序扫描位示图,找到K个相邻或不相邻的“0”;
②根据字号、位号算出对应的盘块号,将相应盘块分配给文件;
③将相应位设置为“1”。
如何回收:
①根据回收的盘块号计算出对应的字号、位号;
②将相应二进制位设为“0”
连续分配、离散分配都适用
4.2.2.4 成组链接法(不太考察)
空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。UNIX系统中采用了成组链接法对磁盘空闲块进行管理。
文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。
小结
五、逻辑结构VS物理结构
无结构文件
逻辑结构
在用户看来,文件都是存放在一片连续的逻辑地址空间(上图那一块)。用户只需要提供想访问文件的文件名及逻辑地址。
物理结构
连续分配
链接分配
索引分配
在操作系统眼里,这一整个文件无非就是一堆二进制数据而已。操作系统并不关心你在里面存放的是什么。操作系统把文件拆成多个块,然后根据操作系统的文件分配策略(连续分配、链接分配、索引分配)将这些块分配到外存。(无非就是一堆二进制数据,拆就完了!!!)
操作系统到底采用哪种分配方式,用户并不知道,也无需管这么多。反正用户给操作系统输入文件名和逻辑地址,操作系统就会将其转换为对应的物理地址,然后将目标数据从外存调入内存。
顺序文件
(例如:数组)
逻辑结构
在用户看来,文件都是存放在一片连续的逻辑地址空间(上图那一块)。用户只需要提供想访问文件的文件名及逻辑地址。
物理结构
连续分配
链接分配
索引分配
在操作系统眼里,这一整个文件无非就是一堆二进制数据而已。操作系统并不关心你在里面存放的是什么。操作系统把文件拆成多个块,然后根据操作系统的文件分配策略(连续分配、链接分配、索引分配)将这些块分配到外存。(无非就是一堆二进制数据,拆就完了!!!)
操作系统到底采用哪种分配方式,用户并不知道,也无需管这么多。反正用户给操作系统输入文件名和逻辑地址,操作系统就会将其转换为对应的物理地址,然后将目标数据从外存调入内存。
易混淆点:
顺序存储和链式存储说的是文件内部的记录顺序存储还是链式存储(对象是记录)
采用连续分配是指:这一堆的文件的逻辑地址空间(操作系统眼里就是一堆二进制代码)被操作系统拆成一块一块的逻辑块后,放在外存时,逻辑上相邻的块在物理上也相邻。(对象是块)
下面的链接分配同理
【注意:
链式存储说的是文件内部的这些记录的先后顺序是用链接指针把他们连起来的,由创建文件的用户自己设计的。(链式存储的链式下手对象是文件中的一个个记录)
而物理结构中的链接分配是操作系统做的事情,它会把整个文件(在操作系统眼里不过是一堆二进制代码而已)拆分成一个一个块,然后在磁盘中存放这些块的时候,操作系统用链接的方式来记录这些块之间的先后顺序(链接分配的链接下手对象是块)
】
索引文件
逻辑结构
在用户看来,文件都是存放在一片连续的逻辑地址空间(上图那一块)。用户只需要提供想访问文件的文件名及逻辑地址。
物理结构
索引结构
【注意:
逻辑结构中的索引文件里的索引表:是用户自己建立的;完成的是由 记录的关键字 到 记录存放的逻辑地址的映射
物理结构中的索引分配里的索引表:是操作系统建立的;完成的是由 逻辑块号 到 记物理块号的映射】
在操作系统眼里,这一整个文件无非就是一堆二进制数据而已。操作系统并不关心你在里面存放的是什么。操作系统把文件拆成多个块,然后根据操作系统的文件分配策略(连续分配、链接分配、索引分配)将这些块分配到外存。(无非就是一堆二进制数据,拆就完了!!!)
操作系统到底采用哪种分配方式,用户并不知道,也无需管这么多。反正用户给操作系统输入文件名和逻辑地址,操作系统就会将其转换为对应的物理地址,然后将目标数据从外存调入内存。