这个结构的主要功能如下:
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) while((ret = _pool__malloc(sizeof(struct pheap))) == NULL) sleep(1); clean = _pool_free(p, _pool_heap_free, (void *)ret); return ret; |
第二步包含下面一些操作:
1、申请一个大小为size的内存块,也就是前方中介绍的pheap结构。
2、把这个内存块的大小size,加到内存池上,就是那个p->size += size;
3、将内存块关联到struct pfree结构。这会指示内存释放的方式,也把内存加入到链表元素上。
4、将struct pfree结构关联到内存池,其实就是加到链表的末尾。
下面会讨论第3和第4部是怎么实现的。