linux内核的伙伴算法最大限度的减少了内存的碎片,其实应该说成是尽自己最大的努力减少了内存 的碎片。其思想就是将物理内存分成10个链表,每一个链表的元素代表一系列的连续页面,连续页面的数量随链表的不同而不同,linux中有10个这样的链 表,按照2的从0到9次幂的连续页面数量组成,比如链表0中保存有代表2的0次幂个连续页面的页面,而链表k中保存有2的k次幂个连续的页面,linux 的伙伴系统的精髓不但是如何分配,更重要的是如何释放,具体来讲,释放的过程就是一个合并的过程--反之分配的过程就是一个分解或者直接分配的过程,最终 的结果就是尽可能的得到尽可能大的连续内存块,因为在有连续内存分配需求的时候,大的块可以分解,然而小的非连续的块由于其非连续却不能合并,因此确保连 续块的最大化总是好的,在分配小块的时候,如果在小的块链表中没有空闲块,那么就从较大的块中分配,比如从它的order+1的块中进行分配,结果就是一 个块被分配了,由order+1块分解出来的剩余的一个块空闲,并且插入到order链表,如果由order大小的需求那么就可以分配之,如果没有,那么 就等着刚刚分配的块释放后再次和其合并成2的order+1次幂个连续页面大小的块。 linux内核的伙伴算法最大限度的减少了内存的碎片,其实应该说成是尽自己最大的努力减少了内存