内存管理-SLAB(释放SLAB对象kmem_cache_free())

linux内核分析———SLAB原理及实现 <!-- @page {margin:0.79in} p {margin-bottom:0.08in; direction:ltr; color:#000000; text-align:justify; widows:0; orphans:0} p.western {font-family:"Times New Roman",serif; font-siz 阅读详情

释放的过程正好与分配的过程相反,先将object释放到cpu local slab中,如果cpu local slab满了,就将cpu local slab中的free object释放到share local slab中,如果share local slab也满了,就把share local slab的部分free object释放到slab lists中,然后再将cpu local slab中batcount个free object释放到share local slab中。注意这里释放只是指针接管,cpu local slab与share local slab存放的是指向空闲对象的指针而不是空闲对象本身。

void kmem_cache_free (kmem_cache_t *cachep, void *objp)
{
unsigned long flags;
local_irq_save(flags);
__cache_free(cachep, objp);
local_irq_restore(flags);
}

static inline void __cache_free (kmem_cache_t *cachep, void* objp)
{
/*获得cpu local slab*/
struct array_cache *ac = ac_data(cachep);
check_irq_off();
objp = cache_free_debugcheck(cachep, objp, __builtin_return_address(0));
/*如果cpu local slab的空闲对象数量 小于 cpu local slab的空闲对象数量上限*/
if (likely(ac->avail < ac->limit)) {
STATS_INC_FREEHIT(cachep);
/*把object 放到cpu local slab中,上移avail指针*/
ac_entry(ac)[ac->avail++] = objp;
return;
} else {
STATS_INC_FREEMISS(cachep);
cache_flusharray(cachep, ac);
/*将对象释放到cpu local slab中*/
ac_entry(ac)[ac->avail++] = objp;
}
}

static void cache_flusharray (kmem_cache_t* cachep, struct array_cache *ac)
{
int batchcount;
batchcount = ac->batchcount;
#if DEBUG
BUG_ON(!batchcount || batchcount > ac->avail);
#endif
check_irq_off();
spin_lock(&cachep->spinlock);
/*如果存在 share local cpu*/
if (cachep->lists.shared) {
struct array_cache *shared_array = cachep->lists.shared;
int max = shared_array->limit-shared_array->avail;、
/*如果share local slab还能放下空闲对象*/
if (max) {
if (batchcount > max)
batchcount = max;
/*让share local slab来接管 cpu local slab的指针*/
memcpy(&ac_entry(shared_array)[shared_array->avail],
&ac_entry(ac)[0],
sizeof(void*)*batchcount);
/*上移avail*/
shared_array->avail += batchcount;
goto free_done;
}
}
/*如果执行到这里说明share local slab中没有地方了,将cpu local slab中的对象全部赋给slab list3*/
free_block(cachep, &ac_entry(ac)[0], batchcount);
free_done:
spin_unlock(&cachep->spinlock);
        /*cpu local slab的avail指针下移batchount*/
ac->avail -= batchcount;
/*前边空出了batchcount个,将后边的移到前边*/
memmove(&ac_entry(ac)[0], &ac_entry(ac)[batchcount],
sizeof(void*)*ac->avail);

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

相关推荐

内存管理之slab分配器

STL中的空间配置器采用一、二级配置器进行内存管理,当配置区块    在一级配置器中,allocate()直接使用malloc(),deallocate()直接使用free(),对于内存不足的情况,模拟C++的set_new_handler()机制;      在二级配置器中,首先会维护16个自由链表(free lists),负责16种小型区块的次配置能力;如果内存不足,转调一级配置器中的set_...

hhhanpan的博客 979

内存管理API之kmem_cache_free

void kmem_cache_free(struct kmem_cache *cachep, void *objp)用于释放kmem_cache_alloc 申请的内存。 其源码分析如下: void kmem_cache_free(struct kmem_cache *cachep, void *objp) { unsigned long flags; #这个函数主要是检查这个slab 是否

jason的笔记 2706

Linux内存管理(36):slub 分配器之kmem_cache_free

在博文《slub分配器之kmem_cache_create》中详细分析了使用对外接口申请slab cache 的过程,在博文《slub分配器之kmem_cache_alloc》中详细分析了通过slab cache 分配object 的分配过程,了解了slub 分配器分配内存的快速分配和慢速分配两种方式。本文将重点分析slub 分配对外的第三个接口 kmem_cache_free(),该接口用以释放slub 缓存对象。

私房菜 1080

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

本篇主要介绍slab object释放的函数kmem_cache_free

weixin_45337360的博客 3644

2025 年第十五届 APMCM 亚太地区大学生数学建模竞赛A题 农业灌溉系统优化

该摘要探讨了农业灌溉系统优化面临的复杂挑战,涉及智能灌溉技术的应用与资源配置问题。研究聚焦于一个1公顷的方形农场案例,该农场种植三种作物并面临动态环境条件(土壤类型、气象变化)。系统优化需平衡河流引水(非线性成本函数:C=50L^1.2+0.1Q^1.5)与储水罐灌溉(成本5元/升容积)两种方案,同时满足喷灌技术约束(喷头间距≥15米,覆盖半径15米)。关键矛盾体现在"平河旱储"的水资源调配策略与多作物需水量差异之间的协调,需通过传感器数据实时调整灌溉方案以实现效率最大化。(149字)

m0_60472361的博客 641

LangChain + Milvus Lite:从零搭建本地RAG知识库

本文详细介绍了如何利用LangChain、Milvus Lite和gte-large-zh模型,在本地从零搭建一个完整的RAG知识库系统。文章涵盖了环境配置、文档处理与向量化、本地向量库构建以及检索问答实现的全流程,重点突出了完全本地化部署带来的数据隐私安全和成本优势,为开发者提供了一条实践性极强的技术路径。

weixin_29044713的博客 443

对象释放函数kmem_cache_free核心函数slab_free的实现详解

1.kmem_cache_free函数 void kmem_cache_free(struct kmem_cache *s, void *x)//X是要释放的对象 { s = cache_from_obj(s, x);//virt_to_head_page通过对象x找到该对象所在的slab的首个page,再通过page找到所属的slab缓存 if (!s) return; slab_...

hzj_001的博客 1730

以太网物理层协议整理(2)-万兆以太网

在万兆以太网标准化过程中,IEEE和10GEA(万兆以太网联盟)是两个最重要的组织。 万兆以太网标准和规范都比较繁多,在标准方面,首先有2002年的IEEE 802.3ae,后来也不断有新的万兆以太网规范推出,如2006年的IEEE 802.3an标准(10GBase-T)就推出了基于双绞铜线的万兆以太网规范,同样的IEEE 802.3aq标准推出了基于光纤的10GBase-LRM;2007年的

NowOrNever 3万+

kmem_cache_free代码注解

内核版本linux3.1 kmem_cache_free code:   void kmem_cache_free(struct kmem_cache *s, void *x)//X是要释放的对象 { struct page *page; page = virt_to_head_page(x);//通过x找到该对象所在的slab的首个page slab_free(s, pag

wentinghe的专栏 1991

视觉Transformer实战 | Token-to-Token Vision Transformer(T2T-ViT)详解与实现

Vision Transformer (ViT) 在计算机视觉领域取得了巨大成功,但标准的 ViT 存在一些局限性,如需要大规模预训练数据、对局部结构建模不足等。Token-to-Token ViT (T2T-ViT) 通过引入渐进式分词过程改进了原始 ViT,使其能够在中小型数据集上取得更好的性能。本节将详细介绍 T2T-ViT 的技术原理,并使用 PyTorch 从零开始实现 T2T-ViT。

盼小辉丶的博客 4万+

【GB28181】wvp-GB28181-pro部署安装教程(Ubuntu平台)

初始环境安装。

废人一枚的博客 5079

kernel hacker修炼之道之内存管理-SLAB(释放SLAB对象kmem_cache_free())

释放SLAB对象kmem_cache_free() 作者:李万鹏 于北京 borqs 释放的过程正好与分配的过程相反,先将object释放到cpu local slab中,如果cpu local slab满了,就将cpu local slab中的free object释放到share local slab中,如果share lo...

tomhibolu 250

禾赛激光雷达AT128P/海康相机(1):ROS环境设备驱动

sudo cp *.so /opt/MVS/lib/64/ # 复制当前文件夹中所有.so文件 到 “/opt/MVS/lib/64/” 文件中。将相应的.so文件复制到 /opt/MVS/lib/64/。我解压的是x86_64的,解压之后,打开,再解压MVS。然后在上一层,也就是选择x86_64那一层打开终端。新建一个工作空间,或者打开自己的工作空间。)包放在src内,并解压,然后编译。MVS V2.1.2下载之后解压,// 驱动代码下载到src文件里面。// 特定文件夹中打开终端。

努力努力努力 881

kernel hacker修炼之道之内存管理-SLUB(释放SLAB对象kmem_cache_free())

释放SLAB对象kmem_cache_free() 作者:李万鹏 SLUB分配器调用kmem_cache_free()来释放object。void kmem_cache_free(struct kmem_cache *s, void *x){ struct page *page; /*获得对象所在的slab的...

tomhibolu 257

微信小程序推广策略,打开小程序领域流量大门

本文旨在为小程序开发者、运营者和企业主提供一套完整的微信小程序推广策略体系,帮助他们在竞争激烈的小程序生态中获得更多流量和用户。内容涵盖从0到1的冷启动策略,到成熟期的增长技巧。本文将首先介绍小程序的基础推广设置,然后深入探讨各种流量获取渠道,接着分析数据驱动的优化方法,最后展望未来发展趋势。小程序:无需下载安装即可使用的应用,运行在微信生态内:独立访客数:页面浏览量转化率:完成目标行为的用户比例留存率:用户在一定时间后仍活跃的比例自然流量获取:通过优化搜索、完善资料等方式获得基础流量社交裂变。

小程序开发 1031

YOLO11改进策略【独家融合改进】| EfficientViMBlock + LGAG + DySample

通过学习采样来学习上采样DySample。

Limiiiing的博客 362

Linux内存管理之SLAB分配器

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

ibless的博客 9244

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

内存管理-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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux内存管理:(二)slab分配器

文章说明:Linux内核版本:5.0架构:ARM64参考资料及图片来源:《奔跑吧Linux内核》

qq_58538265的博客 3422

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

内核函数 kmem_cache_xxxx

struct kmem_cache *kmem_cache_create (const char *name,                                                                                  size_t size,                                                   ...

yldfree的博客 3177

Linux内存管理之slab机制(释放对象)

Linux内核中将对象释放到slab中上层所用函数为kfree()或kmem_cache_free()。两个函数都会调用__cache_free()函数。 代码执行流程: 1,当本地CPU cache中空闲对象数小于规定上限时,只需将对象放入本地CPU cache中; 2,当local cache中对象过多(大于等于规定上限),需要释放一批对象到slab三链中。由函数cache_flusha

bullbat的专栏 4502

linux驱动开发(5)-kmem_cache

函数会根据per-CPU缓存状态来尽量做最优化处理(内核总是挖空心思去干这种事情,还常常乐此不疲)​,但是我们可以想象free一个在kmem_cache中的内存对象,必然会引起一连串的连锁反应:如果要释放的对象恰恰是该slab上唯一被分配的对象,那么由于它的释放,将导致整个slab空闲,这种情况下内核有可能将该slab所对应的页面释放给伙伴系统,同时把该slab从kmem_cache对象的slabs_partial链表中摘除,更新对应的管理数据。参数cachep是要销毁的kmem_cache对象的指针。

yyc的博客 872

JJJ:kmem_cache_create、kmem_cache_destroy、kmem_cache_alloc、kmem_cache_free用法

【代码】JJJ:kmem_cache_create、kmem_cache_destroy、kmem_cache_alloc、kmem_cache_free用法。

engineer0的博客 739

[linux kernel]slub内存管理分析(6) 销毁slab

linux内核内存管理算法slub源码分析之slab销毁逻辑

Breeze的博客 6408

linux 内存管理-slab分配器

伙伴系统用于分配以page为单位的内存,在实际中很多内存需求是以Byte为单位的,如果需要分配以Byte为单位的小内存块时,该如何分配呢? slab分配器就是用来解决小内存块分配问题,也是内存分配中非常重要的角色之一。 slab分配器最终还是由伙伴系统分配出实际的物理内存,只不过slab分配器在这些连续的物理页面上实现了自己的算法,以此来对小内存块进行管理。 slab分配器把对象分组放进高速缓存,每个高速缓存都是同种类型对象的一种"储备"。 包含高速缓存的主内存被划分为多个slab,每个slab由一

Amelio Ming 1365

Linux Slub分配器(五)--释放对象

水平有限,描述不当之处还请之处,转载请注明出处http://blog.youkuaiyun.com/vanbreaker/article/details/7701910            释放对象和分配对象是一组对称的操作,同样分为两个路径: 1.如果待释放的对象所属的slab位于本地CPU缓存中,也就是slab处于冻结状态,则可直接释放 2.反之,待释放的对象所属的slab位于slab链表中,

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值