DJ4-3 动态分区分配算法

目录

一、基于顺序搜索的分配算法

1、最佳适应算法(BF)

2、最坏适应算法(Worst fit,WF)

3、首次适应算法(First Fit,FF)

4、下次适应算法(Next fit,NF)

二、基于索引搜索的分配算法

5、快速适应算法(Quik fit,QF)

6、伙伴系统

7、哈希算法


一、基于顺序搜索的分配算法

1、最佳适应算法(BF)

算法内容:

  • 选择:能满足要求的、最小的空闲分区分配给作业。
  • 要求:将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。
  • 注意:没有把整个分区都分配给作业,作业只能切割下自己需要的大小。

实现效果:

  • 选择 => 把作业放入这样的分区后剩下的内零头最小
  • 要求 => 第一次找到的能满足要求的空闲区必定是最小的

举例说明:

DJ4-3 动态分区分配算法_第1张图片

优点:选中合适的分区,不会随意对大分区进行切割,保留的大分区可以满足大作业的需求。

缺点:

① 在每次分配时,总是产生最小的空白分区。因此经过一段时期后,存储空间中可能有许多这样的空白分区,由于其太小而无法使用,即产生了大量的外零头。

② 在回收一个分区时,为了把它插入到空白分区链中合适的位置上也颇为费时。

所以,这种算法乍看起来是最佳的,其实则不然,实际上没有被应用过。

2、最坏适应算法(Worst fit,WF)

恰恰与最佳适应算法 BF 相反

算法内容:

  • 选择:最大的空闲分区分配给作业。
  • 要求:将所有的空闲分区按其容量以从大到小的顺序形成一空闲分区链。
  • 注意:没有把整个分区都分配给作业,作业只能切割下自己需要的大小。

DJ4-3 动态分区分配算法_第2张图片

优点:切割后剩下的空白分区是最大的,因而很可能对以后的分配也是有用的。

缺点:由于最大的空白分区总是首先被切割,因此可能满足不了大作业的需求。

3、首次适应算法(First Fit,FF)

算法内容:

  • 选择:第一个满足请求的空白分区分配给作业。
  • 要求:将所有的空白分区按其在存储空间中地址递增的顺序链在一起。
  • 注意:没有把整个分区都分配给作业,作业只能切割下自己需要的大小。

算法倾向于优先利用存储空间中低址部分的空白区

DJ4-3 动态分区分配算法_第3张图片

优点:

  • 算法简单,查找速度快
  • 高址部分的大空白分区被划分的机会较少,能满足大作业的要求

缺点:

  • 常利用大分区满足小作业的要求,从而产生外零头,存储空间利用率不高
  • 小而无用的分区在头部,大而有用的分区在尾部,导致找到合适分区的速度降低

外零头就是头部小而无用的分区

4、下次适应算法(Next fit,NF)

是首次适应算法 FF 的一种变形

算法内容:

  • 选择:第一个满足请求的空白分区分配给作业。
  • 要求:将所有的空白分区按其在存储空间中地址递增的顺序链在一起。
  • 注意:没有把整个分区都分配给作业,作业只能切割下自己需要的大小。
  • 区别:FF 每次从链首开始查找,NF 每次从上一次找到的分区的下一个分区开始查找。

把存储空间中空白区构成一个循环链,到最后一个都不满足就回到第一个

优点:存储空间的利用更加均衡,不再使小的空白分区集中在存储器的低址部分。

缺点:存储器的高址部分不再能保留大的空白分区,可能满足不了大作业的要求。

二、基于索引搜索的分配算法

5、快速适应算法(Quik fit,QF)

算法内容:

  • 选择:索引表中能容纳作业的最小空白分区链表中的第一块。
  • 要求:将所有的空白分区按其容量大小进行分类。
  • 注意:该算法不会对分区进行分割。

具体做法:

  • 对具有相同容量的所有空白分区,单独设立一个空白分区链表。
  • 在内存中设立一张索引表,每个表项记录了对应类型空白分区链表的表头指针。

优点:

  • 查找效率高
  • 由于不会对分区进行分割,因此能保留大分区,满足大作业的要求
  • 由于不会对分区进行分割,因此也不会产生外零头

缺点:

  • 将分区归还给主存的算法复杂,系统开销较大
  • 分配时以进程为单位,一个分区只属于一个进程,因此或多或少存在浪费
  • 空闲分区划分越细,浪费则越严重

6、伙伴系统

Q:固定分区和动态分区方案存在的问题?

  • 内零头影响内存利用率
  • 算法复杂,回收分区时系统开销大
  • 并发执行的进程数量受到限制

Solution:伙伴系统

DJ4-3 动态分区分配算法_第4张图片

DJ4-3 动态分区分配算法_第5张图片 

7、哈希算法

利用哈希快速查找的优点,以及空闲分区在可利用空间表中的分布规律:

  1. 建立哈希函数
  2. 构造一张哈希表,以空闲分区大小为关键字,每个表项记录对应空闲分区链表的表头指针
  3. 分配时根据所需空闲分区大小,通过哈希函数计算,即得到在哈希表中的位置
  4. 从中得到相应的空闲分区链表,实现最佳分配策略。

你可能感兴趣的:(计算机操作系统,算法,计算机操作系统,学习)