在学习完操作系统之后,惊奇的发现里面有很多套路都是用到了套娃,今天就让我们一起通过文件的分配方式来看看它是怎么通过套娃操作来实现一系列功能的。
文件分配方式又叫做文件的物理结构:指的是在操作系统看来,文件的数据是如何存放在外存中的。文件分配方式有三种实现方式,接下来让我们看一下这三种方式。
一:连续分配
连续分配方式要求每个文件在磁盘上占有一组连续的块。
就像这样,假设一个文件名叫“aaa”,它需要的三块磁盘块的存储空间,那么它必须在磁盘上找到连续的三块才能进行存储。那么操作系统是如何实现逻辑块号到物理块号的映射呢?由上面连续分配的性质我们可以得到:物理块号=逻辑块号+起始块号。就像上图所示:1号逻辑块号对应的物理块号是5,因为物理块号(5)=逻辑块号(1)+起始块号(4)。由此我们可以知道,连续分配支持顺序访问和直接访问(随机访问)。
并且操作系统在读取某个磁盘块时,需要移动磁头。访问的两个磁盘块相隔越远,移动磁头所需时间就越长。那由上面这个图我们可以看出连续分配文件的磁盘块都是相邻的,所以移动磁头所用的时间最少,所以连续分配的文件在顺序读/写时速度最快。上面两个说的都是连续分配的优点,我们接着在聊一聊连续分配的缺点。
如图,如果文件A想要拓展,需要在增加一个磁盘块(总共需要连续的四个磁盘块),由于采用的是连续分配,因此问价A只能整体迁移到有四个空闲磁盘块的地方,由此可知,连续分配非常不利于文件拓展。并且会导致存储空间利用率低,会产生难以利用的磁盘碎片。
总结一下,连续分配的优缺点:
优点:1.支持顺序访问和直接访问(即随机访问):物理块号=起始块号+逻辑块号。
2.连续分配的文件在顺序访问时速度最快。因为在读取某个磁盘块时,需要移动磁头,访问的两个磁盘块越远,移动磁头的速度越慢,所以连续分配磁头的移动速度是最快的。
缺点:1.不方便文件的拓展,因为需要连续的块,因此如果后面的块被占用时,文件拓展时只能整体迁移到有足够连续的块的地方。
2.存储空间利用率低,会产生磁盘碎片。
二:链接分配
1.隐式链接
隐式链接分配方式中,每个磁盘块之间都会用指针连接,除了最后一个磁盘块之外,每个磁盘块中都会保存指向下一个盘块的指针。
那我们来分析一下,隐式链接是否方便文件的扩展呢?若此时要拓展文件,则可以随便找一个空闲磁盘块,挂到文件的磁盘块链尾,并修改文件的FCB。由此可见,隐式链接分配方式很方便文件的扩展。
那它有什么缺点呢?因为它是采用指针连接的方式,所以我们在查找的过程中,只能顺着指针的方向一个一个的查找,因此它的缺点就是只支持顺序访问,不支持随机访问,并且查找效率低。
总结一下,链接分配方式中隐式链接的优缺点:
优点:很方便文件拓展,不会有碎片问题,外存利用率高。
缺点:只支持顺序访问,不支持随机访问,查找效率低,指向下一个盘块的指针也需要耗费少量
的存储空间。
2.显式链接
显式链接分配方式是把用于链接文件各物理块的指针显式地存放在一张表中,即文件分配表(fat,file allocation table).一个磁盘只会建立一张文件分配表。开机时文件分配表放入内存,并常驻内存。相比于隐式链接来说,地址转换时不需要访问磁盘,因此文件的访问效率更高。
缺点就是文件分配表的需要占用一定的存储空间。
总结一下,链接分配方式中显式链接的优缺点:
优点:很方便文件拓展,不会有碎片问题,外存利用率高,并且支持随机访问。相比于隐式链接
来说,地址转换时不需要访问磁盘,因此文件的访问效率更高。
缺点:文件分配表的需要占用一定的存储空间。
三:索引分配
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表--建立逻辑页面到物理页之间的映射关系).索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。
因为有索引表,所以在查找的时候直接根据索引就可以很快的找到逻辑块在外存中的存放位置,所以索引分配方式可以支持随机访问,并且文件拓展也很容易实现(只需要给文件分配一个空闲块,并增加一个索引表项即可),但是索引表需要占用一定的存储空间。
但是我们又考虑到如果一个索引表太大,一个索引块装不下,应该怎么解决呢?
这里我们有三种解决方案(在这里我们就可以看到操作系统是如何使用套娃的):
1.链接方案:
可以将多个索引块链接起来存放。(就是将链接方式套娃在索引分配中)
假设一个文件大小为1KB,一个索引表项占4B,则一个磁盘块只能存放256个索引项。
若一个文件大小为256*256KB=65536KB=64MB,该文件共有256*256个索引项,也就需要256个索引块来存储,这些索引块用链接方案连起来。
但是链接方案带来的问题是:如果想要访问文件的最后一个逻辑块,就必须找到最后一个索引块,而各个索引块之间是用指针链接起来的,因此必须先顺序的读入前255个索引块,这显然是很低效的,因此我们想到了第二种解决方案:
2.多层索引
建立多层索引,使第一层索引指向第二层索引块,还可以根据文件大小再建立第三层,第四层索引块。(就是将索引分配层层套娃)
我们再用上面的例子,文件的最大长度是256*256*1KB=64MB。但是相比于上面链接方案来说,我们查找时,只需要将一级索引表调入内存,再查询二级索引表的其中的表项就可以了,因此只需要3次磁盘I/O。相比与上面的255次来说,效率提高了不少。但是我们又想到如果只是小文件,我们也需要从一级索引表来查找,效率还是比较低,因此我们又想到了第三种方案:
3.混合索引
混合索引:多种索引分配方式的结合。例如:一个文件的顶级索引表中,即包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表),还包含两级间接索引(指向两层索引表)。(就是将各种索引分配方式的套娃)
对于小文件,只需要较少的读磁盘次数就可以访问目标数据块。