面试时被问到这个问题,我脑海里面都是FIFO、LRU、RR啥的,下来一搜索,压根不是一样东西,操作系统也看了不少遍,好多东西还是混乱得很。

我们常见的那些内存分配算法属于动态分区分配: 不预先划分内存,在程序装入内存时,根据进程的大小动态地建立分区,并使得分区的大小正好适合进程的需要,因此系统中分区的大小和数目是可变的。

在进程装入或换入主存时,如果内存中有多个足够大的空闲块,操作系统必须确定分配哪个内存块给进程使用,这就是动态分区的分配策略。

1. 首次适应

地址递增,顺序查找,第一个能满足的即分配给进程。 首次适应算法不仅是最简单的,而且通常也是最好和最快的。

首次适应算***使得内存的低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。

2. 最佳适应

容量递增,找到第一个能满足要求的空闲分区。

最佳适应算法虽然称为“最佳”,但是性能通常很差,因为每次最佳的分配会留下很小的难以利用的内存块,它会产生最多的外部碎片。

3. 最坏适应

容量递减,找到第一个能满足要求的分区。

选择最大的可用块,这看起来最不容易产生碎片,但是却把最大的连续内存划分开,会很快导致没有可用的大的内存块,因此性能也非常差。

4. 邻近适应

循环首次适应算法。 分配内存时,从上一次刚分配过的空闲分区的下一个开始查找,直至找到能满足要求的空闲分区。查找时会采用循环查找的方式,即如果直到链表最后一个空闲分区都不能满足要求,则返回到第一个空闲分区开始查找。

它常常会导致在内存的末尾分配空间(因为在一遍扫描中,内存前面部分使用后再释放时,不会参与分配),分裂成小碎片。它通常比首次适应算法的结果要差。