SLUB缓存管理

article/2025/11/9 11:35:19

注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.2

1、关于SLUB

目前大多数系统都不使用slab作为缓存的管理模式,转而使用slub,比如CentOS 7和8默认都是使用slub管理器。slub是基于slab的进一步优化改进,slub保留了slab的API接口函数,保证了对slab的兼容和无缝迁移。slub与slab的主要差异有以下几点,

  • 每CPU变量不再保存对象,而是保存slab缓冲区
  • 精简每node结点的三个链表,只保留部分空slab链表
  • 取消每node结点上所有CPU共享的空闲对象链表

2、SLUB管理结构kmem_cache

和slab一样,每个slab缓存由kmem_cache结构的一个实例表示,不过成员变量就不同了

struct kmem_cache {//每CPU slab缓存区,对应的是page粒度struct kmem_cache_cpu __percpu *cpu_slab;/* Used for retriving partial slabs etc */slab_flags_t flags; unsigned long min_partial;//每个node结点的部分空slab缓冲区数量最小值unsigned int size;	//分配给对象的内存大小,包括下个空闲对象指针unsigned int object_size;//对象的实际大小unsigned int offset;	/* Free pointer offset. *///每CPU可用objects数量最大值unsigned int cpu_partial;...const char *name;	//slab缓存名称,比如ext4_inode_cachestruct list_head list;	//slab双向链表指针,通过该变量链接到全局slab_caches链表...//每Node SLAB缓存对象struct kmem_cache_node *node[MAX_NUMNODES];
};

我们主要来看下每CPU slab缓存和每node slab缓存,这也是和slab的主要差别之处。

3、每CPU slab缓存kmem_cache_cpu

struct kmem_cache_cpu {void **freelist;	//指向下个空闲对象unsigned long tid;	/* Globally unique transaction id */struct page *page;	//该CPU正在使用的slab缓冲区描述符,freelist指向此slab的下一个空闲对象struct page *partial;	//该CPU的部分空slab链表,该链表中的slab会被冻结
};

成员很简单,需要说明的是struct page *page,这个指向的是CPU正在使用的slab缓冲区,为什么page指向的是slab描述符呢?别忘记,struct page是个联合体,可作为slab缓存描述符。相比于slab,其每cpu保存的是空闲对象,是slab缓冲区的子集。

4、缓冲区描述符struct page

struct page {unsigned long flags;		/* Atomic flags, some possibly updated asynchronously */struct {	/* slab, slob and slub */struct list_head slab_list; //通过该变量链接slab描述符到部分空或者完全用尽slab管理链表struct kmem_cache *slab_cache; //指向该slab描述符所属的slab管理结构/* Double-word boundary */void *freelist;		/* first free object */union {unsigned long counters;		/* SLUB */struct {			/* SLUB */unsigned inuse:16;	//该slab缓冲区中正在使用的对象数量unsigned objects:15; //该slab缓冲区包含的对象数量unsigned frozen:1;	//slab缓冲区冻结状态};};};...
};

上面有说过,struct page是个联合体,我们把针对slub的成员变量择出来看,比较清晰。

5、kmem_cache_node

最后是每node变量,相比于slab的三个slab管理链表,slub只有部分空链表,而完全用尽链表只有在打开slub debug开关时才会存在。

struct kmem_cache_node {spinlock_t list_lock;unsigned long nr_partial;struct list_head partial; //该node的部分空slab链表//开启CONFIG_SLUB_DEBUG才有完全用尽slab链表,主要用于调试atomic_long_t nr_slabs;atomic_long_t total_objects;struct list_head full; //完全用尽slab链表
};

6、结构关系

这么多结构,还是通过图来说明比较清晰明了。

