前言
在动态分配分区方式中,当很多个空闲分区都能满足要求时,应该选择哪一个进行分配?
首次适应算法
思想:每次都从低地址开始查找,找到第一个满足进程大小的空闲分区。
实现:空闲分区按照地址递增次序排列,每次分配时,按顺序查找空闲分区表或者空闲分区链,找到大小能满足要求的第一个空闲分区。
分配:按照此算法找到空闲分区时,将空闲分区大小进行更改。
邻近适应算法
思想:
由于首次适应算法每次都是从低地址部分开始开始查找适应的空闲分区,这就导致了低地址部分有了很多很小的空闲分区,而每次分配查找时是顺序查找,都要经过这些分区,这就使查找的开销变大,如果每次都从上次查找结束的位置开始检索,就可以结束查找开销的问题。
实现:空闲分区还是以地址递增的顺序排列,每次分配时,都从上次查找位置开始查找空闲分区表,找到第一个满足大小的空闲分区。
优点:
临近适应算法也保持了最佳适应算法的优点,即大的空闲分区更容易保留下来,因为每次都是从低地址部分开始检索,当低地址的部分有小的空闲分区可以满足时,即进行分配,高地址的空闲分区没有被分配到。
缺点:由于每次都是从上次分配的地址开始检索,所以高低地址的空闲分区都有同样的概率被分配到,也就导致了高地址的大分区分被划分为小分区,最后导致无大分区可用。(最大适应算法的缺点)
最佳适应算法
思想:由于动态分区分配算法是一种连续分配方式,为了后边大进程要装入内存时,有足够大的空闲空间为其分配,所以优先使用更小的空闲区。
实现:空闲分区表或者链按照空闲分区大小递增的顺序来进行排列,每次分配时顺序查找,找到第一个可以满足的空闲分区。
缺点:每次都选最小的分区进行分配,会留下越来越多,越来越小的,很难利用的空闲分区 ,会产生很多的外部碎片。
最坏适应适应算法(最大适应算法)
由于最佳适应算法,会产生很多的外部碎片,所以有了最坏适应算法
思想:在每次分配时,选择最大的空闲空间,这样分配后的空闲空间就不会那么下,因此也不会有那么多的外部碎片了。
实现:按照空闲空间的大小递减进行排序,每次分配时,选择第一个空闲分区就可。(如果第一个空闲分区都无法满足的话,那么就没有必要进行向下查找了)
缺点:虽然解决了产生很多外部碎片的问题,但是同时又产生了另一个问题,就是每次都选择最大的空闲分区进行分配,那么大的空闲分区很快就被分配成小的空闲分区了,如果有大的进程要分配空闲分区时,就没有空闲分区可用了。