linux 内存管理的slab机制分析

Linux内存管理与优化指南:从原理到实践 Linux操作系统的内存架构经过多年的演进,从早期简单的内存管理到现在的高度复杂和优化。在早期的Linux系统中,内存管理较为简单,主要依赖于分段和分页机制。随着时间的推移,为了提高内存的使用效率,减少碎片化,以及更好地支持大内存系统,Linux引入了SLAB内存管理机制、伙伴系统和虚拟内存等重要概念。内存泄漏是指程序在申请内存后,未能在不再需要时释放已分配的内存块,导致这些内存无法被系统或其他程序重用,最终耗尽系统内存资源。内存泄漏的类型大致可分为两类:显式内存泄漏和隐式内存泄漏。 阅读详情

Linux内核中基于伙伴算法实现的分区页框分配器适合大块内存的请求,它所分配的内存区是以页框为基本单位的。对于内核中小块连续内存的请求,比如说几个字节或者几百个字节,如果依然分配一个页框来来满足该请求,那么这很明显就是一种浪费,即产生内部碎片(internal fragmentation)

为了解决小块内存的分配,Linux内核基于Solaris 2.4中的slab分配算法实现了自己的slab分配器。除此之外,slab分配器另一个主要功能是作为一个高速缓存,它用来存储内核中那些经常分配并释放的对象。

1.slab分配器的基本原理

slab分配器中用到了对象这个概念,所谓对象就是内核中的数据结构以及对该数据结构进行创建和撤销的操作。它的基本思想是将内核中经常使用的对象放到高速缓存中,并且由系统保持为初始的可利用状态。比如进程描述符,内核中会频繁对此数据进行申请和释放。当一个新进程创建时,内核会直接从slab分配器的高速缓存中获取一个已经初始化了的对象;当进程结束时,该结构所占的页框并不被释放,而是重新返回slab分配器中。如果没有基于对象的slab分配器,内核将花费更多的时间去分配、初始化以及释放一个对象。

slab分配器有以下三个基本目标:

1.减少伙伴算法在分配小块连续内存时所产生的内部碎片;

2.将频繁使用的对象缓存起来,减少分配、初始化和释放对象的时间开销。

3.通过着色技术调整对象以更好的使用硬件高速缓存;

2.slab分配器的结构

slab分配器为每种对象分配一个高速缓存,这个缓存可以看做是同类型对象的一种储备。每个高速缓存所占的内存区又被划分多个slab,每个slab是由一个或多个连续的页框组成。每个页框中包含若干个对象,既有已经分配的对象,也包含空闲的对象。slab分配器的大致组成图如下:

每个高速缓存通过kmem_cache结构来描述,这个结构中包含了对当前高速缓存各种属性信息的描述。所有的高速缓存通过双链表组织在一起,形成高速缓存链表cache_chain。每个kmem_cache结构中并不包含对具体slab的描述,而是通过kmem_list3结构组织各个slab。该结构的定义如下:

1struct kmem_list3 {
2        struct list_head slabs_partial;
3        struct list_head slabs_full;
4        struct list_head slabs_free;
5        unsigned long free_objects;
6        unsigned int free_limit;
7        unsigned int colour_next;
8        spinlock_t list_lock;
9        struct array_cache *shared;
10        struct array_cache **alien;
11        unsigned long next_reap;
12        int free_touched;
13};

可以看到,该结构将当前缓存中的所有slab分为三个集合:空闲对象的slab链表slabs_free,非空闲对象的slab链表slabs_full以及部分空闲对象的slab链表slabs_partial。每个slab有相应的slab描述符,即slab结构,它的定义如下:

1struct slab {
2        struct list_head list;
3        unsigned long colouroff;
4        void *s_mem;
5        unsigned int inuse;
6        kmem_bufctl_t free;
7        unsigned short nodeid;
8};

slab描述符中的list字段标明了当前slab处于三个slab链表的其中一个。我们将上述的slab分配器进行细化,可以得到下面的结构图:

3.高速缓存的分类

