Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1362442
  • 博文数量: 343
  • 博客积分: 13098
  • 博客等级: 上将
  • 技术积分: 2862
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-06 00:35
文章存档

2012年(131)

2011年(31)

2010年(53)

2009年(23)

2008年(62)

2007年(2)

2006年(36)

2005年(5)

分类: LINUX

2008-06-01 20:45:55

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;
}

阅读(1404) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~