memcached内存的分配和空闲chunk的管理_学着站在巨人的肩膀上_百度空间

Memcached作为一个主要用作访问加速的不落地Cache,其内存主要是使用程序上的堆内存(heap memory),而且内存一旦分配不再释放;同时为了加速对对应内存块访问,采用了Hash桶管理内存的方式;在数据淘汰算法方面使用了LRU

Memcached的内存分配是按照对于相同的页大小(1MB)分割成相同大小的Chunk实现的,对于不同的slab组,只是体现在具体的Chunk大小不同,每一组slab可以包含若干多的页内存。slab组的定义如下:

static slabclass_t slabclass[POWER_LARGEST+1];

所有的内存分配都给予这个全局静态变量,下边说明一下单个slabclass结构体中各个变量的定义:

typedef struct {

unsigned int size;

unsigned int perslab;

void **slots;

unsigned int sl_total;

unsigned int sl_curr;

void *end_page_ptr;

unsigned int end_page_free;

unsigned int slabs;

void **slab_list;

unsigned int list_size;

unsigned int killing;

} slabclass_t;

size:指当前slabclass中页内存中chunk块的大小,也就是单个item的大小;

perslab:指一个页内存中可以划分为多少个chunk块,大小为1M/2^currentIdcurrentId指的是当前slabslabclass的数组索引号。

slots:指向free chunk块的指针数组,slots的指针指向一个void *的数组,该数组中的每一个元素的内容均指向一个空闲的chunk块,而且相同slabclass上的所有slab中的free chunk块均挂接到这个链表上;

sl_total:当前slots指针数组的大小,如果大小不够则将以2*sl_total的大小重新分配;

sl_curr:指向当前空闲数组链表的{dy}个可用位置;

end_page_ptr:指向当前slabclass中{zh1}分配的内存页的{dy}个可用chunk的地址,或者指向NULL表示目前的内存页已经用完;

end_page_free:当前slabclass中{zh1}分配的内存也中下一个可用chunk的索引位置;

slabs:当前slabclass中分配的页内存个数;

slab_list:当前slabclass所分配的页内存(slab)的指针数组,每一个数组元素的内容均是一个指向页内存地址的指针;

list_size:当前分配的内存页的个数;

killing:在slab assign的过程中会用到。

在分配一个chunk块的时候,原则上是先从slots上查找空闲的chunk块指针,如果没有找到那么需要从slabclass中的已分配内存页上需找{dy}个可用的chunk块,如果仍然没有找到则给当前slabclass分配另外的一个内存页,并分配该页上的{dy}个chunk块。当释放一个chunk块的时候,将slot上的{zh1}一个空闲位置的指针的值赋值为该chunk块的指针,这样以来chunk块只会从slabclass的页内存转移到空闲chunk列表上。

http://blog.sina.com.cn/s/blog_4d6f62190100gwiz.html



郑重声明:资讯 【memcached内存的分配和空闲chunk的管理_学着站在巨人的肩膀上_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——