SLUB

article/2025/11/10 2:38:40

内核管理页面使用了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。


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

相关文章

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…

单臂路由 光猫桥接 一根网线复用

由于弱电箱太小, 二级路由拨号只能放客厅里。 这就导致其他房间无法上网了。 下面是单臂路由设置方法, 光猫桥接的端口下的设备,同样可以上网。 充分利用光猫端口。 前提: 光猫需要超级密码 二级路由固件为 openwrt ​​​​​

光猫桥接模式路由器拨号成功 端口映射失败的原因

路由器拨号成功,光猫必须是桥接模式。 光猫从路由模式设置为桥接模式的操作过程: 在浏览器地址栏中输入光猫的地址192.168.1.1, 进入光猫的登陆界面,输入超级用户名和密码, 用户:CMCCAdmin(或telecomadmin &#xff0…

电信网关改造无线打印服务器,电信天翼网关路由改桥接流程

大家好,好多网友要求我发一份网关路由改桥接的流程,由于平日工作太忙,更新点有慢,以后会多多分享平日工作中碰到的一些关于网络的各种问题。 路由改桥接首先准备以下两样。 1.网关一台(不管是四口还是二口都可以) 2.光猫超级密码&…

DDNS之光猫改桥接

相信有很多小伙伴在折腾远程开机的时候,都遇到了这样一个问题: 在成功实现了局域网唤醒之后,无论怎么设置DDNS、端口映射都没办法实现广域网唤醒。 究竟是什么一个原因导致的呢?亿元程序员今天就给大家讲解其中一个原因&#xff…

电信中兴f452光猫路由改桥接最简单的方式,亲自体验成功。

家里的光猫是中兴f452,默认是路由模式,改为桥接由路由器拨号,过程如下,验证成功。前提是去电信营业厅申请内网IP改公网IP,申请通过后再进行如下操作。 1、网上的方法很多都是用超级用户密码登陆,也就是用户…

宽带开启ipv6的方法(包含光猫改桥接和光猫改桥接后访问其管理界面以及路由器拨号)

本文将介绍移动宽带如何开启ipv6 你为什么需要ipv6? 关于v4 v6地址个数的差别不再赘述,主要介绍对于家庭用户的实际意义 开启ipv6之后,种子下载文件时,可以从只有ipv6的设备获取资源,增加了资源个数,赚钱宝…

光猫桥接后宽带降速问题解决

文章目录 一、背景二、解决方案三、升级款改动四、排查经历 一、背景 光猫桥接使用路由器拨号后宽带降速到原来的一半。 条件: 1、新办的电信宽带2、光猫桥接,路由器拨号3、光猫10Gbps接口,路由器1Gbps接口 现象: 光猫路由器…