Memcached源码阅读八 内存池

  • 2021-01-11
  • 浏览 (109)

Memcached源码阅读八 内存池

Memcached内部维护了一个内存池来减少频繁的mallocfree,在该内存池的基础上面实现了slab内存管理,下面简单介绍下内存池的实现,大家在实现类似结构时,可以做个参考。

static void *mem_base = NULL;//mem_base指向新申请的内存空间,指向整个内存空间的头部
static void *mem_current = NULL;//指向已经分配过的空间,且指向已经分配了空间的尾部
static size_t mem_avail = 0;//剩余空间大小

//部分初始化操作
mem_limit = limit;//初始容量
mem_base = malloc(mem_limit);//申请内存空间

if (mem_base != NULL) //如果不为空
{   
      mem_current = mem_base;
      //当前还没分配,所以其指向为整个空间
      mem_avail = mem_limit;
      //可用空间为满
} else {
       fprintf(stderr, "Warning: Failed to allocate requested memory in"
                    " one large chunk.\nWill allocate in smaller chunks\n");
}

//分配空间的过程,分配size大小的空间
static void *memory_allocate(size_t size) {
    void *ret;

    //如果未初始化
    if (mem_base == NULL) {
        ret = malloc(size);
    } else {
        ret = mem_current;

        if (size > mem_avail) {
            return NULL;
        }

        //执行对齐操作
        if (size % CHUNK_ALIGN_BYTES) {
            size += CHUNK_ALIGN_BYTES - (size % CHUNK_ALIGN_BYTES);
        }

        mem_current = ((char*)mem_current) + size;
        if (size < mem_avail) {
            mem_avail -= size;
        } else {
            mem_avail = 0;
        }
    }

    return ret;
}