slab内存管理分享

1.什么是slab

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

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

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

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

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

2.slab算法的具体思想

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的运用:

1.什么是slab

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

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

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

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

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

2.slab算法的具体思想

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的运用:

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.制定单线程多线程允许模式

时间: 2024-10-14 00:14:40

slab内存管理分享的相关文章

Nginx Slab内存管理

L38  Slub内存管理适用 ngx_http_limit_conn_module.ngx_http_limit_req_module 模块场景 原文地址:https://www.cnblogs.com/jackey2015/p/10684151.html

RT-thread内核之小内存管理算法

 一.动态内存管理 动态内存管理是一个真实的堆(Heap)内存管理模块,可以在当前资源满足的情况下,根据用户的需求分配任意大小的内存块.而当用户不需要再使用这些内存块时,又可以释放回堆中供其他应用分配使用.RT-Thread系统为了满足不同的需求,提供了两套不同的动态内存管理算法,分别是小内存管理算法和SLAB内存管理算法.小堆内存管理模块主要针对系统资源比较少,一般用于小于2M内存空间的系统:而SLAB内存管理模块则主要是在系统资源比较丰富时,提供了一种近似多内存池管理算法的快速算法. 两种内

Linux内核工程导论——内存管理(一)

Linux内存管理 概要 物理地址管理 很多小型操作系统,例如eCos,vxworks等嵌入式系统,程序中所采用的地址就是实际的物理地址.这里所说的物理地址是CPU所能见到的地址,至于这个地址如何映射到CPU的物理空间的,映射到哪里的,这取决于CPU的种类(例如mips或arm),一般是由硬件完成的.对于软件来说,启动时CPU就能看到一片物理地址.但是一般比嵌入式大一点的系统,刚启动时看到的已经映射到CPU空间的地址并不是全部的可用地址,需要用软件去想办法映射可用的物理存储资源到CPU地址空间.

ARC下需要注意的内存管理

ARC下需要注意的内存管理 2016/04/03 · iOS开发 · 内存管理 分享到:1 原文出处: 一不(@luoyibu) 之前发了一篇关于图片加载优化的文章,还是引起很多人关注的,不过也有好多人反馈看不太懂,这次谈谈iOS中ARC的一些使用注意事项,相信做iOS开发的不会对ARC陌生啦.这里不是谈ARC的使用,只是介绍下ARC下仍然可能发生的内存泄露问题,可能不全,欢迎大家补充. Ps:关于ARC的使用以及内存管理问题,强烈建议看看官方文档,里面对内存管理的原理有很详细的介绍,相信用过M

RTT之内存管理及异常中断

内存管理分静态内存管理和动态内存管理(根据大小又分2种) 静态内存管理:创建.删除.初始化.解绑.申请和释放.初始化内存池是属于静态内存管理,与创建内存池不同的是,此处内存池对象所使用的内存空间是由用户指定的一个缓冲区空间,用户把缓冲区的指针传递给内存池对象控制块,其余的初始化工作与创建内存池相同. 动态内存:在堆heap上分配. 小堆内存管理模块主要针对系统资源比较少(小于2M内存空间的系统):内存池中有不同的内存块,申请时先查找找到符合要求的(拆分),释放时如果紧邻的空闲则合并成一个. 而S

SQL Server 2012笔记分享-6:理解内存管理

内存管理 – SQL Server 2005/2008/2008r2 SQL Server 2012以前的版本(SQL 2005/2008/2008R2),有single page allocator 和multi page allocator.也就是说,如果申请的内存是8k以内的,就会有单页分配器分配,而大于8kb的内存请求,使用multi page 分配器来管理.如图所示. 使用select * from sys.dm_os_memory_clerks查询memory clerk,会发现si

Kernel那些事儿之内存管理(8) --- Slab(中)

上篇讲了Slab中的数据结构,这篇该讲Slab中的操作了. 既然是内存管理,那操作无非就两点:allocate 和 free. 1. 申请一个object 在Slab中,申请一个object是通过函数 kmem_cache_alloc() 来完成的. 3618 void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags) 3619 { 3620     return __cache_alloc(cachep, flags, __bu

Linux内存管理6---伙伴算法与slab

1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本文将主要以X86架构为例来介绍伙伴算法和slab分配 2.伙伴算法概述 块链表 Linux的伙伴算法将所有的空闲页面分成MAX_ORDER+1(MAX_ORDER默认大小为11)个块链表 每个链表中的一个节点指向一个含有2的幂次个页面的块,即页块或简称块 伙伴 大小相同.物理地址连续的两个页块称为伙

【Bugly干货分享】iOS内存管理:从MRC到ARC实践

Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的必修课.引用计数.自动释放等概念,都是与C语言完全不同的.搞明白这些,代码才有可能不 crash.然而就是这么牛逼的内存管理,着实让我这个从 C 转过来的老程序员头疼了一段时间. [C++ 程序员的迷惑和愤怒] iOS 内存管理的核心是引用计数.与众多五年甚至更多以上开发经验的程序员一样,笔者当初是