`

memcached slabs内存分配算法详解

 
阅读更多

[liexusong原创]

Memcached Slab算法是根据powers of 2来将1MB的内存块划分成多个小内存块, 而这1MB的内存块称为页:

 

Powers of 22n次方的意思,例如:20次方是121次方是222次方是423次方是8等等。

而将1MB的内存按2n次方划分可以划分成20种不同的内存块,因为220次方是1MB1048576)。所以可以说,memcached管理着20种不同的内存块的集合。

memcached <wbr>slabs内存分配算法详解

memcached是通过slabclass_t结构体来管理这些小内存块的, slabclass_t的定义如下:

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;

 

(1)   slots指针指向的是内存分配器回收的小内存块的数组, sl_total保存了回收器的容量, 当回收器容量不足时, 需要重新分配更大的内存来作为回收器, sl_curr是当前回收器回收到的位置, 下一个回收的内存块就会放到这里:


memcached <wbr>slabs内存分配算法详解

(2)   end_page_ptr保存的是当前的空闲内存块, end_page_free保存的是当前空闲块的数量, 如果end_page_free等于0表示已经没有空闲内存块了, 需要向系统申请一块新的内存页.

memcached <wbr>slabs内存分配算法详解


(3)  
 slab_list保存的是申请的内存页, slabs保存的是已经申请的内存页数量. memcached <wbr>slabs内存分配算法详解

所以综合起来的总体结构图:


memcached <wbr>slabs内存分配算法详解

slab分配函数(slabs_alloc):

if (! (p->end_page_ptr || p->sl_curr || slabs_newslab(id)))

    return 0;

 

 

 

if (p->sl_curr)

    return p->slots[--p->sl_curr];

 

 

if (p->end_page_ptr) {

    void *ptr = p->end_page_ptr;

    if (--p->end_page_free) {

        p->end_page_ptr += p->size;

    } else {

        p->end_page_ptr = 0;

    }

    return ptr;

}

 

函数中首先判断是否有空闲内存块, 或者回收过的内存块, 如果都没有就调用slabs_newslab()新建一个内存页; 然后优先分配回收过的内存块, 如果没有才去分配空闲的内存块.

 

slabs_newslab()函数是新建一个内存页.

int slabs_newslab(unsigned int id) {

    slabclass_t *p = &slabclass[id];

    int num = p->perslab;

    int len = POWER_BLOCK;

    char *ptr;

 

    if (mem_limit && mem_malloced + len > mem_limit)

        return 0;

 

    if (! grow_slab_list(id)) return 0;

  

    ptr = malloc(len);

    if (ptr == 0) return 0;

 

    memset(ptr, 0, len);

    p->end_page_ptr = ptr;

    p->end_page_free = num;

 

    p->slab_list[p->slabs++] = ptr;

    mem_malloced += len;

    return 1;

}

 

slabs_newslab()每次分配1MB作为内存页. 然后把end_page_ptr指向这个新的内存页.

 

 

slab回收函数(slabs_free):

void slabs_free(void *ptr, unsigned int size) {

    unsigned char id = slabs_clsid(size);

    slabclass_t *p;

 

    if (id < POWER_SMALLEST || id > POWER_LARGEST)

        return;

 

    p = &slabclass[id];

    if (p->sl_curr == p->sl_total) {

        int new_size = p->sl_total ? p->sl_total*2 : 16; 

        void **new_slots = realloc(p->slots, new_size*sizeof(void *));

        if (new_slots == 0)

            return;

        p->slots = new_slots;

        p->sl_total = new_size;

    }

    p->slots[p->sl_curr++] = ptr;

    return;

}

 

回收时, 直接用回收器(slots)的指针指向这个内存块, 这样就完成回收操作. 如果回收器不够大, 就扩充回收器.


分享到:
评论

相关推荐

    memcached的内存分配代码

    本文将深入探讨memcached的内存分配代码,理解其背后的机制,并讨论如何通过优化内存分配来提升系统的性能。 在Memcached中,内存管理是至关重要的,因为它直接影响到服务的性能和效率。memcached采用了一种特殊的...

    Memcached内存分配与SLAB机制

    ### Memcached内存分配与SLAB机制 #### 第1章 前言 本文将深入探讨Memcached中的内存分配原理及SLAB机制的核心概念。通过详细分析Memcached如何管理内存资源,帮助读者理解其高效内存利用背后的逻辑。 #### 第2章...

    Memcached_原理和使用详解

    Memcached_原理和使用详解,memcache的配置和使用

    Memcached 原理和使用详解

    4. **自主内存管理**:Memcached内部管理内存,自动处理内存分配和回收,无需外部干预。 5. **分布式存储**:数据分布在多个服务器上,通过键值对的方式实现数据的定位和分发,每个实例独立管理自己的数据。 **安装...

    Memcached的原理和使用详解

    Memcached采用了一种称为“slab allocator”的内存分配机制,它可以预先分配不同大小的内存块,并根据键值对的大小自动选择合适的内存块进行存储。这样既避免了频繁的小内存分配和回收带来的性能开销,也提高了内存...

    04-memcached内存分配机制.wmv

    04-memcached内存分配机制.wmv

    Memcached 内存分析、调优、集群

    ### Memcached内存分析、调优、集群 ...通过对内存分配机制、性能优化技巧以及集群部署策略的理解,可以有效地提升Web应用的整体性能。未来随着技术的发展,Memcached也将不断演进,更好地满足不同场景下的需求。

    Memcached——内存数据库讲义及安装步骤

    - `memcached-tool`: 用于查看和管理Memcached服务器状态,如`memcached-tool 127.0.0.1:11211 display`显示slabs和items用量,`memcached-tool 127.0.0.1:11211 stats`显示服务器统计信息。 **4. Memcached命令及...

    Memcached内存分配与SLAB机制[借鉴].pdf

    本文主要探讨的是Memcached中的核心内存分配机制——SLAB(Simple Large Object)机制。 ### 第 2 章 SLAB 机制 SLAB机制是Memcached为了高效管理内存而设计的一种内存分配策略。传统的内存分配方式在处理小块内存...

    memcached原理和使用详解

    资源名称:memcached原理和使用详解内容简介: Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库...

    Memcached基于Linux的安装详解以及需要的jar包

    Memcached是一种高性能、分布式内存对象缓存系统,用于在分布式计算环境中缓解数据库负载,提高应用程序的性能。在Linux操作系统上安装Memcached涉及多个步骤,包括下载源码、编译、配置以及启动服务。以下是详细的...

    Memcached内存分析、调优、集群

    Memcached采用内置的内存存储方式,如slab和LRU算法,确保了高效率的数据存取。 #### 2. Memcached的使用:安装、启动与命令统计 ##### 安装Memcached Memcached的安装依赖于libevent库,因此在安装前需要先安装...

    memcached详解.pdf

    本书《memcached详解》由长野雅广和前坂徹共同撰写,旨在深入解析这个在Web应用程序可扩展性中扮演重要角色的内存缓存系统——memcached。作者通过丰富的经验和实践,为我们提供了详尽的技术指导,帮助读者理解和...

    Memcached源码分析之内存管理

    Memcached源码分析之内存管理Memcached源码分析之内存管理

    Memcached Java Client API详解

    Memcached Java Client API详解.doc

    memcached高性能内存k-v缓存服务器

    memcached介绍 memcached安装 memcached操作 内存存储机制 数据过期与删除机制 php操作memcached 多服务器集群算法 缓存无底洞效应 缓存雪崩 老数据被踢现象 结课作业

Global site tag (gtag.js) - Google Analytics