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

Linux内存管理—Slab分配器 Slab分配器的引入 内部碎片 内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间 内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。 举例:某进程向系统申请了3K内存空间,系统通过伙伴系统算法可能分配给进程4K(一个标准页面)内存空间,导... 阅读详情
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 < cachep->num; i++) {
void *objp = slabp->s_mem + cachep->objsize * i;

if (cachep->flags & SLAB_POISON) {
#ifdef CONFIG_DEBUG_PAGEALLOC
if ((cachep->objsize%PAGE_SIZE)==0 && OFF_SLAB(cachep))
kernel_map_pages(virt_to_page(objp), cachep->objsize/PAGE_SIZE,1);
else
check_poison_obj(cachep, objp);
#else
check_poison_obj(cachep, objp);
#endif
}
if (cachep->flags & SLAB_RED_ZONE) {
if (*dbg_redzone1(cachep, objp) != RED_INACTIVE)
slab_error(cachep, "start of a freed object "
"was overwritten");
if (*dbg_redzone2(cachep, objp) != RED_INACTIVE)
slab_error(cachep, "end of a freed object "
"was overwritten");
}
if (cachep->dtor && !(cachep->flags & SLAB_POISON))
(cachep->dtor)(objp+obj_dbghead(cachep), cachep, 0);
}
#else
/*在撤销slab块的时候调用析构函数,析构每一个对象,在新版本的kernel中,已经没有了析构函数,只有构造函数*/
if (cachep->dtor) {
int i;
for (i = 0; i < cachep->num; i++) {
void* objp = slabp->s_mem+cachep->objsize*i;
(cachep->dtor)(objp, cachep, 0);
}
}
#endif

if (unlikely(cachep->flags & SLAB_DESTROY_BY_RCU)) {
struct slab_rcu *slab_rcu;

slab_rcu = (struct slab_rcu *) slabp;
slab_rcu->cachep = cachep;
slab_rcu->addr = addr;
call_rcu(&slab_rcu->head, kmem_rcu_free);
} else {
/*释放给buddy system*/
kmem_freepages(cachep, addr);
/*如果是外置slab管理对象,则在那个cache中进行销毁*/
if (OFF_SLAB(cachep))
kmem_cache_free(cachep->slabp_cache, slabp);
}
}
Linux内核:内存管理——slab分配器 Linux内核中基于伙伴算法实现的分区页框分配器适合大块内存的请求,它所分配的内存区是以页框为基本单位的。对于内核中小块连续内存的请求,比如说几个字节或者几百个字节,如果依然分配一个页框来来满足该请求,那么这很明显就是一种浪费,即产生内部碎片(internal fragmentation)为了解决小块内存的分配,Linux内核基于Solaris 2.4中的slab分配算法实现了自己的slab分配器。除此之外,slab分配器另一个主要功能是作为一个高速缓存,它用来存储内核中那些经常分配并释放的对象。 阅读详情

相关推荐

linux内核虚拟内存之slub分配器

每个对象内存的offset偏移位置都存放着下一个空闲对象,offset通常为0,也就是复用对象内存的第一个字来保存下一个空闲对象的指针,当满足条件(flags & (SLAB_DESTROY_BY_RCU | SLAB_POISON)) 或者有对象构造函数时,offset不为0,每个对象的结构如下图。销毁过程比创建过程简单的多,主要工作是释放partial队列所有page,释放kmem_cache_cpu,释放每个node的kmem_cache_node,最后释放kmem_cache本身。

m0_74282605的博客 319

kernel hacker修炼之道之内存管理-SLAB(撤销SLAB块slab_destroy())