  • 所有的slab缓存都挂载在slab_caches全局链表上,这也就是我们在/proc/slabinfo中看到的所有slab缓存
  • 每个slab缓存对应一个kmem_cache结构
  • kmem_cache结构中有一个每CPU变量kmem_cache_cpu结构,用来作为本地CPU的高速缓存,存放的是slab缓冲区
  • 每CPU变量kmem_cache_cpu结构中的freelist指向下个可用的slab对象
  • kmem_cache结构中还有一个每Node的kmem_cache_node结构,用来作为NUMA结构中Node的缓存
  • kmem_cache_node结构中包含两个slab链表,partial、full(在slub debug开关开启时),存放的是slab缓冲区
  • slab缓冲区使用页描述符呈现,每个slab缓冲区中会包含多个对象
    在这里插入图片描述

http://chatgpt.dhexx.cn/article/xRx8ko77.shtml

相关文章

slub debug(linux4.16.1)

在命令行选项中添加slub_debugUFPZ,以使能相关检测功能,其含义如下: (1)U:跟踪该slab内存的相关属性,如其创建时所属的cpu、进程、时间 (2)F:开启sanity检查功…

linux内核内存管理slub

一、概述 linux内存管理核心是伙伴系统,slab,slub,slob是基于伙伴系统之上提供api,用于内核内存分配释放管理,适用于小内存(小于1页)分配与释放,当然大于1页…

内存管理 slub算法

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

linux slub分配器,slub分配器

原标题:slub分配器 概述: Linux的物理内存管理采用了以页为单位的buddy system(伙伴系统),但是很多情况下,内核仅仅需要一个较小的对象空间,而且这些小块的空间对于不同对象又是变化的、不可预测的,所以需要…

Linux内存管理(八): slub分配器和kmalloc

kernel: 5.10 Arch: aarch64 上文 介绍过, 伙伴系统在分配内存时是以物理页为单位的,但在很多场景下,内存需要分配的大小是以字节为单位的,达不到一个物理页的大小。如果继续使用伙伴系统进行内存分配, 那么就会出现严…

Linux 踩内存 slub,Linux SLUB 内存分配器分析

本文简介 本文主要介绍了Linux SLUB分配的产生原因、设计思路及其代码分析。适合于对Linux内核,特别是对Linux内存分配器感兴趣的读者。 1.为何需要SLUB? Linux SLUB内存分配器合入Linux主分支已经整整10年了!并且是Linux目前默认的内存分配器…

SLUB

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

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

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ SLUB和SLAB的区别 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB,slub分配器是slab分配器的进化版,而slob是一种精简的小内…

Linux 内存管理(三)—— SLUB

目录 一、概述 二、SLUB 2.1 数据结构 2.2 初始化 2.2.1 静态建立过程 2.3 API 2.3.1 kmem_cache_create 2.3.2 kmem_cache_alloc 2.3.3 kmem_cache_free 2.3.4 kmalloc/kfree 三、参考 一、概述 伙伴系统最小的分配单位是页,这对于较小的内存需求会造…

SLUB内存管理的4个主要接口函数介绍(4)

slub内存管理的4个主要接口函数如下(参考kernel-4.19): //slab缓存的创建 struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void *)); //slab object的分配 void *k…

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

SLUB和SLAB的区别 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB,slub分配器是slab分配器的进化版,而slob是一种精简的小内存分配算法,主要用于嵌入式系统。慢慢的slab分配器或许会被slub取代&…

SLUB的引入及举例说明

我们都知道Buddy分配器是按照页的单位分配的(Buddy系统分配器实现),如果我们需要分配几十个字节,几百个字节的时候,就需要用到SLAB分配器。 SLAB分配器专门是针对小内存分配而设计的,比如我们驱动中常见的…

电信光猫改桥接模式

如果只是改桥接 可以试试下面这两个地址:http://192.168.1.1/bridge_route.gchhttp://192.168.1.1:8080/bridge_route.gch 转载于:https://www.cnblogs.com/Devopser/p/11257535.html

电信光猫改桥接还在苦苦破解超级密码吗?

电信光猫路由改桥接,不同的地区有不通的方法。比较幸运的地区和终端,有通用的超级密码。但是不幸的地区,就需要通过破解这个超级密码。我就属于比较不幸的地区,遇到不幸的终端:天翼网关TEWA-708G。然后按照网上大神的破…

获取电信光猫TEWA-600超级管理密码,修改电信光猫为桥接模式

文章转载:玩转盒子 前些年各地运营商响应国家政策,光进铜退小区宽带由网线入户改成光缆入户,这样必须用光猫把光信号转换成电信号。我用的是中国电信的宽带,2017年我们小区也进行了网络改造,网线入户变成了光缆入户。…

友华PT921G光猫破解获取超级密码和更改桥接模式

获取超级密码 1.登陆光猫管理地址192.168.1.1 2.打开新的窗口输入:http://192.168.1.1/romfile.cfg ,就能下载到配置文件 3.用记事本打开romfile.cfg,点击编辑–>查找–>输入telecomadmin->点击查找下一个 4.查找到username“telecomadmin”,而…

为了改桥接,我决定破解中兴F450G V2光猫

还记得我之前买了个猫棒来替换光猫么?用了一个来月,发现这玩意真的不稳定,短则几分钟长则一两天它必定自己重启一次,导致我的网络时不时就会断线。这玩意不好使,我也没有别的光猫,只好找电信装维师傅给我改…

大话设计模式-桥接模式

使用场景:桥接模式的核心意图就是将这些实现独立出来,让它们各自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。 多用聚合,少用继承 1. 手机软件抽象类、通讯录类、游戏类 package com.hj.designPat…

电信光猫/烽火HG6543c1光猫超级密码获取改桥接模式( 中国电信浙江公司定制天翼网关3.0)

第一步:开telnet 浏览器网址栏输入:192.168.1.1:8080/cgi-bin/telnetenable.cgi?telnetenable1 第二步:使用pytty软件登入光猫 (Putty软件下载:https://download.csdn.net/download/qq_34885669/12098009&#xff0…

保姆级-光猫改桥接-路由拨号-openwrt端口转发-阿里云DNS域名解析访问家中设备

准备: 1.公网ip(江苏省电信,电话1分钟解决) 2.域名(最好备案了) 3.路由器(我的是红米AC2100刷openwrt,重点路由器要有动态dns服务的功能,端口转发功能什么路由器都有) 往期教程 路由器固件刷写 红米AC210…