Linux内存管理slab分配器

深入linux内核架构--slab分配器(建议收藏) 但是仔细想一想kmem_cache_node中的slab页帧结构你会发现,如果没有着色偏移的话,那么每次对应的缓存行一般都是从一个固定值开始的,假如我们忽略slab head的大小,每次slab对象都从页的起始位置开始分配,由于slab对象与cache line 一般来说是不等的,那么每次映射的缓存行一般是0 ~ 61或者0 ~ 62这种,所以62,63这种缓存行就会有较低访问概率,所以就需要这个着色偏移,还有一个__per_cpu array_cache用于表示该缓存在各个CPU中的slab对象; 阅读详情

slab出现的缘由

在Solaris 2.4以前,linux内核采用基于伙伴算法实现的分区页框分配器适合大块内存的请求。伙伴将空闲页面分为m个组,第1组存储2^0个单位的内存块,,第2组存储2^1个单位的内存块,第3组存储2^2个单位的内存块,第4组存储2^3个单位的内存块,以此类推.直到m组.但是伙伴算法是以页为单位分配的,即会产生内部碎片,slab算法的出现就是为了解决这个小粒度内存分配的问题出现的。

slab的组织结构

slab分配器为每种对象分配一个高速缓存,这个缓存可以看做是同类型对象的一种储备。每个高速缓存所占的内存区又被划分多个slab,每个slab是由一个或多个连续的页框组成。每个页框中包含若干个对象,既有已经分配的对象,也包含空闲的对象。slab分配器的大致组成图如下:
这里写图片描述
每个高速缓存通过kmem_cache结构来描述,这个结构中包含了对当前高速缓存各种属性信息的描述。所有的高速缓存通过双链表组织在一起,形成高速缓存链表cache_chain。每个kmem_cache结构中并不包含对具体slab的描述,而是通过kmem_list3结构组织各个slab。在最高层是 cache_chain,这是一个 slab 缓存的链接列表。这对于首次适应算法非常有用,可以用来查找最适合所需要的分配大小的缓存(遍历列表)。cache_chain 的每个元素都是一个 kmem_cache 结构的引用(称为一个 cache)。它定义了一个要管理的给定大小的对象池,上述分配器细化可得到下图:
这里写图片描述

slab的实现目标

slab分配器有以下三个基本目标:
1. 减少伙伴算法在分配小块连续内存时所产生的内部碎片;
2. 将频繁使用的对象缓存起来,减少分配、初始化和释放对象的时间开销;
3. 通过着色技术调整对象以更好的使用硬件高速缓存。

Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff 的分配器是围绕对象缓存进行的。在内核中,会为有限的对象集(例如文件描述符和其他常见结构)分配大量内存。Jeff 发现对内核中普通对象进行初始化所需的时间超过了对其进行分配和释放所需的时间。因此他的结论是不应该将内存释放回一个全局的内存池,而是将内存保持为针对特定目而初始化的状态。例如,如果内存被分配给了一个互斥锁,那么只需在为互斥锁首次分配内存时执行一次互斥锁初始化函数(mutex_init)即可。后续的内存分配不需要执行这个初始化函数,因为从上次释放和调用析构之后,它已经处于所需的状态中了。如果没有基于对象的slab分配器,内核将花费更多的时间去分配、初始化以及释放一个对象。即使用slab算法能极大减少内核在内存管理的开销。与传统的内存管理模式相比, slab 缓存分配器提供了很多优点。首先,内核通常依赖于对小对象的分配,它们会在系统生命周期内进行无数次分配。slab 缓存分配器通过对类似大小的对象进行缓存而提供这种功能,从而避免了常见的碎片问题。slab 分配器还支持通用对象的初始化,从而避免了为同一目而对一个对象重复进行初始化。最后,slab 分配器还可以支持硬件缓存对齐和着色,这允许不同缓存中的对象占用相同的缓存行,从而提高缓存的利用率并获得更好的性能。

备选分配器

尽管slab分配器对许多可能的工作负荷良好,但有一些情况他无法提供最佳性能。如果某些计算机处于当前硬件尺度的边界上,这类计算机上使用slab分配会出现一些问题,例如小型嵌入式系统和大规模的并行系统。

slob分配器

slob分配器进行了特别的优化以减少代码量,他围绕一个简单的内存块链表展开。在分配内存时,使用了同样简单的最先适配器算法。slob代码量很少,但从速度上考虑并不适合大型的系统。

slub分配器

