内存池技术

内存池技术是一种饱受争议的技术
争议热点在于到底有没有必要本身实现。
1.内存池技术出如今libc尚不成熟的时候,当时程序常常在运行一段时间后性能降低,当时维护内存池颇有必要
2.如今64位服务器常常是32G以上的内存,管理内存碎片意义不打
3.写malloc的各位都是大神,本身写有99%的可能会更差,更况且如今还有tmalloc、jmalloc等与时俱进的内存管理库。
4.内存数据库等之内存为主的服务器程序能够本身管理内存来达到某些特殊的公平,好比性能才是咱们认为的供公平,浪费内存是能够接受的,诸如此类有特殊公平需求的。

 

内存池的实现方案
1.FreeList
STL的二级内存配置器就是FreeList
2.slab
memcached的内存管理方案

 

FreeList实现方案
一句话描述:用链表把待释放的内存保存起来重复利用。
STL的二级配置器实现的部份内容:

 

free_list
保存已释放内存的数据,每个项都包含一个指向固定大小的区块的单链表指针,指针指向可重复利用内存list,区块的大小是随着下标递增的:八、1六、2四、3二、40、4八、5六、6四、7二、80、8八、9六、10四、1十二、120、128。
memory pool
内存池,当free_list找不到可重复利用的内存时就向memory pool申请,经过内存池申请内存时会申请20*size的内存,返回第一块size内存给客户,其余的19个size内存添加到free_list对应下标的可回收利用区块链表。
memory pool的内存来源
维护start和end两个指针表示当前的水位,水位充足时直接分配内存给客户。
水位不足时malloc2*20*size+fixed_size的长度,20*size用于返回客户和加入free_list,其余的留在内存池中。
STL的二级内存配置器目的
回收利用小于等于128字节的小内存,避免内存碎片。

 

slab实现方案
memcached的实现方案  
slabclass是一个全局数组

 

slabclass中的slab的size按照配置的factor因子递增
slabclass的slab_list包含的slab大小都是同样的
回收的slab加入slots
申请新的slat的时候优先利用slots中的可回收内存。

 

以上slab的设计能够在源码slabs.c中查看详细,从 slabs_init开始是一个不错的主意。
item和这里的关系并不大,是申请内存的客户用的。
相关文章
相关标签/搜索