操作系统 『动态(可变)分区分配』

动态(可变)分区分配

动态创建分区:

  • 在装入程序时按其初始要求分配;
  • 在其执行过程中通过系统调用进行分配或改变分区大小。
优点:没有内碎片。
缺点:有外碎片;

“逻辑地址>限长寄存器值”时,形成一个“地址越界”的程序性中断事件

地址转换公式:绝对地址=基址寄存器值+逻辑地址

分区分配中的数据结构

空闲分区表:

记录每个空闲分区的情况。每个空闲分区占一个表目,表目中包括分区序号、分区始址及分区的大小等数据项。

空闲分区链:

在这里插入图片描述

分区分配算法(基于顺序搜索)

首次适应算法FF(First Fit):将地址最小的够用的空间分配出去

(最先匹配法(first-fit))首址递增排列

优点:优先利用内存低址部分。
缺点:低址部分不断划分,产生小碎片;每次查找从低址部分开始,增加了查找的开销。

操作系统 『动态(可变)分区分配』_第1张图片

循环首次适应算法NF(Next Fit):从上次分配位置开始搜索,将地址最小的够用的空间分配出去

(下次匹配法(next-fit))

为实现算法,需要:
  • 设置一起始查寻指针
  • 采用循环查找方式

优点:使内存空闲分区分布均匀,减少查找的开销
缺点:缺乏大的空闲分区

最佳适应算法BF(Best Fit):将够用的长度最小的空间分配出去

空闲区按大小递增排列!

缺点:产生许多难以利用的小空闲区(外碎片)

最坏适应算法WF(Worst Fit):将够用的长度最大的空间分配出去

空闲区按大小递减排列!

  • 不会留下太多的小空闲分区;
  • 但较大的空闲分区不被保留。

分配算法对比

操作系统 『动态(可变)分区分配』_第2张图片

分区分配操作

分配内存

设请求的分区大小为u.size,
表中每个空闲分区的大小表示为m.size,
若m.size- u.size <= size(最小阈值),
将整个分区分配给请求者,
否则从分区中按请求的大小划出一块内存空间分配,
余下部分留在空闲链中,将分配区首址返回给调用者。

注:基于索引搜索的分区分配算法

快速适应算法:

将空闲分区,按其容量大小,进行分类,对于每一类的所有空闲分区,单独设立一个空闲分区链表

伙伴系统:

分区大小均为2的k次幂,将空闲分区按分区的大小进行分类,并单独设立一个空闲分区双向链表。

伙伴需满足的条件:
  • 两个块大小相同;
  • 两个块地址连续;
  • 两个块必须是同一个大块中分离出来的

操作系统 『动态(可变)分区分配』_第3张图片

哈希算法:

构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。

你可能感兴趣的:(操作系统,动态分区)