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;
}
这里没有释放的操作,大家可以参考分配来写,你从这个过程可以看到,内存池的实现其实不难,关键要去思考,去学习。