内存管理的经典算法Buddy

Buddy算法,内存管理的经典算法,主要的目的就是减少内存碎片,增加内存的使用率,在unix和linux中都是使用该算法进行内存分配管理。

以linux为例,在linux中,系统会分配一块free_area的数组,该数组的元素为一内存页块,每向上一级,页块的大小成倍增长,既:1、2、4、8、16、32、64、128….2n,如下图:
  
    内存管理的经典算法Buddy

内存分配:
当进程向系统请求空间时,内存管理系统将在free_area数组中寻找大小适合空闲块,比如需要分配一块512K的空间,系统会在free_area中寻找大小为512K的快,假设首个内存页块大小为4K,则内核会寻找大小是第一个元素128倍的元素,在free_area中既是对应第7个元素,假如该元素对应的空间已经被分配,系统则会再向上搜索,既搜索第八个元素对应的页块链表,此时如果空间足够,则使用该块进行空间分配,由于该块的大小比所申请的空间大一倍,系统会将该块分割为两半,其中一半用于分配,而另外一半则插入上一元素空间,既free_area中第7个元素。如果仍然没有找到空闲的空间,则继续向上搜索。

内存回收:
内存回收的过程与分配的过程相反,在回收的时候,内核将检测是否存在相同大小的内存块,如果存在,则将它们进行合并,合成一个大小是原来两倍的新的空闲,每次结合完之后,代码还要检查是否可以继续合并成更大的页面。最佳情况是系统的空闲页面块将和允许分配的最大内存一样大。

你可能感兴趣的:(算法,linux,unix)