其实的malloc的实现并非简单调用brk/sbrk,为了考虑效率glibc有“三级”优化措施,即:
l “小内存”分配通过 fastbin 链表实现;
l 一般的内存分配在堆上分配,该区域称为:memory arena;
l 比较大(比M_MMAP_THRESHOLD设定的值更大)的内存采用mmap分配,采用mmap的好处在于free后立即交还给系统,而不会被锁定而浪费内存;
在程序调用free时,glibc并不会每次调用sbrk,相反glibc会把放到暂时的内存池中,以提供下一次malloc的操作使用,这样可以达到内存分配效率的优化。
控制内存分配的函数是mallopt,其原型如下:
|
int mallopt(int cmd, int __val); |
cmd的取值为:
|
M_TRIM_THRESHOLD -1
M_TOP_PAD -2
M_MMAP_THRESHOLD -3
M_MMAP_MAX -4
M_CHECK_ACTION -5
M_PERTURB -6 |
其含义如下:
M_TRIM_THRESHOLD
当可以被释放的内存堆积到该值时进行正真的释放(sbrk)操作;
M_TOP_PAD
内存分配时头部的附加长度。如果程序调用malloc分配1024k内存,但glibc并不会仅仅分配1024k,还需分配更多的内存(一部分用来进行glibc自身的内存分配管理使用)。
M_MMAP_THRESHOLD
如果需要分配的内存超过该值,glibc将采用mmap分配内存。
M_MMAP_MAX
用来控制最多的mmap的数目;
事实上以上参数可以通过相应的环境变量来设定而不必修改程序,比如:
|
MALLOC_TRIM_THRESHOLD_=1024 ./program |