memcached 分析

/* powers-of-N allocation structures */

typedef struct {
    unsigned int size;      /* sizes of items */
    unsigned int perslab;   /* how many items per slab */

    void **slots;           /* list of item ptrs */ 空闲块的指针数组,跨页面
    unsigned int sl_total; /* size of previous array */
    unsigned int sl_curr;   /* first free slot */ 空闲块的个数,跨页面

    void *end_page_ptr;         /* pointer to next free item at end of page, or 0 */ 每页是1M
    unsigned int end_page_free; /* number of items remaining at end of last alloced page */ 每个页面内还有有空闲块

    unsigned int slabs;     /* how many slabs were allocated for this class */ 页面的个数

    void **slab_list;       /* array of slab pointers */ 页面的指针数组
    unsigned int list_size; /* size of prev array */

    unsigned int killing; /* index+1 of dying slab, or zero if none */
    size_t requested; /* The number of requested bytes */
} slabclass_t;

static slabclass_t slabclass[MAX_NUMBER_OF_SLAB_CLASSES];

slabclass_t 这个结构体定义了一个大小相等的要分配的空间的集合,就是说 slabclass_t

slabclass 是一个全局数组,按照从小到大顺序排列,每个元素代表分配的大小,分配时就是从这个数据进行查找,初始化时,按用户规定的最小值,乖以一个factor,依次增大,最大的能分配对象是1M

在回收空间时,就是记录在了slabclass_t->slots里面后就不释放了,并不是真正的释放空间,所以是一直审请,不释放的,内存迟早要耗光

 

分配1M的页面的时候,一种是每次用malloc,另一种是预先分配一块大内存,每次都从预先分配的分配。

平时使用的时候几乎没有封锁,对于多线程的时候,只是用pthread_mutex封锁了对应的get, put , replace的封锁,而且只有一个全局锁,没锁的级别与分类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值