内存管理之buddy system

来源:互联网 发布:mac打印6寸相纸 编辑:程序博客网 时间:2024/05/22 05:04

buddy system介绍

buddy system是一种内存管理方法,它使得分配正确大小的内存块以及相邻内存合并都可以更快速地进行。(用普通的算法对free的内存按大小排序并分配是很快的,但是内存合并非常的复杂。)buddy system主要使用的是基于2的幂运算,而这也正是计算机所擅长的。

buddy system具体实现

在buddy system中,分配器只分配特定大小的内存块,并且有许多的free list,每一个对应一个特定大小。这些特定的大小通常都是2的幂数,或者是一个斐波那契序列,使得任意一个内存块(不包括最小size的)都可以被分为两个更小的特点大小内存块。

当分配器从内存收到一个请求,它会循环处理请求的size,直到找到最符合需求的某个特定的size,并返回这个size的free list中第一个内存块。如果这个size的free list是空的,分配器会把更大的内存块分裂为几个该size的内存块,并将其中一个返回,把剩下的加入到该size的free list中。

当内存块被回收时,也可能会把相邻的内存块合并为一个更大size的内存块。为了更易实现,free list会按照地址顺序对内存块进行存储。buddy system的最大优势就是合并非常方便。

分配内存实例

这里写图片描述

一个二进制buddy system分配器可能包括16, 32, 64KB等大小的内存块。一开始可能只有一块64KB的内存块,当应用请求需要一个8KB的内存块时,分配器会先检查8KB的free list,然后发现没有这个大小的free内存块。然后它便会吧这个64KB的内存块分宜两个32KB的,再把一个32KB的分为两个16KB的,再把其中一个分为两个8KB内存块,然后分配器把其中一个8KB内存块返回给应用,并将剩余的8KB, 16KB, 32KB的存储到相应的free list中。如果应该再请求一个10KB的内存块,分配器就会循环这个请求直至16KB,并从16KB的free list中返回一个给应用,这样也导致会有6KB内存的浪费。

如果是斐波那契buddy system就可能会使用16, 32, 48, 80, 120, 208…bytes大小的内存块,使得每个size都是前两个size之和。当分裂内存块时,得到的两个内存块size就是前两个size各一块。

buddy system优缺

一个buddy system可能性能非常好,也可能很差,这主要取决于所支持的size与内存请求的符合度以及返回内存块的模式。循环操作通常都会造成大量的内存浪费,也被称作内部碎片。但一直也可以将所支持的size差距设小来进行 改善。

0 0
原创粉丝点击