动态分区分配算法:在动态分区分配方式中,当很多个空闲分区都能满足要求时,应选择哪个分区
首次适应算法(First Fit)
算法思想:每次从低地址开始查找,找到第一个能满足大小的空闲分区
实现方法:空闲分区以地址递增的次序排列,每次分配内存时顺序查找空闲分区链或空闲分区表(链或表都按地址从小到大排列),找到大小能满足要求的第一个空闲分区
最佳适应算法(Best Fit)
算法思想:因为动态分区分配是分配一块连续的内存,所以为了保证大一点的进程进来时能有足够的内存用,所以会尽量的留大块的空闲区,优先使用小的空闲区
实现方法:将空闲分区表或链按容量从小到大排序,当分配内存时,顺序查找表或者链,找到大小满足要求的第一个空闲分区,然后有必要的话重新排序表或者链(导致算法开销大)
缺点:若果我们每次都选最小的,那可能每次都要有一块很小(比如2MB)的内存难以被利用,这样就形成了很多外部碎片
最坏适应算法(Worst Fit)
算法思想:为了解决最佳适应算法会出现很多超级小的空闲分区,可以在每次分配时优先使用最大的空闲分区,这样剩下的就不会很小,方便以后使用
实现方法:将空闲分区表或链按容量从大到小排序,当分配内存时,顺序查找表或者链,找到大小满足要求的第一个空闲分区,然后有必要的话重新排序表或者链(导致算法开销大)
缺点:事实上我们每次找的第一个合适的就是最大的,因为他在表或链的最前面,肯定先匹配到他,这样的话每次都分割他,把它分成一块块小的区域,这样如果有个大一些的进程再来,那就谁也满足不了了
邻近适应算法(Next Fit)
算法思想:首次适应算法每次都从低地址开始查找,且低地址处被分成了很多很小的分区,这样在每次查找时都要经过这些小分区,但那些剩下来的很小的碎片可能都满足不了我却要在经过一遍,这就增加了查找的开销,因此就有了邻近适应算法,即从上次查找后的位置开始查找
实现方法:空闲分区以地址递增的次序排列(可排成一个循环链表),每次分配内存时从上次查找后的位置开始顺序查找空闲分区链或空闲分区表(链或表都按地址从小到大排列),找到大小能满足要求的第一个空闲分区,不需要重新排序表或者链
其实我们可以看到邻近适应算法就是首次优先算法的一个改编,他不一定就是比首次适应算法好,下面我们来分析一下
首次适应算法虽然每次都要从头开始顺序查找,蛋挞让前面的小内存更可能被用到,而后面的大内存被尽可能的保留下来(最佳适应算法的优点)
邻近适应算法每次都从上次查找完的位置开始往下查找,那前面的小内存可能满足,却只能接着往下走去分割大内存,如此一直进行下去,后面的大内存会被分成很多个小内存,这样等到有大进程来了却没有能满足的了(最坏适应算法的缺点)
综合来看,首次适应算法是最好的