slub分配器通过将页帧打包为组,并通过struct page中使用的字段来管理这些组,视图最小化所需内存的开销,虽然该结构定义较复杂,但在大型计算机上,slub分配器比slab分配器提供了更好的性能。

Linux 内核源码分析】内存管理——Slab 分配器 Slab 分配器Linux内核中,伙伴分配器是一种内存管理方式,以页为单位进行内存的管理和分配。但是在内核中,经常会面临结构体内存分配问题,而这些结构体的大小通常是小于一页的。如果使用伙伴分配器来分配这些小内存,将造成很大的内存浪费。因此,为了解决这个问题,Sun公司的Jeff Bonwick在Solaris 2.4中设计并实现了一种新的内存分配器——slab分配器。 与伙伴分配器不同的是,slab 分配器以字节为单位来分配内存,并基于伙伴分配器的大内存进一步细分成小内存进行分配。也就是说,slab 阅读详情

相关推荐

Linux内存管理Slab分配器

Slab分配器的引入 内部碎片 内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间 内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。 举例:某进程向系统申请了3K内存空间,系统通过伙伴系统算法可能分配给进程4K(一个标准页面)内存空间,导...

qq_43313035 1118

Linux内存管理Slab分配器

采用伙伴算法分配内存时,每次至少分配一个页面。但当请求分配的内存大小为几十个字节或几百个字节时应该如何处理?如何在一个页面中分配小的内存区,小内存区的分配所产生的内碎片又如何解决?Linux采用SlabLinux所使用的slab分配器的基础是JeffBonwick 为SunOS操作系统首次引入的一种算法。Jeff的分配器是围绕对象缓存进行的。在内核中,会为有限的对象集(例如文件描述符和其他常见结构)分配大量内存。Jeff 发现对内核中普通对象进行初始化所需的时间超

Linux内存管理(3) - slab分配器和kmalloc

本文目的在于分析Linux内存管理机制的slab分配器。内核版本为2.6.31。 1.    SLAB分配器 内核需要经常分配内存,我们在内核中最常用的分配内存的方式就是kmalloc了。前面讲过的伙伴系统只支持按页分配内存,但这个单位太大了,有时候我们并不需要这么大的内存,比如我想申请128字节的空间,如果直接使用伙伴系统则需分配4KB的一整页,这显然是浪费。 slab分配器将页拆分为更小

落尘纷扰的专栏 5237

Linux Slab分配器分析文档

LinuxSlab分配器比较详细的分析文档,Slab分配器的思想对程序设计时的内存分配是很有帮组的,3年前写的了,分享给大家,也欢迎指正错误。

Linux内存管理SLAB内存分配

目录 一、前言 1、 为什么需要SLAB内存分配器 2、 SLAB内存分配器作用 3、 SLAB内存分配器工作机制 4、 SLAB相关说明      (1)SLAB与伙伴(Buddy)算法      (2)SLAB与对象      (3)SLAB与per-CPU缓存 二、SLAB内存分配器结构分析 1、SLAB内存分配器高层组织结构 2、 kmem_cache定义 3、km...

yxtxiaotian的专栏 1925

Linux内核slab分配器

一、slab思想以及编程接口一、slab思想以及编程接口1、slab 核心思想为每种对象类型创建一个内存缓存,每个内存缓存由多个大块组成,一个大块是一个或多个连续的物理页,每个大块包含多个对象。slab 采用面向对象的思想,基于对象类型管理内存,每种对象被划分为一个类,比如进程描述符(task_struct)是一个类,每个进程描述符实现是一个对象。内存缓存组成结构如下:2.编程接口分配内存: void *kmalloc (size_t size,gfp_t flags);

m0_74186706的博客 1646

Linux slab 分配器源码解析

基于Linux内核2.6.32 slab 分配器源码解析

小立仔 2456

Linux 内存管理(八)之 slab 分配器

Linux 内存管理(七)之伙伴系统算法一节中,我们学习了 Linux 内核如何使用伙伴系统算法以页为单位管理内存,进行内存分配。这一节,将要提到的 slab 算法也是一种内存分配算法。

Projectsauron 的博客 5万+

Linux内存管理SLAB分配器

注:本文讲述的SLAB相关代码是基于Linux内核v4.7,代码网址。 1、SLAB分配器的由来 在讲SLAB分配器之前先说两个概念: 内部碎片和外部碎片。 外部碎片指的是还没有被分配出去(不属于任何进程)但由于太小而无法分配给申请内存空间的新进程的内存空闲区域。外部碎片是除了任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因...

