在上一个章节我们讲了内存连续分配
的几种方式,有单一、固定、动态这三种,在固定、动态这种里面,操作系统会记录空闲分区表,这个表是用来记录当前空闲的内存。
那么在之后有新的进程装入内存,需要从空闲分区表中找到一块比较合适的空闲内存,该怎么找呢? 这个就是今天我们要讲解的,几种不同方式的动态分区分配算法
。
首次适应算法 First Fit
算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。
如何实现:空闲分区以地址递增的次序排列
,每次分配内存时顺序查找空闲分区表或者空闲分区链,找到第一个能满足大小的空闲分区。
这个算法很好理解,就从低位置开始找,找到第一个大小符合要求的就行,看下面的例子:
在这个时候进程5想要分配内存,就会从分区1分配 15 MB 大小的内存,因为起始地址为 8,并且内存大小也满足,所以就选择了第一个。
邻近适应算法 Next Fit
算法思想:首次适应算法是每次都需要从表头重新开始查找,这可能会导致低地址部分出现很多小的空闲分区,而每次查找都需要经过这些分区,增加了查找的开销,如果每次都从上次查找结束的位置开始检索,就能解决这个问题。
如何实现:空闲分区以地址递增的顺序开始排列
,每次分配内存时从上次查找结束的位置开始查找空闲分区块,最后找到一个满足大小要求的分区即可。
这个算法和刚刚首次适应算法有相同点,也有不相同点。 相同点就是它们都是按照起始地址,依次递增开始排序,不同点就是首次适应算法每次分配每次都是需要重头开始查询是否有满足的分区,而邻近适应算法时从上一次查找结算的位置接着往后开始查找是否有满足的分区。
最佳适应算法 Best Fit
算法思想:由于动态分区分配是一种连续的分配方式,各个进程分配的空间必须是连续的一整块区域,为了考虑大进程到来时能有连续的大空间,所以尽可能更多的留下大片的空闲区,优先使用更小的空闲区。
如何实现:空闲分区表按照容量依次递增次序排列
,每次分配内存的时候按照顺序查找,找到第一个大小能满足要求的空闲分区。
我们看下面这个例子:空闲分区表是按照分区大小递增排列,然后选择第一次能够满足要求的分区即可。
缺点
:每次都选择最小的分区进行分配,会留下很多越来越多的、很小的、难以利用的内存块,就会产生很多内部碎片,如下图:
当进程6、进程5,他们使用比较最佳的空闲分区表之后,各剩下了 1 MB 的空闲分区,这种情况会越来越多,就会导致产生很多外部碎片。
最坏适应算法 Worst Fit
算法思想:为了解决最佳适应算法的问题,可以在每次分配时,优先使用最大的连续空闲区,这样分配后的空闲区就不会太小,方便使用。
如何实现:空闲分区按照容量递减次序排列,
每次分配内存时顺序查找,找到大小能够满足的第一个空闲分区。
看下面这个例子:空闲分区表是按照分区大小,递减的关系来进行排列的,然后按照顺序查找 进程5 就被安排到了第一个分区。
但是这个算法也会有缺点,因为它是优先使用容量最大的分区,这样就会导致如果之后有大进程需要使用内存的时候,分区就无法满足需求了。