dlmalloc源码剖析之:sYSTRIm
版权声明: 本文章由vt.buxiu发布在,版权归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; }
|
阅读(1444) | 评论(0) | 转发(0) |