在上一篇文章(【心得篇】操作系统文件管理の逻辑结构)中,我介绍了文件在硬盘上的组织结构,但是操作系统要对文件进行管理,仅规划好了逻辑结构还不行,需要明确物理结构才能把管理落到实处。本文的重点便是操作系统如何管理文件,或者更确切地说——操作系统是如何分配磁盘空间的。

基本的管理思想

操作系统对各种实体的管理,说白了就是拿张表格分配资源,有资源信息的表格,也有使用者信息的表格。文件作为一种实体,也是如此被管理的。文件管理和磁盘空间管理,是一体两面。

我们注意到,磁盘的空间包括已被占用的部分和未被占用的部分,而各部分都是极度分散的,因此需要分别进行管理——既需要对未被占用的空闲块进行统计安排,也需要把已被占用的非空闲块安排成逻辑上独立的文件。

空闲块管理

操作系统对空闲块的管理,按照空闲盘块组织方式的不同,一般有4种不同的方法。管理既包括分配空闲块,也包括回收空闲块,所谓“有借有还,再借不难”嘛。

1.空闲表法

操作系统把各个盘区{连续的空闲块}记录下来。表格上的信息是:

| 序号 | 每个盘区第一个空闲块号 | 该盘区空闲盘块数 | //一般是按空闲块号递增

在分配空闲块时,操作系统会根据不同的策略{首次适应算法、循环首次适应算法等},找到符合要求的空闲盘区,分配出去,然后根据分配结果修改空闲表;

在回收空闲块时,操作系统会考虑回收块的相邻块是否空闲,如果空闲的话予以合并,否则就将回收块记录进空闲表。

2.空闲链表法

操作系统把空闲盘块或盘区{连续的盘块}连成一条链,也就是在空闲盘块或盘区内部的尾部加上指向下一个空闲盘块或盘区的指针。操作系统需要保存链头和链尾的指针。

若是空闲盘块链,在分配时,操作系统会把链头摘下空闲块分配给文件;在回收时,操作系统会把空闲块挂到链尾上;

若是空闲盘区链,在分配时,操作系统会找到首个适应大小的盘区摘下分配给文件,或者若没有足够大的盘区,就将若干个小盘区分配给文件,然后维护指针和盘区大小信息;在回收时,会考虑回收区相邻盘块是否空闲,如果空闲就进行合并,维护指针和盘区大小信息,否则就挂到链尾。

3.位示图法

操作系统用比特位标识盘块的空闲情况,一个比特位对应一个盘块,比特位排列成二维矩阵。

在分配空闲块时,操作系统会按顺序扫描位示图,从而找到空闲磁盘块,然后按照比特位的位置获得空闲磁盘块的块号,将其分配出去,最后对该比特位取反;

在回收空闲块时,操作系统会将盘块号转化成行列号,将对应比特位取反即可。

4.成组链接法

操作系统将空闲盘块(可以不相邻)分组,每组第一个盘块拥有一张索引栈,索引下一组的所有空闲块。

在分配空闲块时,操作系统会将第一组的第一个盘块装入内存(这时候它就叫超级块啦),在分配空闲块的时候,操作系统会按照要求将栈顶盘块分配给文件(即出栈操作),并维护索引栈的大小,如果栈空了,就把该盘块分配出去,然后装入下一个分组的第一个盘块;

在回收空闲块时,操作系统会将空闲块入栈,如果栈满了,就把回收来的块单独成组(大小为1),然后把回收满的组推后到第二组。

(如果没看懂,可以戳这个视频,两遍就能懂:https://www.bilibili.com/video/av71840093)

文件分配(非空闲块管理)

操作系统管理非空闲块,就是让各个盘块组织成一个文件,或者说是让一个文件获得并组织好各个盘块用于读写等操作,FCB记录了顺利访问文件的关键信息。按照文件组织盘块的方式不同,操作系统管理非空闲块一般有3种方法。

1.连续分配

一个文件具有一个盘区{一组连续的盘块},FCB中的信息是:

| 文件名 | 起始盘块号 | 长度 | //长度以盘块为单位。

2. 链接分配

一个文件具有若干盘块,这些盘块构成一个链表,FCB中的信息是:

| 文件名 | 起始盘块号 | 尾盘块号 |

这是隐式链接——链表中间结点的后继指针无法直接获取。

而若将所有链表结点盘块的指针域都提取出来,放到一张表格里,就构成了文件分配表(FAT),表中的每一项内容是盘块号和对应的后继盘块号(他们同属于一个文件)。此时,FCB中的信息是:

| 文件名 | 起始盘块号 |

这就称为显式链接——每个结点的后继结点都能通过驻于内存中的FAT表快速检索。

3.索引分配

一个文件具有一个固定大小的索引块,索引块是一个盘块号的数组,盘块号按文件信息的逻辑顺序排列。数组的空白区域盘块号为-1。FCB中的信息是:

| 文件名 | 索引块号 |

为了让索引块能支持大文件,可以将多个索引块链接或者利用多层索引(减小索引块连续占用空间的大小)。

后记

至此,我简单介绍了操作系统管理文件的方式,包括文件的逻辑结构和物理结构,即讲清了文件如何在计算机中结构良好地被组织{将“文件”用不同层次的“目录”引导从而解决多用户、重名、分类的问题},以及如何为文件分配空间{清楚地统计磁盘空间资源并按照文件要求为其分配空闲块},让文件组织好空间{把物理上可能不相邻的盘块组织成逻辑上的整体},希望读者有所收获。另外,疏漏之处,敬请指出!