本文主要介绍一下内存管理的一些常见空闲链表管理算法。主要介绍以下6种方法
最优匹配
听着名字大约也能猜出是咋分配的,就是当申请内存的时候,把最小的且能满足分配的内存块进行分配,需要遍历整个空闲链表才能实现这一策略,这样的策略想法很简单,但是需要遍历整个链表很消耗性能,会产生很多较小的外部碎片无法利用。
最差匹配
这个算法和最优匹配相反,每次申请内存就把最大的块分配(这里需要分裂),也是需要遍历整个链表,主要的目的是想着把大块内存留给空闲链表,避免产生很多较小的内存碎片,想法也很简单,和前面的最优匹配一样,遍历整个链表会造成很大的性能消耗,并且通过研究表明,这种策略会产生很多的碎片,和初衷相反了。
首次匹配
当需要分配内存时,使用第一个可以满足内存块进行分配,这个策略就不需要遍历整个链表了,因此在速度上有很大的优势,但是会使得空闲链表的头部产生很多的碎片,这里可以把空闲链表基于内存地址进行排序,有利于合并一些碎片的内存。
下次匹配
这个匹配方法和上面的首次匹配一样,不够这个算法维护了一个指针,指向了上次分配内存的位置,当再进行内存分配时直接从这个指针位置向后寻找第一个满足申请的内存块进行分配
分离空闲链表
把空闲链表按照不同的大小设置多个空闲链表,当遇见不同大小的内存申请,会根据申请的大小来向不同的空闲链表申请内存,这个方法和STL的内存分配子算法一样,详情可以看看STL的内存分配算法
伙伴系统
这个算法我之前都没有听说过,看书看到了,纪录一下,有一块大的内存,每次进行内存申请的时候,就不断地二分空闲的内存块,直到二分成最小满足申请内存大小的大小,将其分配给申请者,当被分配的内存释放时,查看其伙伴(这里的伙伴就是和其是一样大的,通过二分分开的临界内存块)是否空闲,如果空闲的话就直接合并,向上回溯。