内存池

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的内容。在用户释放内存时,尝试将该内存与其相邻的内存合并。如果其相邻内存为未分配内存则合并成功,合并后作为一整块内存使用;如火其相邻内存为已分配内存则不能合并,该释放的内存块作为一个独立的内存块被使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值