slub机制彻底图解分析

Linux内存管理 内存检测技术(slub_debug/kmemleak/kasan) https://www.cnblogs.com/arnoldlu/p/8568090.html Linux常见的内存访问错误有: 越界访问(out of bounds) 访问已经释放的内存(use after free) 重复释放 内存泄露(memory leak) 栈溢出(stack overflow) 不同的工具有不同的侧重点,本章主要从slub_debug、kmemleak、kasan三个工具介绍。 kmemleak侧重于内存泄露问题发现。 slub_debug和kasan有一定的重复,部分slub_ 阅读详情

   内核管理页面使用了2个算法:伙伴算法和slub算法,伙伴算法以页为单位管理内存,但在大多数情况下,程序需要的并不是一整页,而是几个、几十个字节的小内存。于是需要另外一套系统来完成对小内存的管理,这就是slub系统。slub系统运行在伙伴系统之上,为内核提供小内存管理的功能。

        slub把内存分组管理,每个组分别包含2^3、2^4、...2^11个字节,在4K页大小的默认情况下,另外还有两个特殊的组,分别是96B和192B,共11组。之所以这样分配是因为如果申请2^12B大小的内存,就可以使用伙伴系统提供的接口直接申请一个完整的页面即可。

        slub就相当于零售商,它向伙伴系统“批发”内存,然后在零售出去。一下是整个slub系统的框图:


         一切的一切源于kmalloc_caches[12]这个数组,该数组的定义如下:

struct kmem_cache kmalloc_caches[PAGE_SHIFT] __cacheline_aligned;

       每个数组元素对应一种大小的内存,可以把一个kmem_cache结构体看做是一个特定大小内存的零售商,整个slub系统中共有12个这样的零售商,每个“零售商”只“零售”特定大小的内存,例如:有的“零售商”只"零售"8Byte大小的内存,有的只”零售“16Byte大小的内存。

       每个零售商(kmem_cache)有两个“部门”,一个是“仓库”:kmem_cache_node,一个“营业厅”:kmem_cache_cpu。“营业厅”里只保留一个slab,只有在营业厅(kmem_cache_cpu)中没有空闲内存的情况下才会从仓库中换出其他的slab。
       所谓slab就是零售商(kmem_cache)批发的连续的整页内存,零售商把这些整页的内存分成许多小内存,然后分别“零售”出去,一个slab可能包含多个连续的内存页。slab的大小和零售商有关。

相关数据结构:

        物理页按照对象(object)大小组织成单向链表,对象大小时候objsize指定的。例如16字节的对象大小,每个object就是16字节,每个object包含指向下一个object的指针,该指针的位置是每个object的起始地址+offset。每个object示意图如下:


void*指向的是下一个空闲的object的首地址,这样object就连成了一个单链表。

向slub系统申请内存块(object)时:slub系统把内存块当成object看待

  1. slub系统刚刚创建出来,这是第一次申请。
    此时slub系统刚建立起来,营业厅(kmem_cache_cpu)和仓库(kmem_cache_node)中没有任何可用的slab可以使用,如下图中1所示:

    因此只能向伙伴系统申请空闲的内存页,并把这些页面分成很多个object,取出其中的一个object标志为已被占用,并返回给用户,其余的object标志为空闲并放在kmem_cache_cpu中保存。kmem_cache_cpu的freelist变量中保存着下一个空闲object的地址。上图2表示申请一个新的slab,并把第一个空闲的object返回给用户,freelist指向下一个空闲的object。

  2. slub的kmem_cache_cpu中保存的slab上有空闲的object可以使用。
    这种情况是最简单的一种,直接把kmem_cache_cpu中保存的一个空闲object返回给用户,并把freelist指向下一个空闲的object。


  3. slub已经连续申请了很多页,现在kmem_cache_cpu中已经没有空闲的object了,但kmem_cache_node的partial中有空闲的object 。所以从kmem_cache_node的partial变量中获取有空闲object的slab,并把一个空闲的object返回给用户。


    上图中,kmem_cache_cpu中已经都被占用的slab放到仓库中,kmem_cache_node中有两个双链表,partial和full,分别盛放不满的slab(slab中有空闲的object)和全满的slab(slab中没有空闲的object)。然后从partial中挑出一个不满的slab放到kmem_cache_cpu中。

    上图中,kmem_cache_cpu中中找出空闲的object返回给用户。


  4. slub已经连续申请了很多页,现在kmem_cache_cpu中保存的物理页上已经没有空闲的object可以使用了,而此时kmem_cache_node中没有空闲的页面了,只能向内存管理器(伙伴算法)申请slab。并把该slab初始化,返回第一个空闲的object。


    上图表示,kmem_cache_node中没有空闲的object可以使用,所以只能重新申请一个slab。



    把新申请的slab中的一个空闲object返回给用户使用,freelist指向下一个空闲object。

