C语言内存池使用模型
C语言内存池使用模型
在用C语言开发时,特别是在服务器端,内存的使用会成为系统性能的一个瓶颈,如频繁的分配和释放内存,会不断的增加系统的内存碎片,影响内核之后分配内存的效率,这个时候一个比较可行的做法是采用内存池,先分配好比较多的内存,然后在这个已经分配的内存里使用内存,这样就不需要内核过多的参与内存分配和释放的过程。
内存池根据应用不同有多种实现的策略,如有些分配很大的内存,然后将内存分配成大小相等的块,并将每个块链接起来进行管理。
下面对模型介绍的时候,为了简单,不加入用于调试的编写技巧和为之准备的结构,其实主要是省去间接调用,有时为了调试,会将文件及所在行以及主要的变量状态输出。
一,内存池访问接口
创建大小为size的新的内存池。
- pool_t _pool_new_heap(int 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;
- };
- block 用于指向由malloc所分配的内存地址。
- size 表示block所指向地址的内存大小。
- used 表示多少处于已经使用的状态。在分配内存时,这个域很重要,它表示内存块可以被分配的偏移值,也就是从used开始的内存都是可以被从内存池中分配出去的。
- struct pfree
- {
- pool_cleanup_t f;
- void *arg;
- struct pheap *heap;
- struct pfree *next;
- };
- typedef void (*pool_cleanup_t)(void *arg);
- 实现内存块的链表,用struct pfree *next连接起来,这是一个单链表。
- 内存块释放的回调。注册在释放内存时,如果释放这个内存块,主要是通过pool_cleanup_t f和void *arg两个域来完成这个功能。
- 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:表示内存池中内存的大小,包括所有的内存块。
这个结构的主要功能如下:
- 管理内存块。通过cleanup和clean_tail两个指针,因为内存块在内存池中是以单链表的形式组织的,这两个指针分别指向链表的头和尾指针。
- 内存池中可用的内存大小。通过size域来统计完成。
- 获取最新的内存块指针。通过heap指针在每次分配内存块时重新赋值来实现。
|
评论暂时关闭