功能描述:
改变一个进程数据段的大小。当系统有足够的内存,且进程没有超出允许它的最大数据段.
用法:
#include
int brk(void *end_data_segment);
void *sbrk(intptr_t increment);
参数:
end_data_segment:数据段的新终点
increment:当前进程数据段将会被增加的量
返回说明:
成功执行时,brk()返回0,sbrk()返回新区域起点的指针。失败返回-1,errno被设为以下值 ENOMEM: 核心内存不足
2.系统调用 mallopt(int parameter_number, int parameter_value)
功能描述:
使用 mallopt 调整一些参数的值(malloc.h),如 M_TRIM_THRESHOLD(返回给 OS 的内存的一个阈值)、M_MMAP_THRESHOLD(大于此值的内存分配请求使用 mmap 系统调用)等等。
其实的malloc的实现并非简单调用brk/sbrk,为了考虑效率glibc有“三级”优化措施,即:
“小内存”分配通过 fastbin 链表实现;
一般的内存分配在堆上分配,该区域称为:memory arena;
比较大(比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的数目;
实例:mallopt-trim.c
事实上以上参数能够通过相应的环境变量来设定而不必修改程式,比如:
MALLOC_TRIM_THRESHOLD_=1024 ./program
3.主要文件说明
structs.h --- 主要的数据结构定义:链表、SSL、内存、认证、Http相关结构、内存对象等
mem.c ---
MemBuf.c ---
leakfinder.c ---