- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内存池分(部分)
内存池实现方案一方案的整体架构,如下:图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指针所指向的链表对方案一的分析对照“内存池设计”一节中提出的问题,我们的方案一有以下特点:程序启动后内存池并没有内存块,到程序真正进行内存申请和释放的时候才接管内存块管理;该内存池对到来的申请,对申请大小并不做限制,其为每个size值创建链表进行内存管理;该方案没有提供限定内存池大小的功能结合分析,可以得出该方案应用场景如下:程序所申请的内存块大小比较固定(比如只申请/释放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所示:图2 memory block结构图其中count表示该block后面的与该block同属于一个 chunk的blokc的个数,start表示该block所在的chunk的起始block索引。其实start这个域只有在每个chunk的最后一个 block中才会用到(用于从当前chunk寻找前一个chunk的起始位置),而pmem_chunk则是一个指针,指向一个mem_chunk结构 体。任意一块大小的内存都会被取向上整到block大小的整数倍。第3部分是一个mem_chunk pool,其作用是存储整个程序可用的mem_chunk结构体。mem_chunk pool中的mem_chunk被组织成双向链表结构(快速插入和删除)。每个mem_chunk结构图如图3所示:图3 memory chunk结构图其中pmem_block指向该chunk在内存映射表中的位置,others表示其他一些域,不同的实现对应该域的内容略有不同。第4部分就是实际可以被分配给用户的内存。1.2 减少内存碎片只能在一定程度上减少内存碎片,并不能彻底消除内存碎片。具体方法如下:在用户释放内存时,尝试将该内存与其相邻的内存合并。如果其相邻内存为未分配内存则合并成功,合并后作为一整块内存使用;如火其相邻内存为已分配内存则不能合并,该释放的内存块作为一个独立的内存块被使用。1.3 性能分析链表结构的内存池实现是指将memory chunk set实现为双链表结构。这种方法的优缺点如下:优点:释放内存很快,O(1)复杂度。缺点:分配内存较慢,O(n)复杂度。1.4 内存池运行状态转移图绿色表示未使用的内存,红色表示已经使用的内存。其中每个block表示64B,这个值可以根据具体需要设定。初始化图4 内存池初始化状态申请内存图5 第1次申请128B内存后图6 第n次申请、释放内存后释放内存图7 释放64B内存前后内存池实现方案三内存池包含一个内存池头结构体apr_allocator_t,包含成员指针数组free,每个元素都指向一组队列。每
文档评论(0)