首页
学习
活动
专区
圈层
工具
发布

Slub分配器的来龙去脉

slab分配器设计的需求 在Linux内核的内存子系统中,伙伴系统无疑处于内存管理的核心地带,但是如果将内存管理从逻辑上分层,它的位置则处于最底层。...为了实现这样的小内存分配器,Sun公司的J.Bonwick首先在Solaris 2.4中设计并实现了slab分配器,并对其开源。在Linux中也实现了具有相同的基本设计思想的同名分配器slab。...slab、slob和slub关系 slab、slob和slub都是小内存分配器,slab是slob和slub实现的基础,而slob和slub是针对slab在不同场景下的优化版本。...slub分配器框架 下图是在读完宋牧春大侠的《图解Slub》后,我也总结了一张Slub分配器框架图,可以大致的看到Slub的框架。...《linux内核内存管理slub算法(一)原理》 总的来说,Slub就相当于零售商,它从伙伴系统“批发”内存,然后再零售出去。

1.3K31

slab分配器正式被弃用,slub成为分配器唯一选择

在使用slab分配器进行内存分配时,可能会出现以下缺点: 内存碎片化。由于slab分配器需要将内存分成大小相同的块,如果分配不均衡或者对象大小不同,就容易导致内存碎片化。 性能下降。...Slab分配器在管理内存时并没有足够的容错机制,如果分配器发生错误或者缓存区满了,就会导致内存溢出。...slab分配器正式在后续linux 6.5合入主线 相较于slab分配器,slub分配器具有以下优点: 减少内存碎片化。...Slub分配器避免了将内存分成大小相同的块,而是根据需要动态分配内存,减少了内存碎片化的问题。 更高效的内存管理。Slub分配器取消了缓存区的概念,使用了更加灵活的对象池管理方式。...Slub分配器支持动态调整对象池的大小,可以更加灵活地管理内存。 更好的容错机制。Slub分配器对溢出等错误有更好的容错机制,可提高系统的稳定性。

