memcache slabs .

来源:互联网 发布:java游戏开发技术 编辑:程序博客网 时间:2024/05/01 00:56

http://blog.csdn.net/benbendy1984/article/details/6216453

  memcache 使用slab机制对内存进行分配和管理的。

 

一 整体结构

 

       把内存分成多个层次,在每个层次中,可以有多个page, 所有层次的page大小基本是一直的(为什么不相同,后面介绍),每个page中又分成相同大小的item,里面有多少个item,取决于page大小和item所在的层次,其中相邻层次直接item大小具有如下关系

                                     size(item: n+1 )  = size( item: n) * grow_factor  

       其中的grow_factor 是可配置的参数。

       在内存分配时,如果需要大小为k的空间,那么就从第n个层次中得到一个item ,其中n需要满足

                                           size(item:n-1)  <   k  <=  size(item:n)

       那么从n个层次中的这么多个item中取哪个?所有被取光了怎么办?使用完了释放了怎么办? 这些都会在后面进行详细的介绍

 

 

二 结构成员

 

 

三 函数介绍

 

3.1 slabs_clsid()

[cpp] view plaincopyprint?
  1. /* 
  2.  * Figures out which slab class (chunk size) is required to store an item of 
  3.  * a given size. 
  4.  * 
  5.  * Given object size, return id to use when allocating/freeing memory for object 
  6.  * 0 means error: can't store such a large object 
  7.  * 根据大小,返回满足条件的item所在的层次  
  8.  */  
  9.   
  10. unsigned int slabs_clsid(const size_t size) {  
  11.     int res = POWER_SMALLEST;  
  12.   
  13.     if (size == 0)  
  14.         return 0;  
  15.     while (size > slabclass[res].size)  
  16.         if (res++ == power_largest)     /* won't fit in the biggest slab */  
  17.             return 0;  
  18.     return res;  
  19. }  

 

3.2 slabs_init

 

3.3 slabs_preallocate

 

3.4  grow_slab_list

 

 

 

3.5 do_slabs_newslab

 

 

3.6  do_slabs_alloc

 

3.7 do_slabs_free

[c-sharp] view plaincopyprint?
  1. //释放一个item空间   
  2. //把释放的空间放到空闲的slot中,不过有可能出现空闲slot不够的情况,对slot进行扩大  
  3. static void do_slabs_free(void *ptr, const size_t size, unsigned int id) {  
  4.     slabclass_t *p;  
  5.   
  6.     assert(((item *)ptr)->slabs_clsid == 0);  
  7.     assert(id >= POWER_SMALLEST && id <= power_largest);  
  8.     if (id < POWER_SMALLEST || id > power_largest)  
  9.         return;  
  10.   
  11.     MEMCACHED_SLABS_FREE(size, id, ptr);  
  12.     p = &slabclass[id];  
  13.  
  14. #ifdef USE_SYSTEM_MALLOC   
  15.     mem_malloced -= size;  
  16.     free(ptr);  
  17.     return;  
  18. #endif   
  19.     //空闲slot空间不够,进行扩大   
  20.     if (p->sl_curr == p->sl_total) { /* need more space on the free list */  
  21.         int new_size = (p->sl_total != 0) ? p->sl_total * 2 : 16;  /* 16 is arbitrary */  
  22.         void **new_slots = realloc(p->slots, new_size * sizeof(void *));  
  23.         if (new_slots == 0)  
  24.             return;  
  25.         p->slots = new_slots;  
  26.         p->sl_total = new_size;  
  27.     }  
  28.     p->slots[p->sl_curr++] = ptr;  
  29.     p->requested -= size;  
  30.     return;  
  31. }  

 

四 总结

 

优点:  通过不同层次的item,以及空闲item维护,可以降低请求过程中内存的分配和释放,提高效率

 

缺点: 1 每次使用的item可能大于时间需求空间量,导致内存浪费。

 

 

 

五 参考

 

http://blogold.chinaunix.net/u1/56406/showart_2331017.html     memcache探索之slabs

 

http://tech.idv2.com/2008/07/11/memcached-002/    理解memcache内存机制