MEMCACHED(3) SLAB内存池

来源:互联网 发布:暗黑破坏神3 数据库 编辑:程序博客网 时间:2024/05/01 18:18

1. 对这个SLAB内存池实在没什么好说的,比较直白。

简单介绍一下各个参数吧。

 

2. setting的与SLAB相关的参数

  chunk_size:这是SLAB所存储的最小对象大小,包括sizeof(item) + key + value。

 item_size_max:这是SLAB所存储的最大对象大小。默认是1MB。

factor:默认系数1.25. 比如说,第一个SLAB缓存大小为32字节的对象,那么第二个SLAB缓存大小为40字节的对象。以此类推,1MB为上限。

maxbytes:内存池所能占有的内存上限。

 

3. slabclass_t中的参数

 void **slab_list;       /* array of slab pointers */
    unsigned int list_size; /* size of prev array */

可以想象成是void* slab_list[list_size];

每个SLAB槽(总共不超过200个),可以分配多个相同的SLAB页,在此管理;

每个SLAB页都是一块连续内存,大小为该SLAB槽的 size * perslab。 前者是所缓存的对象尺寸,后者是该SLAB页能存储该对象的最大个数。

 

unsigned int slabs;     /* how many slabs were allocated for this class */

上面这个参数就是所分配的页数目

 

void **slots;           /* list of item ptrs */
    unsigned int sl_total;  /* size of previous array */
    unsigned int sl_curr;   /* first free slot */

这里保存被释放的对象,显然不是连续的内存。slots改名字叫做freeslots更合适点。

sl_total表示slots数组的大小,而sl_curr表示当前可用的空闲slots,如果sl_curr等于sl_total,就需要重新分配slots了。 

 

 

 void *end_page_ptr;         /* pointer to next free item at end of page, or 0 */
    unsigned int end_page_free; /* number of items remaining at end of last alloced page */

第一个参数指向当前slab槽中可用的那个slab页;

第二个参数指示该slab页还可以缓存多少个对象。

原创粉丝点击