linux slab内存管理小析

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

最近把slab机制看了一下,网上分析内容丰富全面,不再过多赘述,只是自己做了个简单的小结

 

1. 几大重要数据结构

(1)Kmem_cache数据结构:

struct kmem_cache {

         struct array_cache *array[NR_CPUS];    CPU本地高速缓存

         unsigned int batchcount;

         unsigned int limit;

         unsigned int shared;

         unsigned int buffer_size;              slab对象的大小

         u32 reciprocal_buffer_size;            buffer_size的倒数,计算对象在slab中索引时用

         unsigned int flags;                          可区分slab管理区外置or内置

         unsigned int num;                           一个slab中对象的个数

         unsigned int gfporder;                一个slab占用的页的order数

         gfp_t gfpflags;

         size_t colour;                              一个slab中碎片区需要的着色块数

         unsigned int colour_off;               cache的着色块的单位大小

         struct kmem_cache *slabp_cache;      slab管理区域对象,slab外置方式时需要

         unsigned int slab_size;                slab管理对象的大小

num * sizeof(kmem_bufctl_t) + sizeof(struct slab)

         unsigned int dflags;         

         void (*ctor)(void *obj);                对象构造函数

         const char *name;                    对象缓存的名字

         struct list_head next;                  链入全局slab cache链表中

#ifdef CONFIG_DEBUG_SLAB               统计数据

         unsigned long num_active;

         unsigned long num_allocations;

         unsigned long high_mark;

         unsigned long grown;

         unsigned long reaped;

         unsigned long errors;

         unsigned long max_freeable;

         unsigned long node_allocs;

         unsigned long node_frees;

         unsigned long node_overflow;

         atomic_t allochit;

         atomic_t allocmiss;

         atomic_t freehit;

         atomic_t freemiss;

         int obj_offset;

         int obj_size;

#endif /* CONFIG_DEBUG_SLAB */

         struct kmem_list3 *nodelists[MAX_NUMNODES];    slab三链结构

}

 

(2)Slab三链数据结构:

struct kmem_list3 {

         struct list_head slabs_partial;   非空非满slab链

         struct list_head slabs_full;      满slab链

         struct list_head slabs_free;     空slab链

         unsigned long free_objects;     slab链表的空闲对象数

         unsigned int free_limit;

         unsigned int colour_next;            当前slab的着色区偏移

         spinlock_t list_lock;

         struct array_cache *shared;    各local cache的共享对象cache

         struct array_cache **alien;   

         unsigned long next_reap;       

         int free_touched;                    表示刚刚访问了slab空链表

};

 

(3)各cpu缓存数据结构:

struct array_cache {

         unsigned int avail;          当前local cache中可用对象索引

         unsigned int limit;          当前local cache中对象个数限制

         unsigned int batchcount;     批量填充的数目,local cache是按批填充的

         unsigned int touched;       置1表示最近使用了local cache

         spinlock_t lock;             自旋锁

         void *entry[];                指针数组

};

 

(4)slab数据结构:

struct slab {

         struct list_head list;

         unsigned long colouroff;      本slab的着色偏移

         void *s_mem;              slab中第一个对象的起始地址页面地址+colouroff+管理区大小

         unsigned int inuse;           在用对象计数

         kmem_bufctl_t free;         本slab中第一个空闲对象的索引

         unsigned short nodeid;       所处的node号

};

Slab存放于页面地址+colouroff处

 

2. 一些重要操作

(1)   初始化

第一阶段 Start_kernel()->mm_init()->kmem_cache_init()

第二阶段 Start_kernel()->kmem_cache_init_late()

(2)   创建cache

kmem_cache_create()

截取网上众多分析中的图

众Kmem_cache者的关系图:

 

(3)   创建slab

cache_grow()

 

alloc_slabmgmt():

slab_map_pages():

 

分配对象

先查看本地CPU cache,然后是本地共享CPU cache,最后是三链。前面三个都没有空间时,需要从新分配slab。

 

 

 

 

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

相关推荐

slab 缓存以及slabtop 命令学习

slab 缓存学习

岳来的博客 2320

linux内存管理

对于物理内存内存,linux对内存的组织逻辑从上到下依次是:node,zone,page,这些page是根据buddy分配算法组织的,看下面两张图:

wwwlyj123321的博客 4544

linux kernel源码解析之:smp系统cpu热插拔