slab高速缓存分为两大类,普通高速缓存和专用高速缓存。普通高速缓存并不针对内核中特定的对象,它首先会为kmem_cache结构本身提供高速缓存,这类缓存保存在cache_cache变量中,该变量即代表的是cache_chain链表中的第一个元素;另一方面,它为内核提供了一种通用高速缓存。专用高速缓存是根据内核所需,通过指定具体的对象而创建。

3.1 普通高速缓存

slab分配器中kmem_cache是用来描述高速缓存的结构,因此它本身也需要slab分配器对其进行高速缓存。cache_cache变量保存着对高速缓存描述符的高速缓存。

1static struct kmem_cache cache_cache = {
2        .batchcount = 1,
3        .limit = BOOT_CPUCACHE_ENTRIES,
4        .shared = 1,
5        .buffer_size = sizeof(struct kmem_cache),
6        .name = "kmem_cache",
7};

slab分配器所提供的小块连续内存的分配是通过通用高速缓存实现的。通用高速缓存所提供的对象具有几何分布的大小,范围为32到131072字节。内核中提供了kmalloc()和kfree()两个接口分别进行内存的申请和释放。

3.2 专用高速缓存

内核为专用高速缓存的申请和释放提供了一套完整的接口,根据所传入的参数为具体的对象分配slab缓存。

高速缓存的申请和释放

kmem_cache_create()用于对一个指定的对象创建高速缓存。它从cache_cache普通高速缓存中为新的专有缓存分配一个高速缓存描述符,并把这个描述符插入到高速缓存描述符形成的cache_chain链表中。kmem_cache_destory()用于撤销一个高速缓存,并将它从cache_chain链表上删除。

slab的申请和释放

kmem_cache_alloc()在其参数所指定的高速缓存中分配一个slab。相反,kmem_cache_free()在其参数所指定的高速缓存中释放一个slab。

【Unity】入门教程第一期-下载安装Unity编辑器(下) 讲解如何在Unity Hub中下载Unity编辑器以及IED环境 阅读详情

相关推荐

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

ProceduralMan的博客 7410

linux伙伴系统初探

来源:百度百科http://baike.baidu.com/view/4935190.htm?fr=wordsearch 待后续补充 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示。四级页表分别为: 页全局目录(Page Global Directory) 页上级目录(Pag

aganlengzi的专栏 896

2016域控服务器迁移,WIN Server2016 域服务器迁移出错

各位大神: 这几天刚安装了一台windows server 2016做域迁移时出现错误:1、默认SYSLOG、NETLOGON共享文件重启后自动取消共享,即使手动打开后依然会出现自动取消2、组策略中编辑策略时出现以下报错 policys.png (19.29 KB)2017-2-7 13:52操作此动作之前可以访问本机的共享(NETLOGON)3、使用DCDIAG检测多个报错:C:\Use...

weixin_31833039的博客 3314

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

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

tombaby_come的博客 2972

高等数学第五章---定积分(§5.3定积分的计算方法)

这篇博客详细讲解定积分的计算方法,包括直接法、凑微分法、变量代换法和分部积分法。通过典型例题演示如何运用这些技巧计算定积分,特别强调换元必换限的原则和奇偶函数的简化处理。内容涵盖代数变形、三角代换、分段函数积分等常见题型,并附有详细的解题步骤和常见错误分析。适合微积分学习者系统掌握定积分计算技巧,提升解题效率。文中还包含积分等式证明和变限积分函数求导等进阶内容,帮助读者深入理解定积分的应用。

2302_77045867的博客 4334

HC-05蓝牙模块详细配置、连接与使用过程

用手按着模块上的按键,再给蓝牙模块上电。当蓝牙模块上的灯慢闪的时候就说明进入了配置模式了。在配置蓝牙的时候一定要将串口助手按这个要求配置:设置波特率 38400,数据位 8 位,停止位 1 位,无校验位,这是固定操作! 根据蓝牙的主从模式进行不同的设置,二者主要区别就在于AT+ROLE这个指令如果这里没返回OK可能有一下几种情况:如果正常返回OK,那就可以进行下一步了 配置蓝牙密码的时候,特别是配置HC05,密码必须加双引号"",否则不能正常设置!!!! 给从机模式蓝牙配置好之后,将蓝牙重