59430
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    SLUB的引入及举例说明

    我们都知道Buddy分配器是按照页的单位分配的(Buddy系统分配器实现),如果我们需要分配几十个字节,几百个字节的时候,就需要用到SLAB分配器。...SLAB分配器专门是针对小内存分配而设计的,比如我们驱动中常见的Kmalloc分配器就是通过SLAB分配器分配的内存。 而SLAB分配器在linux系统中三种具体的实现:SLAB,SLUB,SLOB。...目前内核代码中默认的SLAB分配器为SLUB算法。至于为啥不用SLAB大家可以网上看看资料,所以我们重点分析SLUB分配器的实现。...#include linux/module.h> #include linux/init.h> #include linux/slab.h> #include linux/mm.h> static...#include linux/module.h> #include linux/init.h> #include linux/slab.h> #include linux/mm.h> #include

    1.6K10

    Linux slab分配器

    在Linux中,伙伴系统是以页为单位分配内存。但是现实中很多时候却以字节为单位,不然申请10Bytes内存还要给1页的话就太浪费了。slab分配器就是为小内存分配而生的。...slab分配器分配内存以Byte为单位。但是slab分配器并没有脱离伙伴系统,而是基于伙伴系统分配的大内存进一步细分成小内存分配。...走进slub 做个小实验: #include linux/module.h> #include linux/init.h> #include linux/slab.h> #include linux...(slub_test); } module_init(slub_test_init); module_exit(slub_test_exit); 看下结果: ?...kmalloc的内存分配就是基于slab分配器,系统在启动的时候会调用create_kmalloc_caches,来创建不同大小的kmem_cache,并将这些kmem_cache存储在kmalloc_caches

    2.3K21

    Linux内核内存管理与漏洞利用

    使用Buddy算法的的应用有很多,其中Linux内核就是一个,此外jemalloc也是使用Buddy技术的一个现代内存分配器。 Linux内核中的伙伴系统块大小为一页,通常是4096字节。...因此Linux引入了Slab分配器,加速对object的分配和释放速度,同时也减少碎片空间。 最初接触的时候心里通常有个大大的问号:Slab是什么?...,其实都是兼容SLAB接口的具体分配器 image.png 说句题外话,SLOB (Simple List Of Blocks) 可以看做是针对嵌入式设备优化的分配器,通常只需要几MB的内存。...数据结构 在本文中,我会尽量少粘贴大段的代码进行分析,但Slub分配器是比较依赖于实现而不是设计的,因此数据结构的介绍是难免的。 page 描述一个页的数据结构就是struct page。...#endif }; 这个数据结构根据配置的SL[OAU]B分配器而异,对于SLUB而言,使用的字段就只有两个,nr_partial和partial。

    2.7K00

    Linux 内核内存管理:虚拟地址空间、伙伴系统和块分配器

    四、伙伴系统及算法Linux内核初始化完毕后,使用页分配器管理物理页,当前使用的页分配器就是伙伴分配器,伙伴分配器的特点是管理算法简单且高效。...Linux中支持的主要有:slab、slub、slob。其中slob分配器的总代码量比较少,但分配速度不是最高效的,所以不是为大型系统设计,适合内存紧张的嵌入式系统。...在配备大量物理内存的大型计算机上,slab分配器的管理数据结构的内存开销比较大,所以设计了slub分配器。在小内存的嵌入式设备上,slab分配器的代码过多、相当复杂,所以设计一个精简slob分配器。...目前slub分配器已成为默认的块分配器。...Linux内核提供了多种块分配器,包括slab分配器、slub分配器和slob分配器。这些分配器针对不同的使用场景进行了优化,例如高速缓存、文件系统和内核对象。

    25700

    Linux内核的内存管理与漏洞利用案例分析

    使用Buddy算法的的应用有很多,其中Linux内核就是一个,此外jemalloc也是使用Buddy技术的一个现代内存分配器。...因此Linux引入了Slab分配器,加速对object的分配和释放速度,同时也减少碎片空间。 最初接触的时候心里通常有个大大的问号:Slab是什么?...数据结构 在本文中,我会尽量少粘贴大段的代码进行分析,但Slub分配器是比较依赖于实现而不是设计的,因此数据结构的介绍是难免的。 page 描述一个页的数据结构就是struct page。...#endif }; 这个数据结构根据配置的SL[OAU]B分配器而异,对于SLUB而言,使用的字段就只有两个,nr_partial和partial。...参考文章 Buddy memory allocation 图解SLUB/lukuen 图解SLUB/smcdef The Linux kernel memory allocators from an exploitation

    1.4K20

    图解slub

    1.前言 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。但是现实的需求却以字节为单位,假如我们需要申请20Bytes,总不能分配一页吧!那岂不是严重浪费内存。...slab分配器就应运而生了,专为小内存分配而生。slab分配器分配内存以Byte为单位。但是slab分配器并没有脱离伙伴系统,而是基于伙伴系统分配的大内存进一步细分成小内存分配。...本篇文章中说的是slub分配器工作的原理。但是针对分配器管理的内存,下文统称为slab缓存池。所以文章中slub和slab会混用,表示同一个意思。...2. slub数据结构 slub的数据结构相对于slab来说要简单很多。并且对外接口和slab兼容。所以说,从slab的系统更换到slub,可以说是易如反掌。...2.1. kmem_cache 现在假如从伙伴系统分配一页内存供slub分配器管理。对于slub分配器来说,就是将这段连续内存平均分成若干大小相等的object(对象)进行管理。

    1.5K30

    【Linux 内核 内存管理】memblock 分配器 ⑤ ( Linux 内核中定义 memblock 分配器的位置 | ARM64体系架构下 Linux内核初始化 memblock 分配器流程 )

    文章目录 一、Linux 内核中定义 memblock 分配器的位置 二、ARM64 体系架构下 Linux 内核初始化 memblock 分配器流程 三、arm64_memblock_init 函数完整源码...一、Linux 内核中定义 memblock 分配器的位置 ---- Linux 内核 定义 memblock 分配器 位置 : Linux 内核源码 linux-4.12\mm\memblock.c...-4.12\mm\memblock.c#34 二、ARM64 体系架构下 Linux 内核初始化 memblock 分配器流程 ---- 先在 linux-4.12\init#488 位置的 asmlinkage...; ARM64 体系架构下 Linux 内核初始化 memblock 分配器流程 : ① 解析 " 设备树二进制文件 " /memory 节点 , 将 " 所有物理内存 " 纳入到 memblock...分配器 管理之下 ; 该步骤对应的 Linux 源代码是在 linux-4.12\arch\arm64\mm\init.c#367 位置 ; /* Handle linux,usable-memory-range

    1.2K10

    Linux分区页框分配器之水位

    我们讲页框分配器的时候讲到了快速分配和慢速分配,其中伙伴算法是在快速分配里做的,忘记的小伙伴我们再看下: static struct page * get_page_from_freelist(gfp_t...简单的说在使用分区页面分配器中会将可以用的free pages与zone里的水位(watermark)进行比较。...而linux中默认的low与min之间的值又比较小,所以就很容易造成direct reclaim的情况。...「extra_free_kbytes」: 源于此,安卓在linux水位的基础上增加了extra_free_kbytes的变量,这个extra时额外加在low和min之间的,它在min不变的情况下,让low...至此,页框分配器中的快速分配方式已经结束,下一篇让我们进入页框分配器的慢速分配方式:__alloc_pages_slowpath,涉及到内存碎片的整理和内存回收。

    1.5K30

    linux内存源码分析 - SLAB分配器概述

    之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请者,而且我们知道也可页框大小为4K(也可设置为4M),这时候就会有个问题,如果我只需要1KB...可以看出,SLAB分配器和页框分配器并没有什么直接的联系,对于页框分配器来说,SLAB分配器也只是一个从它那里申请页框的申请者而已。...用 */ #ifdef CONFIG_SLUB unsigned long nr_partial; struct list_head partial; #ifdef CONFIG_SLUB_DEBUG...如果看了我linux内存源码分析 - 页框分配器的朋友,或许可以联系起来了。SLAB就是一组连续的页框,它的描述符结合在页描述符中,也就是页描述符描述SLAB的时候,就是SLAB描述符。...*/ /* SLUB使用 */ unsigned long counters; #else /* SLUB使用 */

    2.2K40
    领券