大家先看看内存池的相关概念:
通常我们习惯直接使用calloc、malloc等接口向系统申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。
内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。
我实现的内存池mempool是在服务器初始化阶段想系统申请指定大小和数目的内存块(在antweb配置文件中设置),并且使用链表的方式把内存块串连起来形成内存池。该内存池中的内存块用于存放客户端的请求数据和服务器的响应数据。
(1)内存块结构体:
typedef struct mb{
//指向内存块
void *memptr;
//指向下一个内存块
struct mb *next;
}memblock;
(2)内存池结构体:
typedef struct {
//指向节点首部
memblock *first;
//指向节点尾部
memblock *last;
//空闲的memblock数量
int mb_num;
} mempool;
(3)创建内存块:
memblock *memblock_create(int num)
{
memblock *temp = NULL;
if((temp = (memblock*)calloc(1,sizeof(memblock))) == NULL)
{
printf("memory is not enough...\n");
exit(1);
}
int mbsize;
//MBSIZE为内存块大小,其的值是从antweb配置文件中获取
mbsize = MBSIZE;
temp->memptr = calloc(mbsize,sizeof(char));
temp->next = NULL;
return temp;
}
(4)创建内存池:
mempool *mempool_create()
{
mempool *used;
memblock *