目录
一、基于顺序搜索的分配算法
1、最佳适应算法(BF)
2、最坏适应算法(Worst fit,WF)
3、首次适应算法(First Fit,FF)
4、下次适应算法(Next fit,NF)
二、基于索引搜索的分配算法
5、快速适应算法(Quik fit,QF)
6、伙伴系统
7、哈希算法
一、基于顺序搜索的分配算法
1、最佳适应算法(BF)
算法内容:
- 选择:能满足要求的、最小的空闲分区分配给作业。
- 要求:将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。
- 注意:没有把整个分区都分配给作业,作业只能切割下自己需要的大小。
实现效果:
- 选择 => 把作业放入这样的分区后剩下的内零头最小
- 要求 => 第一次找到的能满足要求的空闲区必定是最小的
举例说明:
优点:选中合适的分区,不会随意对大分区进行切割,保留的大分区可以满足大作业的需求。
缺点:
① 在每次分配时,总是产生最小的空白分区。因此经过一段时期后,存储空间中可能有许多这样的空白分区,由于其太小而无法使用,即产生了大量的外零头。
② 在回收一个分区时,为了把它插入到空白分区链中合适的位置上也颇为费时。
所以,这种算法乍看起来是最佳的,其实则不然,实际上没有被应用过。
2、最坏适应算法(Worst fit,WF)
恰恰与最佳适应算法 BF 相反
算法内容:
- 选择:最大的空闲分区分配给作业。
- 要求:将所有的空闲分区按其容量以从大到小的顺序形成一空闲分区链。
- 注意:没有把整个分区都分配给作业,作业只能切割下自己需要的大小。
优点:切割后剩下的空白分区是最大的,因而很可能对以后的分配也是有用的。
缺点:由于最大的空白分区总是首先被切割,因此可能满足不了大作业的需求。
3、首次适应算法(First Fit,FF)
算法内容:
- 选择:第一个满足请求的空白分区分配给作业。
- 要求:将所有的空白分区按其在存储空间中地址递增的顺序链在一起。
- 注意:没有把整个分区都分配给作业,作业只能切割下自己需要的大小。
算法倾向于优先利用存储空间中低址部分的空白区
优点:
- 算法简单,查找速度快
- 高址部分的大空白分区被划分的机会较少,能满足大作业的要求
缺点:
- 常利用大分区满足小作业的要求,从而产生外零头,存储空间利用率不高
- 小而无用的分区在头部,大而有用的分区在尾部,导致找到合适分区的速度降低
外零头就是头部小而无用的分区
4、下次适应算法(Next fit,NF)
是首次适应算法 FF 的一种变形
算法内容:
- 选择:第一个满足请求的空白分区分配给作业。
- 要求:将所有的空白分区按其在存储空间中地址递增的顺序链在一起。
- 注意:没有把整个分区都分配给作业,作业只能切割下自己需要的大小。
- 区别:FF 每次从链首开始查找,NF 每次从上一次找到的分区的下一个分区开始查找。
把存储空间中空白区构成一个循环链,到最后一个都不满足就回到第一个
优点:存储空间的利用更加均衡,不再使小的空白分区集中在存储器的低址部分。
缺点:存储器的高址部分不再能保留大的空白分区,可能满足不了大作业的要求。
二、基于索引搜索的分配算法
5、快速适应算法(Quik fit,QF)
算法内容:
- 选择:索引表中能容纳作业的最小空白分区链表中的第一块。
- 要求:将所有的空白分区按其容量大小进行分类。
- 注意:该算法不会对分区进行分割。
具体做法:
- 对具有相同容量的所有空白分区,单独设立一个空白分区链表。
- 在内存中设立一张索引表,每个表项记录了对应类型空白分区链表的表头指针。
优点:
- 查找效率高
- 由于不会对分区进行分割,因此能保留大分区,满足大作业的要求
- 由于不会对分区进行分割,因此也不会产生外零头
缺点:
- 将分区归还给主存的算法复杂,系统开销较大
- 分配时以进程为单位,一个分区只属于一个进程,因此或多或少存在浪费
- 空闲分区划分越细,浪费则越严重
6、伙伴系统
Q:固定分区和动态分区方案存在的问题?
- 内零头影响内存利用率
- 算法复杂,回收分区时系统开销大
- 并发执行的进程数量受到限制
Solution:伙伴系统
7、哈希算法
利用哈希快速查找的优点,以及空闲分区在可利用空间表中的分布规律:
- 建立哈希函数
- 构造一张哈希表,以空闲分区大小为关键字,每个表项记录对应空闲分区链表的表头指针
- 分配时根据所需空闲分区大小,通过哈希函数计算,即得到在哈希表中的位置
- 从中得到相应的空闲分区链表,实现最佳分配策略。