C语言内存池使用模型

发表于:2012-9-29 10:03

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:欣宇的专栏    来源:51Testing软件测试网采编

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

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

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

  一、内存池访问接口

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

pool_t _pool_new_heap(int size);

  从指定内存池中分配大小为size的内存空间,这些空间会在内存池释放时,被自动的释放。

void *pool_malloc(pool_t, int size);

  内存池的大小,返回内存池中所有内存块的大小总和

int pool_size(pool_t p);

  释放内存池,这会导致所有内存被释放,同时内存池本身也被释放

void pool_free(pool_t p);

  还有其它的一些接口,但这些是主要的接口。

  二、数据结构

struct pheap
{
    void *block;
    int size, used;
};

  该结构表示内存池中一个内存块的抽象表示,

  1、block 用于指向由malloc所分配的内存地址。

  2、size 表示block所指向地址的内存大小。

  3、used 表示多少处于已经使用的状态。在分配内存时,这个域很重要,它表示内存块可以被分配的偏移值,也就是从used开始的内存都是可以被从内存池中分配出去的。

struct pfree
{
    pool_cleanup_t f;
    void *arg;
    struct pheap *heap;
    struct pfree *next;
};
typedef void (*pool_cleanup_t)(void *arg);

  这个结构用于实现一个链表,将所有的内存块链接起来。每一个内存块,对映一个这个结构,也就是每个struct pheap结构,都有一个struct pfree结构将其封装起来,这个结构主要实现下面几个功能:

  1、实现内存块的链表,用struct pfree *next连接起来,这是一个单链表。

  2、内存块释放的回调。注册在释放内存时,如果释放这个内存块,主要是通过pool_cleanup_t f和void *arg两个域来完成这个功能。

  3、pheap域用于指向需要被放入链表的内存块,就是前面的结构。

typedef struct pool_struct
{
    int size;
    struct pfree *cleanup;
    struct pfree *cleanup_tail;
    struct pheap *heap;
} _pool, *pool_t;

  结构中的域代表如下:

  heap:指向内存池中最新申请的内存块,在每次申请内存块时,都会将其指向新的内存块。

  cleanup和cleanup_tail:指向链表的头和尾的指针。

  size:表示内存池中内存的大小,包括所有的内存块。

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号