slab内存管理分享

孤街浪徒 提交于 2020-03-02 16:45:35

 

1.什么是slab

Slab 是中内存管理算法,最早是由sun的工程师提出,主要是基于一下因数考虑:

 

1:内核函数经常倾向于反复请求相同的数据类型。比如:创建进程时,会请求一块内存来存放mm结构。

2:不同的结构使用不同的分配方法可以提高效率。同样,如果进程在撤消的时候,内核不把mm结构释放掉,而是存放到一个缓冲区里,以后若有请求mm存储空间的行为就可以直接从缓冲区中取得,而不需重新分配内存.

3:前面我们曾分析过,如果伙伴系统频繁分配,释放内存会影响系统的效率,以此,可以把要释放到的内存放到缓冲区中,直至超过一个阀值才把它释放至伙伴系统,这样可以在一定程度上缓减减伙伴系统的压力

4:为了缓减“内碎片”的产生,通常可以把小内存块按照2的倍数组织在一起,这一点和伙伴系统类似

 

 

2.slab算法的具体思想

 

slab的思想是将内存分成大小不等的slabs chunks(先分成大小相等的slabs,然后每个slab被分成大小相等chunks,不同slabchunk大小是不相等的)。chunk的大小依次从一个最小数开始,按某个因子增长,直到达到最大的可能值。

 如果最小值为400B,最大值是1MB,因子是1.20,各个slabchunk的大小依次是:slab1 - 400B slab2 - 480B slab3 - 576B

分配对象时根据对象的大小选择合适的slab,在对应的slab中分配一个对象,如果对应的slab没有空闲的空间时,则再向系统请求一个slab,在分配。

释放对象时根据直接将对象只需要将对应的slab中的对象置为空闲状态即可。

这种思想可以灵活的运用,其主要的目的就是根据对内存区的使用频率来对它分类,创建一组特定大小的专用缓冲区进行处理,以避免内碎片的产生。对于较少使用的内存区,可以创建一组通用缓冲区来处理(如我们的代码中的大内存分配),即使这种处理模式产生碎片,也对整个系统的性能影响不大。

 

Linux 内核对slab的运用:

 

1.什么是slab

Slab 是中内存管理算法,最早是由sun的工程师提出,主要是基于一下因数考虑:

 

1:内核函数经常倾向于反复请求相同的数据类型。比如:创建进程时,会请求一块内存来存放mm结构。

2:不同的结构使用不同的分配方法可以提高效率。同样,如果进程在撤消的时候,内核不把mm结构释放掉,而是存放到一个缓冲区里,以后若有请求mm存储空间的行为就可以直接从缓冲区中取得,而不需重新分配内存.

3:前面我们曾分析过,如果伙伴系统频繁分配,释放内存会影响系统的效率,以此,可以把要释放到的内存放到缓冲区中,直至超过一个阀值才把它释放至伙伴系统,这样可以在一定程度上缓减减伙伴系统的压力

4:为了缓减“内碎片”的产生,通常可以把小内存块按照2的倍数组织在一起,这一点和伙伴系统类似

 

 

2.slab算法的具体思想

 

slab的思想是将内存分成大小不等的slabs chunks(先分成大小相等的slabs,然后每个slab被分成大小相等chunks,不同slabchunk大小是不相等的)。chunk的大小依次从一个最小数开始,按某个因子增长,直到达到最大的可能值。

 如果最小值为400B,最大值是1MB,因子是1.20,各个slabchunk的大小依次是:slab1 - 400B slab2 - 480B slab3 - 576B

分配对象时根据对象的大小选择合适的slab,在对应的slab中分配一个对象,如果对应的slab没有空闲的空间时,则再向系统请求一个slab,在分配。

释放对象时根据直接将对象只需要将对应的slab中的对象置为空闲状态即可。

这种思想可以灵活的运用,其主要的目的就是根据对内存区的使用频率来对它分类,创建一组特定大小的专用缓冲区进行处理,以避免内碎片的产生。对于较少使用的内存区,可以创建一组通用缓冲区来处理(如我们的代码中的大内存分配),即使这种处理模式产生碎片,也对整个系统的性能影响不大。

 

Linux 内核对slab的运用:

 

Memcache slab的运用:

 

 

 

3.使用slab的优缺点

优点:减少内存碎片,提高访问效率。

缺点:通用的slab实现,会浪费约1/2的空间(比如我们的memcache中的slab);

 

 

4.slab malloc/free 对比

应用层Slab的实现,实际上是完全基于malloc来实现的。简单说使用slab分配内存就是减少malloc的调用次数,减少调用malloc的次数所带来的好处就是slab的价值或者其提高性能的关键点。所以了解malloc的机制是理解slab的存在作用的必要条件。

少调用malloc:减少内存碎片, 减少页请求次数, 减少破坏高速缓存的次数, 减少free 减少页换入唤出(swap

相关性能消耗点:内存合并,页调整, 高速缓存写入

其中的具体细节有兴趣可以自己去研究。

 

5.我们的slab

在具体看代码之前,我们先来看一组数据:

下图中是使用slab(圈中数据)和malloc/free(框中数据)分配相同次数相同大小的内存时间消耗对比。这些数据太小,并且内存充足不足以完全反映实际情况,但是可以证明slab在性能上的提升。

 

 

 

6.可以进行的优化和改进

更具我们的需要,我们可以增加一些优化策略,使我们的内存利用率最高。但是不同优化策略都需要额外的数据,这些数据可能需要额外的线程进行统计和分析,相对而言,可能内存利用率上升了,但是系统效率可能会下降。所以这是一个双刃剑,可以更加我的资源和需要选择一个平衡点。

1.重分配

2.峰值释放

3.制定单线程多线程允许模式

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!