【概述】
为实现文件组织方式,都需要为文件分配盘块,因此必须知道磁盘上哪些盘块是可用于分配的
故在文件分配磁盘时,除了文件分配表外,系统还应为可分配存储空间设置相应的数据结构,即设置一个磁盘分配表,用于记住可分配的存储空间情况
同时,还应提供盘块进行分配和回收的手段,但无论哪种分配和回收方式,存储空间的基本分配单位都是磁盘块
【空闲表法】
空闲表法属于连续分配方式,其与内存的动态分配方式雷同,其为每个文件分配一块连续的存储空间
简单来说,系统为外存上的所有空闲区建立一张空闲表,每个空闲区对应一个空闲表项,其中包括:表项序号、空闲区的第一个盘块号、该区的空闲盘块数等信息,最后将所有空闲区按其起始盘块号递增的次序排序,形成空闲盘块表
与内存的动态分配类似,存储空间的分配和回收同样可采用首次适应算法、循环首次适应算法等
虽然连续分配方式很少采用,但在外存的管理中,由于它具有较高的分配速度,可减少访问磁盘的 I/O 频率,因此它在诸多分配方式中仍占有一席之地
【空闲链表法】
空闲链表法是将所有空闲区拉成一条空闲链,根据构成链所用基本元素不同,可以把链表分成两种形式:空闲盘块链、空闲盘区链
对于空闲盘块链来说,其是将磁盘上的所有空闲空间,以盘块为单位拉成一条链,其分配和回收一个盘块的过程十分简单,但为一个文件分配盘块时,可能要重复操作多次
当因创建文件而请求分配空间时,系统从链首依次摘下适当数目的空闲盘块分配给用户
当因删除文件而释放存储空间时,系统将回收的盘块依次插入空闲盘块链的末尾
对于空闲盘区链来说,其是将所有空闲盘区拉成一条链,每个盘区上含有:指示下一空闲盘区的指针、本盘区大小等信息,其分配和回收的过程较为复杂,但效率较高
【位示图法】
位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上的所有盘块都有一个二进制位与之对应,当值为 $0$ 时,表示对应盘块空闲,当值为 $1$ 时,表示对应盘块已分配
根据位示图进行盘块分配时,可分三步进行:
- 顺序扫描位示图,找到为 $0$ 的二进制位
- 将所找到的一个或一组二进制位,转换成与之对应的盘块号,进行分配操作
- 修改位示图
而盘块的回收分为两步:
- 将回收盘块的盘块号转换成位示图中的行号和列号
- 修改位示图
位示图的优点在于容易找的一个或一组相邻接的空闲盘块,但限于容量问题,常用于微型机和小型机中
盘块号计算公式为:
盘块号转换位示图中的行号和列号的公式为:
【成组链接法】
空闲表法、空闲链表法都不适用于大型文件系统,因为这会使得空闲表或空闲链表过长,而成组链接法是将上述两种方法结合在一起的方法,其兼备两种方法的优点,且克服了表太长的缺点
该方法将所有盘块按规定大小划分为组,在组间建立链接,组内的盘块借助一个系统栈从而可快速处理,且支持离散分配回收
该方法借助了一个空闲盘块回收栈,用于存放当前可用的一组空闲盘块的盘块号,栈中尚有的空闲盘块号数为 $N$,其中最多含有 $100$ 个号
在分配盘块时,按以下四步进行:
- 检查空闲盘块号栈是否上锁,如没有,从栈顶取出一空闲盘块号,将与之对应的盘块分配给用户,然后将栈顶指针下移一格
- 若该盘块号已是栈底,到达当前栈中最后一个可供分配的盘块号
- 读取该盘块号所对应的盘块中的信息,即将下一组可用的盘块号入栈
- 原栈底盘块分配出去,修改栈中的空闲盘块数
在回收盘块时,过程只有两步:
- 回收盘块号记入栈顶,空闲数 $N+1$
- $N$ 达到 $100$ 时,若再回收一块,则将该 $100$ 条信息写入新回收块