向slub系统释放内存块(object)时,如果kmem_cache_cpu中缓存的slab就是该object所在的slab,则把该object放在空闲链表中即可,如果kmem_cache_cpu中缓存的slab不是该object所在的slab,然后把该object释放到该object所在的slab中。在释放object的时候可以分为一下三种情况:

  1. object在释放之前slab是full状态的时候(slab中的object都是被占用的),释放该object后,这是该slab就是半满(partail)的状态了,这时需要把该slab添加到kmem_cache_node中的partial链表中。



  2. slab是partial状态时(slab中既有object被占用,又有空闲的),直接把该object加入到该slab的空闲队列中即可。




  3. 该object在释放后,slab中的object全部是空闲的,还需要把该slab释放掉。



    这一步产生一个完全空闲的slab,需要把这个slab释放掉。



以上是slub算法的主要原理。


原文地址:http://blog.youkuaiyun.com/lukuen/article/details/6935068

Linux SLUB 分配器详解 多年以来,Linux 内核使用一种称为 SLAB 的内核对象缓冲区分配器。但是,随着系统规模的不断增大,SLAB 逐渐暴露出自身的诸多不足。SLUB 是 Linux 内核 2.6.22 版本中引入的一种新型分配器,它具有设计简单、代码精简、额外内存占用率小、扩展性高,性能优秀、方便调试等特点。本文先介绍 SLAB 分配器的基本原理,然后分析其不足之处并详细介绍 SLUB 的设计思想,最后介绍 SL 阅读详情

相关推荐

无法找到 Adobe PDF资源文件。“Acrobat PDFMaker“您必须具有”管理员”权限方可安装这些文件...错误怎么解决

本文的内容是无法找到 Adobe PDF资源文件。“Acrobat PDFMaker“您必须具有”管理员”权限方可安装这些文件...错误的解决办法。

西岸贤 1万+

Linux 内存管理之 SLUB分配器(2) :kmalloc_cache 结构

1. slub 2. kmalloc_caches、kmem_cache数据结构 3. 分配逻辑

And乔的博客 2128

【FPGA】Verilog代码实现温湿度传感器DHT11

#今天也是咸鱼的一天~ 因为参加Robei 杯 是要做一个机器人,先不说这个机器人具体怎么机器法,但是和外界互通的传感器肯定少不了,通过获取外界环境数据,进行处理,然后做出各种各样的功能。 先来讲个简单的模块,温湿度传感器DHT11。 DHT11介绍 DHT11是一款价格便宜,易于使用的温度湿度测量二合一传感器。它具有超小体积、极低功耗的特点。它使用单根总线与单片机进行双向的串行数据传输,信号传...

Ninquelote的博客 9162

linux 内核 内存管理 slub算法 (一) 原理

内核管理页面使用了2个算法:伙伴算法和slub算法,伙伴算法以页为单位管理内存,但在大多数情况下,程序需要的并不是一整页,而是几个、几十个字节的小内存。于是需要另外一套系统来完成对小内存的管理,这就是slub系统。slub系统运行在伙伴系统之上,为内核提供小内存管理的功能。         slub把内存分组管理,每个组分别包含2^3、2^4、...2^11个字节,在4K页大小的默认情况下,另外

卢坤的专栏 2万+

手把手教你做基于stm32的红外、语音、按键智能灯光控制(上)

这次项目使用的板子是stm32f103c8t6最小系统板,这个板子在tb上都能够买到,随便一个最小系统板都可以,== 注意在买最小系统板的时候需要买一个stlink下载器来下载程序。显示模块是使用的0.96英寸的OLED屏幕,注意是使用的IIC通信协议的OLED屏幕,不是使用SPI总线协议的。这次写的代码还顺便集成了检测温湿度的功能,所以要使用DHT11温湿度传感器,来采集温度。本文所设计的基于单片机的灯光控制系统主要由模式选择功能、手动模式和自动模式组成。LED灯自然就是要控制的部件了。

