Linux OOM/LMK 原理分析

伙伴系统无法分配内存时,会通过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回调

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值