minfree_levels 杀死进程等级

lowmemorykiller:

/sys/module/lowmemorykiller/parameters/minfree: 里面是以”,”分割的一组数,每个数字代表一个内存级别
    1950,2250,3000,3500,5000,7500
/sys/module/lowmemorykiller/parameters/adj: 对应上面的一组数,每个数组代表一个进程优先级级别     
    0,58,117,176,529,882

ro.brand.lmkd.minfree="7800,9000,12000,14000,20000,30000" KB
-->mOomMinFree[i]*1024)/PAGE_SIZE
                       1950,2250,3000,3500,5000,7500    
ro.brand.lmkd.adj="0,1,2,3,9,15"
->mOomAdj[i] * 1000) / 17
                   0,58,117,176,529,882   

举个例子:
/sys/module/lowmemorykiller/parameters/minfree:18432,23040,27648,32256,55296,80640
/sys/module/lowmemorykiller/parameters/adj:0,100,200,300,900,906

代表的意思:两组数一一对应,当手机内存低于80640时,就去杀掉优先级906以及以上级别的进程,当内存低于55296时,就去杀掉优先级900以及以上的进程。

对每个进程来说:
/proc/pid/oom_adj:代表当前进程的优先级,这个优先级是kernel中的优先级,这个优先级与上层的优先级之间有一个换算,文章最后会提一下。
/proc/pid/oom_score_adj:上层优先级,跟ProcessList中的优先级对应

    
进程的优先级调整都在AMS里面,AMS根据进程中的组件的状态去不断的计算每个进程的优先级,计算之后,会及时更新到对应进程的文件节点中,而这个对文件节点的更新并不是它完成的,而是lmkd,他们之间通过socket通信。

上层AMS跟lmkd通信主要分为三种command,每种command代表一种数据控制方式,在ProcessList以及lmkd中都有定义:
LMK_TARGET:更新/sys/module/lowmemorykiller/parameters/中的minfree以及adj
LMK_PROCPRIO:更新指定进程的优先级,也就是oom_score_adj
LMK_PROCREMOVE:移除进程

上层代码的调用时机这里就不细化了,往前追的话基本都是在ActivityManagerService中的udpateOomAdj中,也就是说上层根据四大组件的状态对进程的优先级进行调整之后,会及时的反应到lmkd中,在内存不足的时候触发杀进程,会从低优先级开始杀进程。command一共有三种,在上层的代码是在ProcessList中。

ProcessList.updateOomLevels
LMK_TARGET
cmd_target

ProcessList.setOomAdj
LMK_PROCPRIO
cmd_procprio


ProcessList.remove
LMK_PROCREMOVE
cmd_procremove


杀进程
    根据当前内存的状态查找需要杀掉的进程
    find_and_kill_process
    
    通过读取/proc/pid/statm
    send signal SIGKILL
    kill_one_process
    

vendor/brand/kernel/linaro/drivers/staging/android/lowmemorykiller.c    
使用kernel interface的,其实也就是kernel中的lowmemorykiller
// 下面两个数组分别代表了两个参数文件中的默认值,数组默认的size都是6
// 对应 "/sys/module/lowmemorykiller/parameters/adj"
static short lowmem_adj[6] = {
    0,
    1,
    6,
    12,
};
static int lowmem_adj_size = 4;

// 对应 "/sys/module/lowmemorykiller/parameters/minfree"
static int lowmem_minfree[6] = {
    3 * 512,    /* 6MB */
    2 * 1024,   /* 8MB */
    4 * 1024,   /* 16MB */
    16 * 1024,  /* 64MB */
};
static int lowmem_minfree_size = 4;


扫描当前内存以及杀进程:
lowmem_scan
lmk_vmpressure_notifier中定义了什么时候去kill_one_more,主要是当内存压力在95以上时
    
    
killBackgroundProcesses
    killPackageProcessesLocked(packageName, appId, userId, ProcessList.SERVICE_ADJ, false, true, true, false, "kill background");
    removeProcessLocked
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/sys/module/lowmemorykiller/parameters/ 是一个内核参数路径,用于控制 Android 系统中的低内存杀死(Low Memory Killer)机制。以下是该路径下常见参数的含义: 1. minfree:表示当系统内存不足时,内核会杀死一些进程以释放内存。minfree 参数指定了系统可用内存的阈值,当可用内存低于该阈值时,内核会开始杀死进程minfree 参数由六个数字组成,分别表示系统内存的不同阶段。例如“4096, 8192, 12288, 16384, 20480, 24576”表示当可用内存低于 4MB、8MB、12MB、16MB、20MB、24MB 时,内核会开始杀死进程。 2. lmk_minfree_ratio:与 minfree 类似,但是使用的是内存占比而非固定大小。例如“0, 1, 2, 4, 6, 8”表示当可用内存低于总内存的 0%、1%、2%、4%、6%、8% 时,内核会开始杀死进程。 3. lmk_minfree_adj:表示在低内存情况下,哪些进程会被优先杀死。进程的优先级由 Android 中的 OOM(Out of Memory)机制决定。lmk_minfree_adj 参数可以设置不同 OOM 分级的进程被杀死的 minfree 阈值。例如“0, 1, 2, 4, 9, 15”表示 OOM_ADJ_MIN_FREE(值为0)的进程在可用内存低于第一个 minfree 阈值时被杀死,而 OOM_ADJ_FOREGROUND(值为2)的进程在可用内存低于第三个 minfree 阈值时被杀死。 4. lmk_lru_percent:表示当内存紧张时,内核会清理掉多少 LRU(Least Recently Used)进程。LRU 进程指的是最近最少使用的进程,也就是说它们在内存中待的时间最久,但占用的内存却很少。lmk_lru_percent 参数指定了当可用内存低于 lmk_lru_percent% 时,内核会清理掉 LRU 进程。 5. lmk_inactive_file_ratio:表示当内存紧张时,内核会清理掉多少页缓存。页缓存指的是文件系统中的数据,例如应用程序的缓存文件、系统的日志文件等。lmk_inactive_file_ratio 参数指定了当可用内存低于总内存的 lmk_inactive_file_ratio% 时,内核会清理掉页缓存。 6. lmk_active_file_ratio:表示当内存紧张时,内核会清理掉多少页缓存。与 lmk_inactive_file_ratio 类似,但是 lmk_active_file_ratio 参数指定的是正在活跃使用的页缓存。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值