Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68158
  • 博文数量: 19
  • 博客积分: 425
  • 博客等级: 下士
  • 技术积分: 239
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-08 15:35
文章分类

全部博文(19)

文章存档

2012年(2)

2011年(17)

我的朋友

分类: LINUX

2011-10-08 15:37:41

Free过程

1、             首先free根据提供的ptr指针,获得此ptr所在的页面,然后利用页面号,获取需要释放的objsize,这个size首先从pagemap_cache_中拿,如果不在pagemap_cache_中那么直接通过页面好获取所在的span,如果spanNULL,那么直接报错返回,否则通过span获取需要释放的objsize,并将sizepage的关系放入pagemap_cache_

2、             如果能够获取ptr所指objsize,且本释放是在子线程内(可以获取threadcache),那么调用threadcacheDeallocate释放,转到一下步。否则利用InsertRange直接将obj插入Centralcache对应sizefreelist。如果ptr所指的obj size0,有可能是大的obj,直接从pageheap中拿的,那么跳第5步。

3、             Threadcache通过相应的size获得对应的freelist,然后通过pushobj链入freelist。如果插入之后的list太长将通过ReleaseToCentralCachenum_objects_to_moveobj返还给CentralCache,如果整个threadcachesize太大,那么将对整个free数组进行遍历,调用ReleaseToCentralCache函数。

4、             ReleaseToCentralCache将通过对应CentralCachefreelist调用InsertRange将需要返还给CentralCacheobjs插入CentralCacheCentralCache判断所返还的obj数量是不是正好等于num_objects_to_move,如果是且slots_里面有空闲区,那么直接返还给slots_,否则将这些obj返回给相应的Span,如果本Span通过返还之后已经是有freeobj了,将此Spanempty_列表转移到nonempty_列表,如果此Span已经全部空闲了,没有还在被使用的obj,那么通过Static::pageheap()->Delete返还给pageheap

5、             Pageheap通过Delete函数将返还回来Span的相关参数清零,并设置当前SpanON_NORMAL_FREELIST。然后判断此Span能不能和前后相邻的Span合并,然后将Span插入相应sizenormal队列,最后判断是否需要回收,如果需要,尝试回收至少一个页面,回收动作主要讲Spannormal列表转移到return列表,并调用TCMalloc_SystemRelease将页面标记为可回收的,然后通过系统调用madvise(reinterpret_cast(new_start), new_end - new_start,                   MADV_DONTNEED)将物理内存返回给系统,而保留虚拟内存。

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