Slab 是中内存管理算法,最先是由sun的工程师提出,主要是基于一下因数考虑:算法
1:内核函数常常倾向于反复请求相同的数据类型。好比:建立进程时,会请求一块内存来存放mm结构。
2:不一样的结构使用不一样的分配方法能够提升效率。一样,若是进程在撤消的时候,内核不把mm结构释放掉,而是存放到一个缓冲区里,之后如有请求mm存储空间的行为就能够直接从缓冲区中取得,而不需从新分配内存.
3:前面咱们曾分析过,若是伙伴系统频繁分配,释放内存会影响系统的效率,以此,能够把要释放到的内存放到缓冲区中,直至超过一个阀值才把它释放至伙伴系统,这样能够在必定程度上缓减减伙伴系统的压力
4:为了缓减“内碎片”的产生,一般能够把小内存块按照2的倍数组织在一块儿,这一点和伙伴系统相似数组
slab的思想是将内存分红大小不等的slabs chunks(先分红大小相等的slabs,而后每一个slab被分红大小相等chunks,不一样slab的chunk大小是不相等的)。chunk的大小依次从一个最小数开始,按某个因子增加,直到达到最大的可能值。缓存
若是最小值为400B,最大值是1MB,因子是1.20,各个slab的chunk的大小依次是:slab1 - 400B slab2 - 480B slab3 - 576B 多线程
分配对象时根据对象的大小选择合适的slab,在对应的slab中分配一个对象,若是对应的slab没有空闲的空间时,则再向系统请求一个slab,在分配。函数
释放对象时根据直接将对象只须要将对应的slab中的对象置为空闲状态便可。性能
这种思想能够灵活的运用,其主要的目的就是根据对内存区的使用频率来对它分类,建立一组特定大小的专用缓冲区进行处理,以免内碎片的产生。对于较少使用的内存区,能够建立一组通用缓冲区来处理(如咱们的代码中的大内存分配),即便这种处理模式产生碎片,也对整个系统的性能影响不大。优化
Linux 内核对slab的运用:spa
Slab 是中内存管理算法,最先是由sun的工程师提出,主要是基于一下因数考虑:线程
1:内核函数常常倾向于反复请求相同的数据类型。好比:建立进程时,会请求一块内存来存放mm结构。
2:不一样的结构使用不一样的分配方法能够提升效率。一样,若是进程在撤消的时候,内核不把mm结构释放掉,而是存放到一个缓冲区里,之后如有请求mm存储空间的行为就能够直接从缓冲区中取得,而不需从新分配内存.
3:前面咱们曾分析过,若是伙伴系统频繁分配,释放内存会影响系统的效率,以此,能够把要释放到的内存放到缓冲区中,直至超过一个阀值才把它释放至伙伴系统,这样能够在必定程度上缓减减伙伴系统的压力
4:为了缓减“内碎片”的产生,一般能够把小内存块按照2的倍数组织在一块儿,这一点和伙伴系统相似对象
slab的思想是将内存分红大小不等的slabs chunks(先分红大小相等的slabs,而后每一个slab被分红大小相等chunks,不一样slab的chunk大小是不相等的)。chunk的大小依次从一个最小数开始,按某个因子增加,直到达到最大的可能值。
若是最小值为400B,最大值是1MB,因子是1.20,各个slab的chunk的大小依次是:slab1 - 400B slab2 - 480B slab3 - 576B
分配对象时根据对象的大小选择合适的slab,在对应的slab中分配一个对象,若是对应的slab没有空闲的空间时,则再向系统请求一个slab,在分配。
释放对象时根据直接将对象只须要将对应的slab中的对象置为空闲状态便可。
这种思想能够灵活的运用,其主要的目的就是根据对内存区的使用频率来对它分类,建立一组特定大小的专用缓冲区进行处理,以免内碎片的产生。对于较少使用的内存区,能够建立一组通用缓冲区来处理(如咱们的代码中的大内存分配),即便这种处理模式产生碎片,也对整个系统的性能影响不大。
Linux 内核对slab的运用:
Memcache 对slab的运用:
优势:减小内存碎片,提升访问效率。
缺点:通用的slab实现,会浪费约1/2的空间(好比咱们的memcache中的slab);
应用层Slab的实现,其实是彻底基于malloc来实现的。简单说使用slab分配内存就是减小malloc的调用次数,减小调用malloc的次数所带来的好处就是slab的价值或者其提升性能的关键点。因此了解malloc的机制是理解slab的存在做用的必要条件。
少调用malloc:减小内存碎片, 减小页请求次数, 减小破坏高速缓存的次数, 减小free, 减小页换入唤出(swap)
相关性能消耗点:内存合并,页调整, 高速缓存写入
其中的具体细节有兴趣能够本身去研究。
在具体看代码以前,咱们先来看一组数据:
下图中是使用slab(圈中数据)和malloc/free(框中数据)分配相同次数相同大小的内存时间消耗对比。这些数据过小,而且内存充足不足以彻底反映实际状况,可是能够证实slab在性能上的提高。
更具咱们的须要,咱们能够增长一些优化策略,使咱们的内存利用率最高。可是不一样优化策略都须要额外的数据,这些数据可能须要额外的线程进行统计和分析,相对而言,可能内存利用率上升了,可是系统效率可能会降低。因此这是一个双刃剑,能够更加个人资源和须要选择一个平衡点。
1.重分配
2.峰值释放
3.制定单线程多线程容许模式