内存池设计分析部分.docx

上传人:b****3 文档编号:5052186 上传时间:2023-05-07 格式:DOCX 页数:7 大小:214.23KB
下载 相关 举报
内存池设计分析部分.docx_第1页
第1页 / 共7页
内存池设计分析部分.docx_第2页
第2页 / 共7页
内存池设计分析部分.docx_第3页
第3页 / 共7页
内存池设计分析部分.docx_第4页
第4页 / 共7页
内存池设计分析部分.docx_第5页
第5页 / 共7页
内存池设计分析部分.docx_第6页
第6页 / 共7页
内存池设计分析部分.docx_第7页
第7页 / 共7页
亲,该文档总共7页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

内存池设计分析部分.docx

《内存池设计分析部分.docx》由会员分享,可在线阅读,更多相关《内存池设计分析部分.docx(7页珍藏版)》请在冰点文库上搜索。

内存池设计分析部分.docx

内存池设计分析部分

内存池实现方案一

方案的整体架构,如下:

图1.内存池架构图

结构中主要包含block、list和pool这三个结构体,block结构包含指向实际内存空间的指针,前向和后向指针让block能够组成双向链表;list结构中free指针指向空闲内存块组成的链表,used指针指向程序使用中的内存块组成的链表,size值为内存块的大小,list之间组成单向链表;pool结构记录list链表的头和尾。

内存跟踪策略

该方案中,在进行内存分配时,将多申请12个字节,即实际申请的内存大小为所需内存大小+12。

在多申请的12个字节中,分别存放对应的list指针(4字节)、used指针(4字节)和校验码(4字节)。

通过这样设定,我们很容易得到该块内存所在的list和block,校验码起到粗略检查是否出错的作用。

该结构图示如下:

图2.内存块申请示意图

图中箭头指示的位置为内存块真正开始的位置。

内存申请和释放策略

申请:

根据所申请内存的大小,遍历list链表,查看是否存在相匹配的size;

    存在匹配size:

查看free时候为NULL

      free为NULL:

使用malloc/new申请内存,并将其置于used所指链表的尾部

      free不为NULL:

将free所指链表的头结点移除,放置于used所指链表的尾部

    不存在匹配size:

新建list,使用malloc/new申请内存,并将其置于该list的used所指链表尾部

   返回内存空间指针

释放:

根据内存跟踪策略,获取list指针和used指针,将其从used指针所指的链表中删除,放置于free指针所指向的链表

对方案一的分析

对照“内存池设计”一节中提出的问题,我们的方案一有以下特点:

1.程序启动后内存池并没有内存块,到程序真正进行内存申请和释放的时候才接管内存块管理;

2.该内存池对到来的申请,对申请大小并不做限制,其为每个size值创建链表进行内存管理;

3.该方案没有提供限定内存池大小的功能

结合分析,可以得出该方案应用场景如下:

程序所申请的内存块大小比较固定(比如只申请/释放1024bytes或2048bytes的内存),申请和释放的频率基本保持一致。

 

内存池实现方案二

1.1将buffer分为四部分,第1部分是mem_pool结构体;第2部分是内存映射表;第3部分是内存chunk结构体缓冲区;第4部分是实际可分配的内存区。

整个buffer结构图如图1所示:

图1内存buffer结构图

第1部分的作用是可以通过该mem_pool结构体控制整个内存池。

第2部分的作用是记录第4部分,即实际可分配的内存区的使用情况。

表中的每一个单元表示一个固定大小的内存块(block),多个连续的block组成一个chunk,每个block的详细结构如图2所示:

图2memoryblock结构图

其中count表示该block后面的与该block同属于一个chunk的blokc的个数,start表示该block所在的chunk的起始block索引。

其实start这个域只有在每个chunk的最后一个block中才会用到(用于从当前chunk寻找前一个chunk的起始位置),而pmem_chunk则是一个指针,指向一个mem_chunk结构体。

任意一块大小的内存都会被取向上整到block大小的整数倍。

第3部分是一个mem_chunkpool,其作用是存储整个程序可用的mem_chunk结构体。

mem_chunkpool中的mem_chunk被组织成双向链表结构(快速插入和删除)。

每个mem_chunk结构图如图3所示:

图3memorychunk结构图

其中pmem_block指向该chunk在内存映射表中的位置,others表示其他一些域,不同的实现对应该域的内容略有不同。

第4部分就是实际可以被分配给用户的内存。

1.2减少内存碎片

只能在一定程度上减少内存碎片,并不能彻底消除内存碎片。

具体方法如下:

在用户释放内存时,尝试将该内存与其相邻的内存合并。

如果其相邻内存为未分配内存则合并成功,合并后作为一整块内存使用;如火其相邻内存为已分配内存则不能合并,该释放的内存块作为一个独立的内存块被使用。

1.3性能分析

链表结构的内存池实现是指将memorychunkset实现为双链表结构。

这种方法的优缺点如下:

优点:

释放内存很快,O

(1)复杂度。

缺点:

分配内存较慢,O(n)复杂度。

1.4内存池运行状态转移图

绿色表示未使用的内存,红色表示已经使用的内存。

其中每个block表示64B,这个值可以根据具体需要设定。

初始化

图4内存池初始化状态

申请内存

图5第1次申请128B内存后

图6第n次申请、释放内存后

释放内存

图7释放64B内存前后

 

内存池实现方案三

1、内存池包含一个内存池头结构体apr_allocator_t,包含成员指针数组free,每个元素都指向一组队列。

每组队列初始为NULL,当应用层释放申请的内存时,内存并不释放给操作系统,而是挂载在相应大小的队列上。

2、当应用层申请内存时,优先找到大小相符合的队列,在相应队列里寻找最优节点,找到符合大小时,返回给应用层。

找不到时,向操作系统申请。

优点:

申请和释放速度快,内存在需要时才向操作系统申请。

缺点:

当应用层申请内存大小分布及申请释放频率不等时,挂载大量不用内存(可以限制阀值)。

每申请一块内存时,要多申请相应的头信息内存。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2