![](https://csdnimg.cn/release/download_crawler_static/88351228/bg4.jpg)
分为若干个 chunk,每个 chunk 里保存一个 item,每个 item 同时包含了 item 结构体、key 和 value(注意
在 memcached 中的 value 是只有字符串的)。slab 按照自己的 id 分别组成链表,这些链表又按 id 挂在一
个 slabclass 数组上,整个结构看起来有点像二维数组。slabclass 的长度在 1.1 中是 21,在 1.2 中是 200。
slab 有一个初始 chunk 大小,1.1 中是 1 字节,1.2 中是 80 字节,1.2 中有一个 factor 值,默认为 1.25
在 1.1 中,chunk 大小表示为初始大小*2^n,n 为 classid,即:id 为 0 的 slab,每 chunk 大小 1 字节,id
为 1 的 slab,每 chunk 大小 2 字节,id 为 2 的 slab,每 chunk 大小 4 字节……id 为 20 的 slab,每 chunk
大小为 1MB,就是说 id 为 20 的 slab 里只有一个 chunk:
CODE:
[Copy to clipboard]
void slabs_init(size_t limit) {
int i;
int size=1;
mem_limit = limit;
for(i=0; i<=POWER_LARGEST; i++, size*=2) {
slabclass[i].size = size;
slabclass[i].perslab = POWER_BLOCK / size;
slabclass[i].slots = 0;
slabclass[i].sl_curr = slabclass[i].sl_total = slabclass[i].slabs = 0;
slabclass[i].end_page_ptr = 0;
slabclass[i].end_page_free = 0;
slabclass[i].slab_list = 0;
slabclass[i].list_size = 0;
slabclass[i].killing = 0;
}
/* for the test suite: faking of how much we've already malloc'd */
{
char *t_initial_malloc = getenv("T_MEMD_INITIAL_MALLOC");
if (t_initial_malloc) {
mem_malloced = atol(getenv("T_MEMD_INITIAL_MALLOC"));
}
}
/* pre-allocate slabs by default, unless the environment variable
for testing is set to something non-zero */
{
char *pre_alloc = getenv("T_MEMD_SLABS_ALLOC");
if (!pre_alloc || atoi(pre_alloc)) {
slabs_preallocate(limit / POWER_BLOCK);
}