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