内存池
# 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
编辑 (opens new window)
上次更新: 2023/12/11, 22:32:09