手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux Slab分配器(五)--释放对象

[日期:2012-06-18] 来源:Linux社区  作者:t0nsha [字体: ]

缓存回收对象基于以下原则

1.本地高速缓存的空间还可以容纳空闲对象,则直接将对象放回本地高速缓存

2.本地高速缓存的空间已满,则按batchcount的值将对象从本地高速缓存转移到slab中,转移是基于先进先出的原则的,也就是转移entry数组最前面的batchcount个空闲对象,因为这些对象在数组中存在的时间相对较长,不太可能仍然驻留在CPU高速缓存中

相关阅读:

Linux Slab分配器(一)--概述 http://www.linuxidc.com/Linux/2012-06/62965.htm
Linux Slab分配器(二)--初始化 http://www.linuxidc.com/Linux/2012-06/62966.htm
Linux Slab分配器(三)--创建缓存 http://www.linuxidc.com/Linux/2012-06/63109.htm
Linux Slab分配器(四)--分配对象 http://www.linuxidc.com/Linux/2012-06/63138.htm
Linux Slab分配器(六)--创建slab和销毁slab http://www.linuxidc.com/Linux/2012-06/63229.htm

释放对象通过函数kmem_cache_free()来完成,下图给出了主要的工作流程

我们以__cache_free函数作为入口进行分析

  1. static inline void __cache_free(struct kmem_cache *cachep, void *objp)  
  2. {  
  3.     struct array_cache *ac = cpu_cache_get(cachep);  
  4.   
  5.     check_irq_off();  
  6.     kmemleak_free_recursive(objp, cachep->flags);  
  7.     objp = cache_free_debugcheck(cachep, objp, __builtin_return_address(0));  
  8.   
  9.     kmemcheck_slab_free(cachep, objp, obj_size(cachep));  
  10.   
  11.     /* 
  12.      * Skip calling cache_free_alien() when the platform is not numa. 
  13.      * This will avoid cache misses that happen while accessing slabp (which 
  14.      * is per page memory  reference) to get nodeid. Instead use a global 
  15.      * variable to skip the call, which is mostly likely to be present in 
  16.      * the cache. 
  17.      */  
  18.     if (nr_online_nodes > 1 && cache_free_alien(cachep, objp))  
  19.         return;  
  20.   
  21.     /*如果本地高速缓存中的空闲对象小于空闲对象上限,则直接用entry中的元素记录对象的地址*/  
  22.     if (likely(ac->avail < ac->limit)) {  
  23.         STATS_INC_FREEHIT(cachep);  
  24.         ac->entry[ac->avail++] = objp;  
  25.         return;  
  26.     } else {/*否则将本地高速缓存中的空闲对象批量转移到slab中*/  
  27.         STATS_INC_FREEMISS(cachep);  
  28.         cache_flusharray(cachep, ac);  
  29.         ac->entry[ac->avail++] = objp;  
  30.     }  
  31. }  
linux
相关资讯       Linux内存管理 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款