nbbskk的博客 6557

Windows NPS与华为、华三、思科设备RADIUS认证实战指南

本文详细介绍了Windows NPS与华为、华三、思科设备RADIUS认证的实战配置指南。通过NPS服务器统一管理网络设备认证,实现企业级安全访问控制,涵盖基础配置、设备对接及故障排查方法,助力管理员提升网络安全管理效率。

weixin_29284201的博客 505

linux slub分配器浅析

在《linux内存管理浅析》中提到内核管理自己使用的内存时,使用了SLAB对象池。SLAB确实是比较复杂,所以一直以来都没有深入看一看。 不过现在,linux内核中,SLAB已经被它的简化版--SLUB所代替。最近抽时间看了一下SLUB的代码,略记一些自己的理解。 尽管SLUB是在内核里面实现的,用户态的对象池其实也可以借鉴这样的做法。 SLUB的总体思想还是跟SLAB类似,对象池里面的

wangyunqian6的专栏 896

搞定汽车座椅电机EMC超标:一个PCB滤波板的实战设计与避坑心得

本文详细介绍了汽车座椅电机EMC超标问题的解决方案,通过PCB滤波板的实战设计,解决了传导发射测试超标问题。文章分享了在空间受限条件下的滤波电路架构设计、接地系统优化及迭代验证过程,为汽车直流电机的EMC整改提供了实用方法论。

weixin_30336061的博客 380

Linux内存管理图解【转】

转自:http://www.360doc.com/content/13/0505/15/12218157_283128759.shtml Linux内存管理图解 2013-05-05果儿的百科文章来源 Linux内存管理图解作者:wdy二、线性地址转物理地址前面说了Linux中逻辑地址等于线性地址,那么线性地址怎么对应到物理地址呢?...

weixin_34010566的博客 99

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V3 2024华为的重参数轻量化模型

一、本文介绍 本文记录的是基于 GhostNetV3 的 YOLOv11 轻量化改进方法研究。GhostNetV3的轻量模块采用重参数化方法,训练时为深度可分离卷积和1×1卷积添加线性并行分支,推理时通过逆重参数化移除分支、折叠操作,能够在不增加推理成本的同时提高性能,从而实现YOLOv11的轻量化改进。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进 专栏地址:YOLOv11改进专栏——以发表论文的角度,快速

Limiiiing的博客 1845

【Unity的HDRP渲染管线下实现好用的GUI模糊和外描边流光效果_Blur_OutLine_案例分享(内附源码)】

因为没有用到纹理,但介于是UI层,没有MainTeX的时候,会提示报错,所以这里加上了MainTex,最后不在片段着色渲染出来既可。这样UI层级显示正常了,但旋转后的模糊效果,跟背景拼接不上,有很大的偏移。猜测是屏幕UV采样错误导致,只要找到屏幕UV数值,更正过来就可以了,RenderTexture设置一下Size既可,其他的先不管。没有贴图,用Shader实现外描边流光效果。将主相机拖入Render Camera。新建一个RenderTexture。

暴走约伯的博客 1149

Slub分配器的来龙去脉

slab分配器设计的需求在Linux内核的内存子系统中,伙伴系统无疑处于内存管理的核心地带,但是如果将内存管理从逻辑上分层,它的位置则处于最底层。Buddy是所有物理内存的管家,不论使用何种接口申请内存都要经由伙伴系统进行分配。但是,伙伴系统管理的物理内存是以页为单位,以4K页为例,它也包含了4096个字节。但是无论是内核自己还是用户程序,在日常的使用中都很少会需要使用四...

Peter的专栏 884

金三银四!风控建模岗面试题库大全:从理论到实战避坑指南

风控建模面试大全

阿黎逸阳的博客 767

slub分配流程-kmem_cache_alloc函数

