1.1
在给定的内存buffer上建立内存管理机制,根据用户需求从该buffer上分配内存或者将已经分配的内存释放回buffer中。
1.2
尽量减少内存碎片,平均效率高于C语言的malloc和free。
1.3
将buffer分为四部分,第1部分是mem_pool结构体;第2部分是内存映射表;第3部分是内存chunk结构体缓冲区;第4部分是实际可分配的内存区。整个buffer结构图如图1所示:
第1部分的作用是可以通过该mem_pool结构体控制整个内存池。
// 内存池结构体
typedef struct MEMORYPOOL
{
void *memory;//实际可分配内存区4
size_t size;//实际可分配内存大小
memory_block* pmem_map; //内存映射2
memory_chunk* pfree_mem_chunk;//双向链表3.2?
memory_chunk* pfree_mem_chunk_pool;//双向链表3.1?
size_t mem_used_size; // 记录内存池中已经分配给用户的内存的大小
size_t mem_map_pool_count; // 记录链表单元缓冲池中剩余的单元的个数,个数为0时不能分配单元给pfree_mem_chunk
size_t free_mem_chunk_count; // 记录 pfree_mem_chunk链表中的单元个数
size_t mem_map_unit_count; //
size_t mem_block_count; // 一个 mem_unit 大小为 MINUNITSIZE
}MEMORYPOOL, *PMEMORYPOOL;
第2部分的作用是记录第4部分,即实际可分配的内存区的使用情况。表中的每一个单元表示一个固定大小的内存块(block),多个连续的block组成一个chunk.
//内存映射
typedef struct memory_block
{
size_t count;//该block后面的与该block同属于一个chunk的block的个数
size_t start;//该block所在的chunk的起始block索引
memory_chunk* pmem_chunk;
}memory_block;
第3部分是一个mem_chunk pool,其作用是存储整个程序可用的mem_chunk结构体。mem_chunk pool中的mem_chunk被组织成双向链表结构(快速插入和删除)。
// 可用的内存块结构体,,内存池链表
typedef struct memory_chunk
{
memory_block* pfree_mem_addr;//
memory_chunk* pre;
memory_chunk* next;
}memory_chunk;
第4部分就是实际可以被分配给用户的内存。
1.4 内存池管理程序运行过程
初始化:内存映射表中只有一块可用的内存信息,大小为内存池中所有可用的内存。从memory chunk pool中分配一个mem_chunk,使其指向内存映射表中的第一个block,并根据具体的内存池实现方式填充mem_chunk中的其他域,然后将该mem_chunk添加到memory chunk set中。
申请内存:当用户申请一块内存时,首先在memory chunk set中查找合适的内存块。如果找到符合要求的内存块,就在内存映射表中找到相应的chunk,并修改chunk中相应block结构体的内容,然后根据修改后的chunk修改memory chunk set中chunk的内容,最后返回分配内存的起始地址;否则返回NULL。
释放内存:当用户释放一块内存时,首先根据这块内存的起始地址找到其在内存映射表中对应的chunk,然后尝试将该chunk和与其相邻的chunk合并,修改chunk中相应block的内容并修改memory chunk set中相应chunk的内容。在用户释放内存时,尝试将该内存与其相邻的内存合并。如果其相邻内存为未分配内存则合并成功,合并后作为一整块内存使用;如火其相邻内存为已分配内存则不能合并,该释放的内存块作为一个独立的内存块被使用。