本文分析了SMP系统中CPU热插拔流程及per-cpu slab无锁缓存机制。通过流程图展示了CPU热插拔过程,并详细解析了slab缓存的构建与析构代码实现,包括slab元数据管理和object数组回收机制。重点阐述了无锁设计在per-cpu缓存中的运用,通过多幅代码截图展示了关键数据结构的操作流程。该机制有效提升了多核环境下的内存分配性能,同时保证了CPU动态调整时的缓存一致性。

唐顺才的博客 138

Linux - 内存管理

虚拟内存是一种内存管理技术,它使得操作系统可以将物理内存和硬盘上的空间组合起来,以实现更加高效的内存管理。在这种技术下,操作系统会将进程所使用的地址空间分成固定大小的页面(Page),并将这些页面映射到物理内存或硬盘上的交换文件中。使用虚拟内存的好处包括:允许多个程序同时运行:虚拟内存允许多个程序同时运行,即使它们的总内存需求超过了物理内存的大小。当物理内存不足时,操作系统会把不常用的内存页换出到硬盘上,然后再从硬盘上读取需要的内存页,这样就可以实现多个程序同时运行的效果。可以让进程可以使用的内存增多。

lpfstudy的博客 1703

linux内存管理 -- Slab

碎片即一个完整的东西被打碎,零散的分布着。这就像内存,如果不加以管理,就会有很多未被使用的碎片,造成内存的浪费。 在linux中,内存是以页(page)来管理的,一page一般为4KB,而外部/内部碎片就是以page为界线划分的。内部碎片就是指被内核分配出去但是不能被利用的内存,而外部碎片是指由于频繁地申请和释放页框而导致的某些小的连续页框,比方只有一个页框,无法分配给需要大的连续页框的进程而导致的内存碎片。如一个page的前后都被分配了出去,没有其他page与之相连,这个page就成了外部碎片。这时候bu

badbayyj的博客 3296

快速理解STLink引脚图中复位引脚作用

深入讲解STLink引脚图中复位引脚的实际用途,帮助开发者快速掌握其在调试与下载过程中的关键作用,结合stlink引脚图理解更高效。

weixin_32324637的博客 1325

Linux中内存管理详解

Linux中内存管理 内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。 虚拟地址的作用 如果用户进程直接操作物理地址会有以下的坏处: 1、 用户进程可以直接操作内核对应的内存,破坏内核运行。 2、 用户...

RopenYuan的专栏 4814

90nm CMOS工艺下6μW超低功耗LDO设计实战:从原理图到版图全解析

本文详细解析了在90nm CMOS工艺下设计一款静态功耗仅为6μW的超低功耗LDO(低压差线性稳压器)的全过程。文章深入探讨了如何通过改进型翻转电压跟随器(FVF)架构实现无输出电容设计,在满足极低功耗和芯片面积高效(chip-area-efficient)要求的同时,确保环路稳定性与快速瞬态响应,为物联网、可穿戴设备等应用提供关键电源管理解决方案。

weixin_29196613的博客 272

内存管理机制SLAB

详解Linu内核中的内存管理机制SLAB

qq_51148151的博客 1420

ZXDoc工业级CAN总线仿真工具全解析与应用实践

CAN总线作为现代工业通信的核心协议,其仿真技术是汽车电子和工业控制领域的关键支撑。通过物理层信号模拟、协议层报文解析和应用层人机交互的三维仿真,开发者能够构建完整的硬件在环测试环境。ZXDoc作为工业级仿真工具,集成了DBC工程化管理、HMI面板设计和自动化测试脚本等核心功能,特别适用于ECU开发、产线验证等场景。工具支持ISO11898标准协议,提供错误帧注入、负载压力测试等高级特性,结合Python API可实现复杂测试用例的自动化执行。在新能源车VCU测试等实践中,通过优化采样点等参数配置,显著提升

weixin_30096975的博客 469

基于云平台的ATS系统微服务架构方案研究

在当前智慧地铁的升级转型过程中,城市轨道交通ATS系统面临着稳定性差、运维方 式繁琐和故障应急处理效率低等问题。为此,提出一种基于云平台的ATS系统微服务架构方案; 研究了ATS系统在云平台上的微服务总体架构、ATS应用的微服务划分和设计、容器部署方式 及通信交互模式,可实现系统松耦合和易扩展,达到节约计算资源、提高系统稳定性和运营效 率的目的

mi_lan1的博客 965

Linux内核笔记——内存管理之slab分配器

