| |
| dlmalloc源码剖析之:sYSTRIm |
|
| 来源:
ChinaUnix博客 日期:
2008.06.01 20:45 (共有条评论) 我要评论 |
| |
dlmalloc源码剖析之:sYSTRIm
版权声明: 本文章由vt.buxiu发布在
www.vtzone.org
,版权归vtzone研究小组所有,转载请保持此声明!!!
@@内容摘要:
sYSTRIm函数用于合并fastbin中的空闲内存块,是doug lea malloc(dlmalloc)重要的函数之一。本文以dlmalloc2.7.0版本为基础,先以伪代码的形式介绍sYSTRIm函数的主要流程。@@
/*
传递负参数调用sbrk,将top不用的内存归还OS。通过free()自动调用
也可由附加功能函数malloc_trim调用
*/
static int sYSTRIm(size_t pad, mstate av)
{
//计算多余的内存,至少保留一页不释放
extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz;
if (extra > 0) {//有多余的内存才释放
//获得当前heap顶部地址
current_brk = (char*)(MORECORE(0));
//只有top尾部是以前自己调用sbrk扩展的时候才进行trim,避免其他进程调用sbrk发生问
//也就是说如果top目前是mmap获得的,不会进行trim;
//如果当前的top与以前的top之间不连续,只会trim当前的top,以前的top没法释放了
if (current_brk == (char*)(av->top) + top_size) {
//释放内存给OS
MORECORE(-extra);
//获得新的heap顶部地址
new_brk = (char*)(MORECORE(0));
released = (long)(current_brk - new_brk);//实际释放了这么多内存
if (released != 0) {
//根据实际释放的内存,调整top指针
av->sbrked_mem -= released;
set_head(av->top, (top_size - released) | PREV_INUSE);
check_malloc_state();
return 1;
}
}
}
//release nothing
return 0;
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/8059/showart_723224.html
|
| 发表评论
查看评论(共有条评论)
我要提问
|
| |
|
|
|