内存池思想

0 内存池

 

内存池主要为解决内存碎片问题。在频繁的内存分配与释放中,内存出现大大小小零零散散的空间布局,不仅降低了内存使用率,而且影响了程序的性能。故而设计一个基于项目的合理的内存池,能够达到很好的效果。然而各种内存池介绍,不乏类似的思想。下面我们介绍一下常见的内存池思想,只关注设计思想,具体的实现与代码,不是我们关注的重点

 

1 STL的内存池

 

STL的内存池分为一级配置器和二级配置器,一级配置器主要处理分配空间大小大于128Byte的需求,其内部实现就是直接使用malloc  realloc 和free.二级配置器则使用使用free_list的数组链表的方式来管理内存,每个项存着8*n(n=1...16)大小内存的首地址,每个项中存着大小同样的内存块且使用链表的形式相连。

其中,每个链表项初始时为NULL,当使用时,分配 期望空间*2 大小的连续空间,以供后续使用。

当我们申请空间不足8字节整数倍时,向8字节整数倍对齐。如此一来,便浪费了一些的空间(内部碎片)。但是STL主要针对小空间的申请利用内存池,而大空间仍按原理的malloc,free实现,所以浪费空间不会太大, 以至于惊人。

 

MemCached内存池

 

STL内存池旨在解决小对象的内存分配可能导致堆内存碎片多的问题,而MemCached是为为缓存系统的所有存储对象分配空间,无论大小,从而避免重复大量的初始化和清理操作。

Memcached 中内存分配机制主要理念
1.  先为分配相应的大块内存,再在上面进行无缝小对象填充
2.  懒惰检测机制,Memcached 不花过多的时间在检测各个item对象是否超时,当 get获取数据时,才检查item对象是否应该删除,你不访问,我就不处理。
3.  懒惰删除机制,在 memecached 中删除一个 item对象的时候,并不是从内存中释放,而是单单的进行标记处理,再将其指针放入 slot回收插糟,下次分配的时候直接使用。
 
MemCached内存池 有Page 和Chunk 两种级别。首先给MemCached 分配足够多的内存空间,每个Page默认1MB,是内存分配的单位。

然后分成多个class,每个class 有一定大小的 Chunk 用于存放记录。  默认级别为88,112,144,(增长因子1.25)

Memcached 的内存分配以page为单位,如果需要申请内存 时,memcached会划分出一个新的page并分配给需要的slab区域。Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空 间划分为一系列slabs,每个slab只负责一定范围内的数据存储。(参考http://blog.csdn.net/qq423515609/article/details/7843166

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值