内核版本:linux-2.6.11 内存区和内存对象 伙伴系统是linux用于满足对不同大小块内存分配和释放请求的解决方案,它为slab分配器提供页框分配请求的实现。 如果我们需要请求具有连续物理地址和任意长度的内存单元序列时,即不定大小的内存区时,则需要在伙伴系统之上提供一层更细粒度的管理方案。 Linux在分配内存的时候,会将这部分内存初始化成一定的类型,即内存对象,例如信号、进程描述符、...

weixin_30347009的博客 83

Matlab图像处理频域滤波实现——高斯低通、高通、带通带阻滤波器

如果你想要进一步了解更多的相关知识,

小嘤熊的博客 1万+

Slab简要分析 (ZT)

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1119

让 AI 变聪明的 20 条指令:如何让大模型回答得更精准、更专业、更实事求是

让 AI 变聪明,本质上不是写几句神奇咒语,而是把你的任务表达得更清楚,把事实标准设得更严格,把输出格式规定得更明确,把不确定性管理得更认真,把历史对话利用得更充分。大模型的强项是语言生成、信息组织、模式归纳和方案扩展;弱项是事实核验、实时更新、责任判断和对模糊意图的准确猜测。好的指令,就是在用人的判断弥补模型的弱点,让模型把强项发挥在正确的地方。

Sumarua的博客 1468

Qualcomm AI Engine Direct SDK(QNN)的使用介绍

Qualcomm AI Engine Direct SDK,高通新的AI模型推理框架,又名QNN,为AI开发提供统一API的底层框架。通过这个SDK,可以在高通的 CPU/GPU和HTP上对AI模型进行性能加速。2.Qualcomm AI Engine Direct SDK的公开英文文档。1.Qualcomm AI Engine Direct SDK的下载和安装。

u013250861的博客 6971

内存管理-SLAB(撤销SLAB块slab_destroy())

static void slab_destroy (kmem_cache_t *cachep, struct slab *slabp) { /*获得第一个对象的地址*/ void *addr = slabp->s_mem - slabp->colouroff; #if DEBUG int i; for (i = 0; i num; i++) { void *objp = slabp-

白水煮鸡蛋 960

Nvidia Jetson平台 JP4.2.1版本GStreamer视频采集异常问题调试记录

Nvidia Jetson平台GStreamer in JP4.2.1不能采集但是 v4l2-ctl和 ffmpeg能正常采集视频。

jzwjzw19900922的博客 2124

Linux内存管理之SLAB原理浅析。

前言 1.以下这篇文章是2015年我所在的via-telecom小组学习内存知识时整理的笔记。最近复习内存管理又拿出来看了一遍,庆幸当时阅读时留了这份笔记,不然重头看又要花费很多时间。当时画了很多visio图片且加上了via-telecom的copyright。虽然目前via-telecom被intel收购了,为了纪念在via-telecom的岁月暂且保留这些copyright。如果涉及了版权问...

月出皎兮。 佼人僚兮。 舒窈纠兮。 劳心悄兮。 2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux内存管理之SLAB分配器

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

ibless的博客 9244

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

Projectsauron 的博客 5万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux内存管理之slab 1:slab原理(+buddy伙伴系统)

Linux内存管理之slab 1:slab原理1. 为什么有了Buddy(伙伴系统)还需要slab?1.1 什么是伙伴系统?1.1.1 伙伴系统思想1.2 伙伴系统例子说明1.3 伙伴系统能解决的问题2 为什么需要引入slab算法?2.1 伙伴系统的缺点2.2 伙伴系统的缺点例子说明3. slab 能解决什么问题?3.3 slab 分配例子4. slab系统核心思想是什么?4.1 slab核心思想:对象管理内存4.2 slab的对象/内存池思想4.3 slab中对象是什么?4.4 cache是内存中的区域,

哈尼的博客 1万+

Linux内核的SLAB内存管理机制

Linux内核的SLAB内存管理机制

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1920

Linux内核中的内存管理——slab

在学习c语言时,我们常常会使用到malloc()去申请一块内存空间,用于存放我们的数据。刚开始我们只要知道申请内存时使用用malloc去申请一块就可以,而其中的原理我们并不关心。但是随着我们对运行环境的要求越来越多样化,复杂化,以及对稳定性以及性能问题的要求逐渐变得越来越重要时,我们往往需要关注到性能问题。而研究性能问问,如果只停留在知道使用malloc()可以去申请一块内存空间是远远不够的,此时我们就需要去研究相关的原理和代码。

tombaby_come的博客 2972
上一篇: Linux环境进程间通信-信号量
下一篇: linux Slob内存管理小析
白水煮鸡蛋
博客等级 码龄15年 106粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值