Re:从0开始的 空闲磁盘块管理(考研向)
文件存储空间管理
- 前言
- 空闲表法
- 空闲链表法
- 空闲盘块链
- 空闲盘区链
- 位示图法
- 成组链接法(难点)
- 引入(why learning)
- 超级块
- 形象解释
- 如何分配
- 形象解释
- 如何回收
- 形象解释
- 思考
- 结语
前言
上一篇文章我们说到了文件分配方式 对应链接
这时我们现在想一想 文件分配方式是不是都是针对于放了数据的磁盘块 我们用什么连续分配 什么链接分配对他们进行管理 但是 操作系统作为一个管理者 它不仅需要对非空闲磁盘块进行管理 还要对空闲磁盘块进行管理 这就是我们这篇文章需要介绍的
空闲表法
- 其实这种方法的核心我们用一句话就可以说清楚:
- 跟他的名字一样,我们采用一个表格 这个表格里面存储空闲块的信息
- 通过观察下面的例子不难看出 这个空闲表 记录的是啥?
- 是不是都是记录的一片连续的空闲磁盘块啊 所以使用这个方法有一个前提就是必须采用连续分配方式(文件分配方式之一)
- 而且这种方式可以结合我们前面在动态分区分配那里学的算法 来决定为我们的文件具体分配哪个区间
- 首次适应就是按地址一个一个找 直到第一次找到满足我们要求的空间
- 最佳适应算法 就是把空闲块从小到大给他链起来 然后寻找满足条件的空间 但是会造成一些外部碎片
- 最坏适应算法就是反过来 因为是从大到小区匹配 难免会产生内部碎片
空闲链表法
既然空闲表法与我们前文的连续分配方式对应 那自然而然的 就有了我们的空闲链表法 对应我们的离散分配
空闲盘块链
其实我们就按照名字理解就可以了,就是以一个磁盘块作为一个链表元素,现在要弄明白一件事情就是这个链上面都是我们磁盘中空闲的磁盘块
- 分配 :说白了就是从链头开始 给申请的文件分配它所需要的磁盘块
- 回收:就是将再次空闲下来的磁盘块用指针将他们挂到链尾
空闲盘区链
- 跟上面所说的空闲盘块链不同的是 这里我们以一个空闲的盘区(好几个连续的空闲盘块)作为基本单位来组成一条空闲链
- 对于盘区和盘区之间的联系 我们选取每一个盘区的第一个盘块来存储下一个盘区的位置和当前盘区的长度信息
- 分配:类似的我们可以采用动态分区分配的思想 由于上面说了我们的每个盘区都存储了盘区大小 这样我们就可以将这些盘区链起来 通过不同的算法 来决定为文件分配哪个盘区
- 回收:我们是不是在动态分区分配那里学过类似的 然后这一章的学的 系统的“打开文件表”是不是也是类似的思想 只不过是以表格来呈现的
- 在这里对于一个即将要回收的磁盘区(回收区) 我们检查他的前后有没有空闲区 如果没有那么直接回收 然后将这个新空闲下来的磁盘块挂到链尾
位示图法
- 这东西我第一次见得时候像啥呢?学过数据结构与算法的同学
- 这东西是不是就像我们BFS 或者DFS算法那里建立的bool [N] [N] s啊 将这个二维数组用于标记这个方块是否走过
- 这里类似的 在这个表格里面我们就用 0 表示空闲的盘快 1 表示已经分配出去的盘快 是不是非常好理解呢
- 这个方法有一个优点就是连续和离散分配方式都能用 我认为根本原因是我们用表格的方式来隐含了各个数据块的状态 这也我们并不用关心具体是怎么分配的了
- 分配:我们只需要顺序的扫描这个表格 只要找到了累计我们需要的块是不是就行了 然后算出这个表中对应空闲位置的盘块号(文件是个傻子 需要翻译一下)
- 然后将分配出去的块对应位置设为1(是不是非常像我们的BFS/DFS算法的一个标记流程)
- 回收:这时候就要反过来 将再次空闲盘块号计算为表中的对应位号和字号 然后将表中对应位置 置为0(回溯过程)
成组链接法(难点)
引入(why learning)
超级块
形象解释
如何分配
- problem 1(完全足够的情况)
- problem 2(刚刚好的情况)
- problem 3 (不太够的情况 需要回收)
形象解释
如何回收
- problem 1
- problem 2(第一组已经满了)
形象解释
思考
结语
FIGHTING!