slub分配流程-kmem_cache_alloc函数 static __always_inline void *slab_alloc_node(struct kmem_cache *s, gfp_t gfpflags, int node, unsigned long addr) { void *object; struct kmem_cache_cpu *c; struct page *page; unsign

biaotai的博客 1159

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

从kmalloc到伙伴系统:深度图解slab分配器在Linux内存架构中的承上启下作用

本文深度解析Linux内核中slab分配器的核心机制与承上启下作用。它作为kmalloc接口与底层伙伴系统之间的关键枢纽,通过多级缓存(Per-CPU、Per-Node)高效管理内核小对象,显著减少内存碎片并提升分配性能。文章图解了其数据结构与工作流程,并对比了SLAB、SLUB、SLOB三种实现的差异及适用场景。

weixin_28396629的博客 108

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【图解 Linux 内存性能优化核心思想】【转载】

今天分享一篇的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的是Linux内核小对象内存分配最重要的算法,文章分析了内存分配的各种性能问题(在不同的场景下面),并给出了这些问题的优化方案,这个对我们实现,或以后遇到内存性能问题的时候,有一定的启发,值得我们学习。来自一种很简单的思想,即事先准备好一些会频繁分配,释放的数据结构。然而标准的slab实现太复杂且维护开销巨大,因此便分化出了更加小巧的slub,因此本文讨论的就是slub,后面所有提到slab的地方,指的都是slub。

j8267643的博客 1034

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深入Linux内存管理:手把手图解slab分配器如何提升性能

本文深入解析Linux内核中的slab分配器如何通过预建对象仓库和三级缓存结构显著提升内存管理性能。通过图解和实战代码演示,详细介绍了slab分配器的架构设计、核心API使用及性能调优技巧,特别适合需要高频分配固定大小对象的场景,如进程调度和文件系统操作。

weixin_28730927的博客 363

经典|图解Linux内存性能优化核心思想

hi,大家好,今天分享一篇内存性能优化的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的核心思想,slab是Linux内核小对象内存分配最重要的算法,文章分析了内...

极客重生 516

图解Linux内存性能优化核心思想

今天分享一篇的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的,是Linux内核小对象内存分配最重要的算法,文章分析了内存分配的各种性能问题(在不同的场景下面),并给出了这些问题的优化方案,这个对我们实现,或以后遇到内存性能问题的时候,有一定的启发,值得我们学习。来自一种很简单的思想,即事先准备好一些会频繁分配,释放的数据结构。然而标准的slab实现太复杂且维护开销巨大,因此便分化出了更加小巧的slub,因此本文讨论的就是slub,后面所有提到slab的地方,指的都是slub。

嵌入式Linux内核的博客 264

图解First-Fit内存分配算法:用ucore Lab 2的代码带你理解物理页管理

本文深入解析First-Fit内存分配算法,通过ucore Lab 2的代码实践,详细讲解物理页管理的核心机制。从算法原理到具体实现,包括关键数据结构、分配与释放逻辑,以及性能优化方向,帮助读者全面理解操作系统中的物理内存管理技术。

weixin_30613343的博客 305

自用学习资料,Linux内核之【内存管理】的一些分享

本文涉及的资料全部打包放到我Github仓: GitHub - 0voice/kernel_memory_management: 总结整理linux内核的内存管理的资料,包含论文,文章,视频,以及应用程序的内存泄露,内存池相关 有需要的可以前去下载,或者觉得还不错,请给我Star,感谢支持! ???? 100篇文章 内存管理(一):硬件原理 和 分页管理 内存管理(二):内存的动态申请和释放 内存管理(三):进程的内存消耗和泄漏 内存管理(四):内存与IO的交换 内存管理(五):其他工程问题以及调优 -

a410974689的博客 1266

深入理解Linux内核网络(六):内存管理与TCP连接相关内核对象

本文将简要介绍Linux内核的内存管理方式,包括 node、zone 划分、空闲页面管理和 slab 分配器。此外,还将解析TCP连接相关的内核对象,涵盖 socket 函数创建和服务端 socket 创建的关键过程。部分内容来源于 《深入理解Linux网络》、《Linux内核源码分析TCP实现》

一枚菜鸡 992

【Linux 内存管理】Linux内存管理三剑客:Buddy+Slab+malloc实现解析

本文解析Linux内存管理的三层架构:Buddy System负责物理页帧分配,解决外部碎片;Slab Allocator构建其上,优化小对象缓存管理;glibc的malloc提供用户空间接口,根据大小选择brk或mmap策略。文章详细介绍了各组件的工作原理、交互关系和性能优化方法,包括伙伴系统的分割合并机制、Slab的着色和Per-CPU缓存技术,以及malloc的阈值策略和多线程优化。通过剖析从物理内存到应用层的完整分配流程,展示了Linux如何高效管理内存资源。

love131452098的博客 977
上一篇: 有关卡特兰数的面试题
下一篇: linux slub分配器浅析
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值