谈STL二级内存管理

      一直想好好研读STL源码,最近总算有时间耐下心来好好拜读了下侯俊杰先生的<STL源码剖析>,SGI STL的二级配置器的思想深表敬佩,故写此文,总结下里面的内存管理方式.

     SGI STL中所有的内存管理都是经由内存配置器完成,里面设置了二级配置器分别进行管理大的内存分配和小内存,好处就是减小内存碎片和提高内存分配效率.下面具体谈谈二级内存配置器的具体实现方法.

      当需要分配的内存大小大于128bytes,则直接调用第一级内存配置管理器。第一级内存配置器直接调用malloc函数实现,当调用失败的时候则调用oom_malloc函数实现内存回收工作,如果回收成功分配则返回成功,否则就返回失败。

     当需要分配的内存大小小于128bytes时,那么是第二级内存配置器分配的时候了。二级内存配置器由16个链表(这个链表是由联合体数据结构实现的,那样做可以保证不用添加附加字节来管理链表)保存空内存(没使用的),这16个链表分别是8bytes, 16bytes, 24bytes ……… 112bytes , 128bytes大小的空内存块。当客户申请内存的时候,第二级内存配置器先查找相应的链表,看有没有空的内存,找到则直接返回成功,找不到则调用refill函数从内存池里申请所需的内存。refill函数做的工作有调用chunk_alloc函数从内存池里取内存,如果取出的内存块大于1块所申请的内存,将另外块内存加入到相应的空链表中,否则成功返回。chunk_alloc函数是管理内存池的主体函数,主要分5个步骤:

1、  内存池水量充足的时候,直接从内存池中取出20块待分配大小的内存,返回到refill函数中去(refill函数取其中1块给客户,剩下的交由空链表中管理);

2、  不足20块但是大于等于1块,取出所有块返回到refill函数中去(refill函数取其中1块给客户,剩下的交由空链表中管理);

3、  内存池水量不足于分配1块待分配内存大小的时候,则调用malloc函数补充水源,补充的大小为2倍的refill函数申请量(待分配大小*20)外加附加增量,再回调chunk_alloc函数,回调的chunk_alloc函数将refill函数申请量返回给refill函数,剩下的留给内存池享用;

4、  连堆内存都不足了,malloc分配不成功,则从free_lists(从大于待申请内存块的空链表)里面查找空内存,找到则递归调用chunk_alloc

5、  最后一步连free_lists都没有空内存了,则调用第一级配置管理器,由oom_malloc回收内存了。

以上是二级内存配置器的管理思想。但是我觉得第三步和第四步存在缺陷。第三步在是没有充分利用堆内存,malloc函数补充水源的时候,如果补充不成功,为什么不考虑减小所补充的水量呢,不足于2倍的refill函数申请量(待分配大小*20)外加附加增量,并不意味着连客户所要申请的待分配内存大小也满足不了阿?!这里我觉得可以相应的可以做调整,这对于嵌入式开发过程中,内存较小的情况下还是相当有价值的。在第四步当中也没有充分利用free_lists中的内存,为什么不考虑合并小于待分配内存块的链表呢?

以上是我个人一些想法,是对是错请大家指教!!!

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值