tongy 发表于 2015-11-19 00:02:13

Memcached源码分析之内存池

  Memcached内部维护了一个内存池来减少频繁的malloc和free,在该内存池的基础上面实现了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;
}
这里没有释放的操作,大家可以参考分配来写,你从这个过程可以看到,内存池的实现其实不难,关键要去思考,去学习。
  

版权声明:本文为博主原创文章,未经博主允许不得转载。
页: [1]
查看完整版本: Memcached源码分析之内存池