撤销SLAB高速缓存slab_destroy() 作者:李万鹏 于北京 borqs static void slab_destroy (kmem_cache_t *cachep, struct slab *slabp){ /*获得第一个对象的地址*/ void *addr = ...

tomhibolu 212

【信息科学与工程学】计算机科学与自动化——第五十一篇 Linux内核函数算法与依赖关系

函数名称算法表达式/方程名称方程表达参数列表软件依赖硬件依赖应用场景时间复杂度空间复杂度​进程调度决策算法P:进程集合t:时间w_i:权重cpu:CPU1. 定时器中断2. 进程状态机3. 负载均衡4. 上下文切换协议1. 时间戳计数器2. 缓存层次3. 中断控制器4. TLB刷新进程调度O(log n)O(k)​进程创建算法clone_flags:克隆标志1. 命名空间时序2. 资源计费3. 信号处理4. 调度器激活。

weixin_49199313的博客 442

Linux内存管理之slab分配器分析(七 释放slab)

上一篇回收slab对象时,先考虑放入local cache,当local cache已超过上限时,尝试放入shared cache。 否则从local cache中批量释放batch_count对象放入slab三链。 当slab三链的空闲对象超过上限,并且待释放的slab对象对应的slab中已经没有正在使用的对象时,将slab直接释放掉。 释放slab对应的函数是slab_destroy,下面分析一下。 /** * slab_destroy - destroy and release all obje

weixin_39094034的博客 538

AI应用架构师:引领半导体良率AI预测的变革浪潮

在半导体行业这个技术密集、资本密集且竞争异常激烈的领域,良率是决定企业盈利能力的关键指标。每提升1%的良率可能意味着数亿美元的利润增长。然而,随着制程节点不断缩小至3nm、2nm甚至更先进水平,传统的良率管理方法已难以应对日益复杂的制造流程和指数级增长的数据量。本文将深入探讨AI应用架构师如何成为这场变革的核心驱动力,通过设计和实施先进的AI预测系统,将半导体良率预测从传统的"事后分析"转变为"事前预测"和"实时优化"。

AI大模型应用之禅 403

MDPI期刊投稿全流程解析:从注册到提交的实用指南

本文详细解析了向MDPI期刊投稿的全过程,从注册账号、完善个人资料、上传稿件,到填写作者信息、推荐审稿人及提交附信等关键步骤。指南强调了使用机构邮箱、遵循期刊模板、认真准备Cover Letter等实用技巧,旨在帮助作者高效、规范地完成投稿,避免常见错误,提升稿件处理效率。

weixin_29250403的博客 922

Linux内存管理之slab分配器分析(续三)

六:kmem_cache_alloc的实现分析:我们在上面可以看到,创建一个cache描述符的时候,并没有这之分配slab数据。现在我们来看一下怎么从cache中申请对象void * kmem_cache_alloc (kmem_cache_t *cachep, int flags){     return __cache_alloc(cachep, flags);}实际上会调用__cache_alloc如下:static inline void * __cache_alloc (kmem_cache_t

lcw_202的专栏 920

告别命令行恐惧!用TBtools的MCScanX插件,5分钟搞定拟南芥和水稻的基因组共线性分析

本文介绍如何利用TBtools的MCScanX插件快速完成拟南芥和水稻的基因组共线性分析,无需命令行操作,5分钟即可生成专业可视化结果。通过图形化界面简化传统MCScanX的复杂流程,特别适合非生物信息背景的研究者,显著提升基因组数据分析效率。

dianzhuique8587的博客 376

内核调试配置选项

转自:http://www.ibm.com/developerworks/cn/linux/l-kdb/ 内核调试配置选项 为了方便调试和测试代码,内核提供了许多与内核调试相关的配置选项。这些选项大部分都在内核配置编辑器的内核开发(kernel hacking)菜单项中。在内

Yasin Lee 6993

spring boot 集成cas(一) 服务端搭建

简单点就是统一服务认证,多个系统一次登录。俗称单点登录。

慕孑晨的博客 1955

Ubuntu1804 关于ubuntu18.04下载软件仓库信息失败,请检查网络连接 的解决方案

今天电脑在更换软件源的时候遇到了这个问题。出现了如上图所示的错误信息。 尝试了各家优快云的博客之后,发现方法大同小异,均无法解决。 方法大多都是要求更换软件源,如下所示: 打开“Ubuntu软件中心”-->点击“编辑”-->点击“软件源”-->在Ubuntu软件界面,“下载自”默认是“中国的服务器”,改为“主服务器”试试 2.打开更新管理器-》设置-》选择站点-》...

weixin_43729409的博客 1万+

Linux内存管理之slab分配器分析

一:准备知识: 前面我们分析过了大内存分配的实现机制,事实上,若为小块内存而请求整个页面,这样对于内存来说是一种极度的浪费。因此linux采用了slab来管理小块内存的分配与释放。Slab最早是由sun的工程师提出。它的提出是基于以下因素考虑的: 1:内核函数经常倾向于反复请求相同的数据类型。比如:创建进程时,会请求一块内存来存放mm结构。 2:不同的结构使用不同的分配方法可以提高效率。同样

ninver2007的专栏 969

【GlobalMapper精品教程】094:GlobalMapper26简体中文版安装教程(附安装包下载)

【GlobalMapper精品教程】094:GlobalMapper26简体中文版安装教程(附安装包下载)- 基于深度学习的图像分析工具,用于自动识别土地覆盖分类、建筑物提取和车辆检测。新的太阳阴影分析工具,用于计算加载地形和 3D 要素的阴影。新的 GENERATE_SHADOWS 脚本命令允许自动执行这些计算。新增点云模型关键点自动识别。能够在自动点云分析工具中保存和加载自定义创建的要素模型。改进了像素到点中各种潜在重叠图像中 GCP 的自动识别。

智慧空间实验室 4882

内存管理-SLAB(销毁SLAB高速缓存kmem_cache_destroy())

调用kmem_cache_destroy()释放cache。这个函数一般是在模块卸载的时候调用,在调用这个函数之前,cache应该是empty的。调用者必须保证在执行kmem_cache_destroy()的时候,不会对这个cache有任何内存分配。这里将share local slab中的指针释放回slab,然后对slabs_free上所有的slab进行释放。 int kmem

白水煮鸡蛋 3831

国科大学习资料--矩阵论(叶世伟)-期末考试题整理3

国科大学习资料–矩阵论-期末考试题整理3 国科大学习资料–矩阵论-期末考试题整理3 国科大学习资料–矩阵论-期末考试题整理3

无名何许人的博客 1401

节省人力成本40%!仓储物流AI机器人调度系统实战案例(含路径规划算法与系统架构图)

首先,我们需要定义一个Node类self.x = x # 节点x坐标self.y = y # 节点y坐标self.g = g # 从起点到当前节点的实际成本(g值)self.h = h # 从当前节点到终点的启发式成本(h值)self.f = g + h # 总成本(f值)self.parent = None # 父节点(用于回溯路径)self.task_id = task_id # 任务IDself.priority = priority # 任务优先级(1=最高,5=最低)

小程序开发 948

kernel hacker修炼之道之内存管理-SLUB(撤销SLAB块free_slab())

撤销SLAB块free_slab() 作者:李万鹏 于北京 borqs SLUB分配器使用free_slab()来释放slab块。 static void free_slab(struct kmem_cache *s, struct page *page){ if (unlikely(s-&gt;flags &a...

tomhibolu 307

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux内存分配器SLOB,Linux内存管理中的slab分配器

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

weixin_29539039的博客 307

android 蓝牙通讯demo

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

linux内核原理--分页,页表,内核线性地址空间,伙伴系统,内核不连续页框分配,内核态小块内存分配器

分页机制与页表;内核态线性地址空间划分;内核态连续页框分配器--基于伙伴系统;内核态小块空间分配器--基于slab;vmalloc,vfree实现的内核中不连续页框分配

x13262608581的博客 1562

计算机控制技术及应用

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

CONFIG_DEBUG_PAGEALLOC学习

参考 关于PAGE_DEBUG_PAGEALLOC一些说明

pengdonglin137的专栏 306

Linux内核代码分析 slab.c

slab.c来自linux内核2.4.22版,本文件按照GNU协议发布。一、准备知识:slab的概念:提出的原因:由于操作系统在运行中会不断产生、使用、释放大量重复的对象,所以对这样的重复对象的生成进行改进可以大大提高效率 解决buddy system造成的内存浪费问题最早由sun的工程师提出(1994

thewayma的专栏 1596

SLUB知识点记录

1. Linux内核释放内存以后,可能会把其值设置为0x6b#definePOISON_INUSE 0x5a/* for use-uninitialised poisoning */#define POISON_FREE 0x6b/* for use-after-free poisoning */#define POISON_END0xa5 /* end-byte of poisoning */2...

bin_linux96的专栏 1038

Linux内核模块开发 Slab高速缓存接口与用例

在内核模块开发或者驱动开发中经常会使用到内存分配,常见的方式是调用 kmalloc 接口分配内存。 static __always_inline void *kmalloc(size_t size, gfp_t flags); kmalloc接口使用简单,并且不会对所获取的空间清零,分配的空间仍然保持着原有的数据。但是根据&lt;linux设备驱动程序&gt;一书中的说法,kmalloc能够...

fuyuande的博客 1029

MIPS assemble instruction analysis in check_poison_obj

 The C code in kernel as the following: for (i = 0; i 1792 char exp = POISON_FREE;1793 if (i == size - 1)1794 exp = POISON_E

michael_kang的专栏 1174

Linux kernel的调试技术

内核中的调试支持 内核开发者在内核中建立了很多调试功能。但是这些调试功能会造成额外的输出,并且导致性能下降,因此发行版厂商通常会禁止发行版内核中的这些功能。但是作为一名内核开发者,调试需求具有更高优先级,从而乐意接受额外的调试支持而带来的性能损失。 这里列出内核开发的几个配置选项,除特殊指出,所有这些选项均出现在“kernel hacking”菜单。并非所有体系架构都支持其中的某些选线。更多的调试功可能查看lib/Kconfig.debug文件,或者在menuconfig中搜索关键字debug。 CO

jinchengzhou的专栏 1653
上一篇: 内存管理-SLAB(创建SLAB块cache_grow())
下一篇: 浅析linux内核内存管理之内存池
白水煮鸡蛋
博客等级 码龄15年 106粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值