Linux OOM/LMK 原理分析

本文深入探讨了Linux系统中伙伴系统内存分配失败后的OOM机制,包括快速分配、慢速分配、kswap内存回收等步骤,详细解析了进程得分oom_score的计算方法及参数oom_score_adj的作用,同时介绍了Android系统的lowmemorykill驱动实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

伙伴系统无法分配内存时,会通过OOM函数直接kill线程来回收内存.

快速分配->慢速分配->kswap内存回收->内存规整->直接内存回收->out_of_memory

__alloc_pages_nodemask->__alloc_pages_slowpath->__alloc_pages_direct_compact

                                                                                               ->__alloc_pages_direct_reclaim

                                                                                                ->__alloc_pages_may_oom->out_of_memory

 

进程得分相关参数,每个进程独有

参数名称 	含义
oom_score 	进程oom_badness计算得分,为只读参数。
oom_score_adj 	计算进程得分时的调整值。取值范围是-1000~1000,0表示不调整得分,负值表示在实际打分值上减去一个折扣,正值表示要惩罚该进程增加得分。
oom_adj 	旧的计算进程得分时的调整值,实际使用时会转换为oom_score_adj。

oom_score_adj取值范围-1000-1000

每个进程的得分 oom_score =  (进程占用内存*1000)/(系统总内存) + oom_score_adj ,计算函数oom_badness

可以看出oom_score_adj越大,进程得分越高,越容易被选择回收.

oom_adj是兼容以前的API接口. oom_score_adj =  (oom_adj*1000)/(17)      oom_adj取值范围(-17,15)

android系统实现了lowmemorykill驱动,实现原理跟Linux的OOM类似,也是选择oom_score_adj最大的进行kill .

通过注册register_shrinker(&lowmem_shrinker)来实现,当进行内存回收时,调用堆栈:

shrink_zone->shrink_slab回调

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值