ibless的博客 9239

Linux内存管理-slab分配器

slab分配器

Cool_summer_wind的博客 1244

linux slab分配器分析

本文将着重介绍 Linux 内核的内存管理,尤其是 slab 分配提供的机制。

Linux 内存管理窥探(14):Slab 分配器

转至: https://blog.csdn.net/gatieme/article/details/52705552 感谢原文作者的无私分享 1 slab分配器 1.1 slab分配器 每个C程序员都熟悉malloc, 及其在C标准库中的相关函数. 大多数程序分配若干字节内存时. 经常会调用这些函数. 内核也必须经常分配内存, 但无法借助于标准库的函数. 上面描述的伙伴系统支持按...

StephenZhou 1651

Linux 内核】内存管理(三)slab分配器

用户应用程序对内存的需求是频繁的和任意的,而伙伴算法作为一个基础内存管理算法,并不具备提供这种任意性的条件,因此还需要以伙伴算法为基础,实现另外的内存管理机制,为用户提供申请任意大小内存的可能,这里就介绍 slab 分配器

wenqian 'blog 8878

Linux内存管理 (5)slab分配器

https://www.cnblogs.com/arnoldlu/p/8215414.html 专题:Linux内存管理专题 关键词:slab/slub/slob、slab描述符、kmalloc、本地/共享对象缓冲池、slabs_partial/slabs_full/slabs_free、avail/limit/batchcount。 从Linux内存管理框架图可以知道:slab/slub/slo...

hbcbgcx的博客 367

Linux内核:内存管理——SLAB分配器

在后面那张图中,如kmalloc-8这个普通SLAB,里面所有的对象都是8B大小,同理,kmalloc-16中的对象都是以16B为大小。除了减小了内存碎片化,SLAB还有一个作用,提高了系统的效率,当对象拥有者释放一个对象后,SLAB的处理是仅仅标记对象为空闲,并不做多少处理,而又有申请者申请相应大小的对象时,SLAB会优先分配最近释放的对象,这样这个对象甚至有可能还在硬件高速缓存中,有点类似管理区页框分配器中每CPU高速缓存的做法。这三个链表保存的是这组页框的首页框的SLAB描述符。

m0_74282605的博客 540

Linux 内存管理 | 物理内存、内存碎片、伙伴系统、SLAB分配器

文章目录物理内存物理内存分配外部碎片内部碎片伙伴系统(buddy system)slab分配器 物理内存 在Linux中,内核将物理内存划分为三个区域。 在解释DMA内存区域之前解释一下什么是DMA: DMA(直接存储器访问) 使用物理地址访问内存,将数据从一个地址空间复制到另外一个地址空间,从而加快磁盘和内存之间数据的交换,不经过MMU(内存管理单元),这时CPU可以去干别的事,大大增加了效率。 DMA内存区域(ZONE_DMA): 包含 0M~16M 之内的内存页框,该区域的物理页面专门供I/O设备

Jormungand_V的博客 1252

Linux 内存管理实战:从伙伴系统到 SLAB 分配器的生产级调优

* 业务对象结构体,模拟生产环境中的会话管理 *//* 每对象自旋锁,避免全局锁竞争 *//** 创建专用 SLAB 缓存* 关键参数说明:* - SLAB_HWCACHE_ALIGN:对象按 CPU 缓存行对齐,减少 false sharing* - 构造函数 session_ctor:初始化自旋锁等通用字段* 避免每次分配后重复初始化,降低 CPU 开销*/"session_entry_cache", /* 缓存名称,出现在 /proc/slabinfo */

jiang_style的博客 3616

Linux内核:内存管理——Slab分配器

在后面那张图中,如kmalloc-8这个普通SLAB,里面所有的对象都是8B大小,同理,kmalloc-16中的对象都是以16B为大小。除了减小了内存碎片化,SLAB还有一个作用,提高了系统的效率,当对象拥有者释放一个对象后,SLAB的处理是仅仅标记对象为空闲,并不做多少处理,而又有申请者申请相应大小的对象时,SLAB会优先分配最近释放的对象,这样这个对象甚至有可能还在硬件高速缓存中,有点类似管理区页框分配器中每CPU高速缓存的做法。这三个链表保存的是这组页框的首页框的SLAB描述符。

m0_74282605的博客 339
上一篇: 进程同步-管程
下一篇: epoll模型讲解/源码分析
_cdcupt
博客等级 码龄11年 13粉丝 35原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值