C语言内存池使用模型
作者:网络转载 发布时间:[ 2012/9/29 15:31:32 ] 推荐标签:
这个结构的主要功能如下:
1、管理内存块。通过cleanup和clean_tail两个指针,因为内存块在内存池中是以单链表的形式组织的,这两个指针分别指向链表的头和尾指针。
2、内存池中可用的内存大小。通过size域来统计完成。
3、获取新的内存块指针。通过heap指针在每次分配内存块时重新赋值来实现。
这个内存池的实现,主要是依靠上面三个数据结构来完成,其实估计已经知道的差不多了。下面再讨论一些基本的
三、创建一个空的内存池
创建一个空的内存池比较简单,是初始化一个内存池结构,也是pool_t结构,并将其链表置为NULL,大小为0,不包含任何的内存块。
pool_t _pool_new()
{
pool_t p;
while((p = malloc(sizeof(_pool))) == NULL) sleep(1);
p->cleanup = NULL;
p->heap = NULL;
p->size = 0;
return p;
}
四、创建指定大小的内存池
创建一个包含大小为size内存块的内存池,这个操作分两步,先创建一个空的内存池,然后再创建一个内存块,并将该内存块加入内存池中,也是将内存块加到内存池的链表末尾,并重新设定指针。
pool_t _pool_new_heap(int size)
{
pool_t p;
p = _pool_new();
p->heap = _pool_heap(p,size);
return p;
}
第一步是先调用_pool_new创建一个空的内存池结构,这个前面已经说明了,操作很简单。看第二步是怎么完成的
static struct pheap *_pool_heap(pool_t p, int size)
{
struct pheap *ret;
struct pfree *clean;
while((ret = _pool__malloc(sizeof(struct pheap))) == NULL) sleep(1);
while((ret->block = _pool__malloc(size)) == NULL) sleep(1);
ret->size = size;
p->size += size;
ret->used = 0;
clean = _pool_free(p, _pool_heap_free, (void *)ret);
clean->heap = ret; /* for future use in finding used mem for pstrdup */
_pool_cleanup_append(p, clean);
return ret;
}
第二步包含下面一些操作:
1、申请一个大小为size的内存块,也是前方中介绍的pheap结构。
2、把这个内存块的大小size,加到内存池上,是那个p->size += size;
3、将内存块关联到struct pfree结构。这会指示内存释放的方式,也把内存加入到链表元素上。
4、将struct pfree结构关联到内存池,其实是加到链表的末尾。
下面会讨论第3和第4部是怎么实现的。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11