博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

飞翔,嵌入式linux

linux嵌入式系统必将大行于天下。专注于linux嵌入式系统的搭键,专注于高效稳定软件的开发,专注底层程序调试技术。
  feixiang.cublog.cn

关于作者
姓名:飞翔
Email:loughsky@sina.com
职业:IT
年龄:32
位置:北京
个性介绍:专注在嵌入式操作系统,以及高效程序调试
|| << >> ||
我的分类


控制内存分配

其实的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的数目;

实例:mallopt-trim.c

 

事实上以上参数可以通过相应的环境变量来设定而不必修改程序,比如:

MALLOC_TRIM_THRESHOLD_=1024  ./program


发表于: 2008-01-12,修改于: 2008-01-12 22:42,已浏览860次,有评论0条 推荐 投诉


网友评论
 发表评论