标签:
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的运用:
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.制定单线程多线程允许模式
标签:
原文地址:http://my.oschina.net/u/1024573/blog/505312