首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言兑现简单内存池

2013-02-24 
C语言实现简单内存池在用C语言开发时,特别是在服务器端,内存的使用会成为系统性能的一个瓶颈,如频繁的分配

C语言实现简单内存池

在用C语言开发时,特别是在服务器端,内存的使用会成为系统性能的一个瓶颈,如频繁的分配和释放内存,会不断的增加系统的内存碎片,影响内核之后分配内存的效率,这个时候一个比较可行的做法是采用内存池,先分配好比较多的内存,然后在这个已经分配的内存里使用内存,这样就不需要内核过多的参与内存分配和释放的过程。

内存池根据应用不同有多种实现的策略,如有些分配很大的内存,然后将内存分配成大小相等的块,并将每个块链接起来进行管理。

下面对模型介绍的时候,为了简单,不加入用于调试的编写技巧和为之准备的结构,其实主要是省去间接调用,有时为了调试,会将文件及所在行以及主要的变量状态输出。

一,内存池访问接口

创建大小为size的新的内存池。

void *pool_malloc(pool_t p, int size){    void *block;    if(p == NULL)    {        fprintf(stderr,"Memory Leak! [pmalloc received NULL pool, unable to track allocation, exiting]\n");        abort();    }    if(p->heap == NULL || size > (p->heap->size / 2))    {        while((block = malloc(size)) == NULL) sleep(1);        p->size += size;        _pool_cleanup_append(p, _pool_free(p, _pool__free, block));        return block;    }    if(size >= 4)        while(p->heap->used&7) p->heap->used++; // 这一步是个对齐操作,如果已经使用的不是8的倍数,就会跳过,直到为8的倍数。    if(size > (p->heap->size - p->heap->used))        p->heap = _pool_heap(p, p->heap->size);    block = (char *)p->heap->block + p->heap->used;    p->heap->used += size; //已经使用部分增加,也会使得内存分配的偏移值指针增加。    return block;}
从上面的代码中,可以看出分配内存的策略如下:

    如果内存池中没有内存或者将要分配的内存比内存池中总的内存数一半还要大,会调用malloc向系统请求内存。并把分配的内存加入到内存池中。已分配的内存按字对齐,如果没有对齐,就会跳过不对齐部分,不对齐的部分标识为已经使用。如果链表最新的内存块内存剩余的大小不足于分配size字节,会重新请求新的内存块,并加入内存池。从链表的最后内存块分配,p->heap->used,表示内存块中已经使用的一个偏移,从这里开始分配。

热点排行