qq_51688022的博客 2万+

linux内核内存管理学习之三(slab分配器)

一、概述 在linux内核中伙伴系统用来管理物理内存,其分配的单位是页,但是向用户程序一样,内核也需要动态分配内存,而伙伴系统分配的粒度又太大。由于内核无法借助标准的C库,因而需要别的手段来实现内核中动态内存的分配管理,linux采用的是slab分配器。slab分配器不仅可以提供动态内存的管理功能,而且可以作为经常分配并释放的内存的缓存。通过slab缓存,内核能够储备一些对象,供后续使用。 采

浩海拾贝 1万+

ML307A模组连接ONENET平台(AT指令步骤教程)

ML307A 是一款集成度高、体积小的物联网通信模组,支持多种无线通信协议,如 LoRa、NB-IoT 等。它具有低功耗、远程通信等特点,适用于多种物联网场景。支持 LoRa 和 NB-IoT 等多种无线通信标准。提供丰富的 GPIO 接口。内置多种传感器支持。UART 接口:用于与微控制器或其他设备通信。GPIO 接口:可以连接外部传感器或执行器。电源接口:用于供电。OneNET 是中国移动推出的一款物联网开放平台,它提供了从数据采集、存储到分析的一站式解决方案。

xiewengeng的博客 5481

17.6 LangSmith 私有化部署实战指南:企业级AI应用的安全基石

LangSmith 私有化部署, 企业级AI开发平台, 数据隐私合规, 混合云架构, 模型监控与审计。

yonggeit的博客 3777

【WRF-Urban】Registry.EM_COMMON文件概述及urban有关变量

Registry.EM_COMMON文件概述及urban有关变量

WW、forever的博客 1594

LINUX内存管理之slab机制

slab机制解析引言1 概述1.1 kmem_cache1.2 kmem_cache_node1.3 page2 源码解读 引言 slab是Linux在伙伴系统之上的一种内存管理机制。伙伴系统最小的内存处理大小为4k(即一页的内存大小),然而,实际使用内存过程中,很多都是小内存,为了提高内存申请释放效率、防止内存碎片的产生、防止内存连续分配导致CPU缓存命中率低,linux在伙伴系统之上设计出sl...

fs3296的博客 1202

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Linux内存管理:(四)物理页面分配之slab机制分配小内存 及 Linux6.5源码分析

文章介绍:slab机制分配小内存的详细步骤及原理, 分析Linux6.5内核的实现方法; Linux内存管理系列文章之一

abobob的博客 1327

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

slab 机制

slab机制 1.内部碎片和外部碎片 外部碎片 什么是外部碎片呢?我们通过一个图来解释: 假设这是一段连续的页框,阴影部分表示已经被使用的页框,现在需要申请一个连续的5个页框。这个时候,在这段内存上不能找到连续的5个空闲的页框,就会去另一段内存上去寻找5个连续的页框,这样子,久而久之就形成了页框的浪费。称为外部碎片。 内核中使用伙伴算法的迁移机制很好...

cool grass's blog 423

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

slab、slub内存管理与泄漏分析

经典博客 类型 文章 slab、slub的关系 SLUB和SLAB的区别 系统性介绍kernel内存泄漏检测 Linux内存管理 (22)内存检测技术 drop_cache应用 liunx的Slab占用比较高的问题 slub、slab内存泄漏诊断有区别 https://blog.csdn.net/dolp怎样诊断SLAB泄露问题 判断slub、slab是否内存泄漏 ...

卓越之路 2286

Linux内存之Slab与slabtop命令

文章目录1. 背景2. 简介3. 查询3.1 /proc/meminfo的Slab和SReclaimable项3.2 命令slabtop查看slab占用情况3.3 cache查看3.4 系统缓存回收机制的设置项3.5 /proc/slabinfo文件信息3.6 统计Slab占用超过100M的对象 1. 背景 Linux内存管理模式,页式管理适合于大块内存的情形,而对于内核对象级别的较小内存情形下,不足以占用1个页。 在linux内核中会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry

爱死亡机器人 6575

Linux内核的SLAB内存管理机制

Linux内核的SLAB内存管理机制

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

记录Slab占用内存过大导致kill程序的情况

起因 在应用程序的老化测试时发现,系统被kill掉,但是从kill掉的内核打印信息,没有发现太大的问题。 [411371.892812] ntpd invoked oom-killer: gfp_mask=0x27000c0(GFP_KERNEL_ACCOUNT|__GFP_NOTRACK), nodemask=0, order=1, oom_score_adj=0 [411371.911869]...

chengwei_peng 7575

linux 内存管理 二

疫情憋在家,继续写下笔记,Buddy 算法把空闲页面管理起来,一个已经被占用的页面,其他人肯定不能申请到的,这些页面都是4k 8k 16k .... ,无论是在内核还是在应用,有时候都要申请很小的内存。比如说我们在内核中需要申请16Bytes,Buddy 还是申请4K的内存,这样就很乱费,所以在内核里面会进行内存的二次管理,在Buddy中申请的内存进行切割,内核中这种机制叫做slab。 Slab...

mj5742356的专栏 366

memory managerment slab allocator(2)

HI

u011279649的专栏 2922

Linux内存分配机制:SLAB / SLUB / SLOB

Linux内存分配机制:SLAB / SLUB / SLOB

游手好弦 信步涂鸦 8301

C++ 内存管理分析

C++ 内存管理分析: 1.memcache memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用 以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著[1]。...

chuchaner7283的博客 180

Linux 内存管理实战:从伙伴系统到 SLAB 分配器的生产级调优

* 业务对象结构体,模拟生产环境中的会话管理 *//* 每对象自旋锁,避免全局锁竞争 *//** 创建专用 SLAB 缓存* 关键参数说明:* - SLAB_HWCACHE_ALIGN:对象按 CPU 缓存行对齐,减少 false sharing* - 构造函数 session_ctor:初始化自旋锁等通用字段* 避免每次分配后重复初始化,降低 CPU 开销*/"session_entry_cache", /* 缓存名称,出现在 /proc/slabinfo */

jiang_style的博客 3622

解密Slab分配器:内存管理的高效武器

Slab 分配器是 Linux 内核中一种极为重要的内存管理机制,主要用于高效管理小块内存的分配。它针对频繁分配和释放的小对象进行了专门优化,能够有效减少内存碎片,显著提高系统性能。在 Linux 内核的众多子系统中,Slab 分配器得到了广泛应用,比如网络缓冲区、文件系统缓存以及进程控制块等领域。Slab 分配器的核心概念包括 Cache(缓存)、Slab 和 Object。其中,Cache 是为每种类型的对象创建的缓存,每个缓存存储相同大小的对象集合。

深度Linux 1027

slab内存管理源代码分析

        学习计算机原理,最好是实践或看高手写的源代码,在一定程度上就不再会感到原理的抽象。关于slab一些原理资料,可以在这里下载或到网站有更多的信息和资料。Slab内存管理机制已被广泛使用,要找到使用slab管理内存的开源代码也不难,如一些OS内核中的内存管理。既然要分析理解slab,最好还是选择复杂度和代码量都不要太大的,在这里我选取了glib-2.12.9的gslice.c实现的sl

4224

Linux内存管理终极指南:深入解析slab着色与缓存利用率优化技术

在Linux内核的性能优化中,内存管理是一个至关重要的环节。本文将带你深入探索Linux内存管理中的slab着色技术,揭示如何通过优化缓存利用率来大幅提升系统性能。无论你是系统管理员还是开发人员,理解这些底层机制都将帮助你构建更高效的应用程序。✨ ## 什么是slab着色技术? slab着色是Linux内核中一种巧妙的缓存优化技术,旨在减少CPU缓存冲突,提高内存访问效率。想象一下CPU缓存就

gitblog_00264的博客 924
上一篇: Linux块设备驱动
下一篇: malloc内核实现原理
LinuxWorking
博客等级 码龄10年 24粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值