shrinker Android LowMemoryKiller原理分析(下)( 二 )


if(!p)
继续;
if(test_tsk_thread_flag(p,TIF _ MEMDIE))& amp;& amp
time_before_eq(jiffies,lowmem_deathpending_timeout)){
task _ unlock(p);
rcu _ read _ unlock();
返回0;
}
oom_score_adj= p-&gt。信号->;oom _ score _ adj
//小于目标调整的进程被忽略
if(oom _ score _ adj & lt;min_score_adj){
task _ unlock(p);
继续;
}
//获取进程的驻留集大小,即进程的独占内存+共享库大小。
tasksize = get _ mm _ RSS(p-& gt;mm);
task _ unlock(p);
if(tasksize&lt。= 0)
继续;
//算法键,选择oom_score_adj最大,rss内存最大的进程。
if(selected){
if(oom _ score _ adj & lt;selected_oom_score_adj)
继续;
if(oom _ score _ adj = = selected _ oom _ score _ adj & amp;& amp
tasksize&lt。= selected_tasksize)
继续;
}
select = p;
selected _ tasksize = tasksize
selected _ oom _ score _ adj = oom _ score _ adj;
lowmem_print(2,"选择“% s”(% d),adj %hd,size %d,要删除n ",
p-&gt。comm,p->pid,oom_score_adj,tasksize);
}
if(selected){
longcache_size= other_file*(长)(PAGE _ SIZE/1024);
long cache _ limit = min free *(long)(PAGE _ SIZE/1024);
long free = other _ free *(long)(PAGE _ SIZE/1024);
low mem _ death pending _ time out = jiffies+HZ;
set_tsk_thread_flag(选中,TIF _ MEMDIE);
//向选定的目标进程发送信号9,终止目标进程
send _ SIG(SIGGILL,选定,0);
rem+= selected _ tasksize;
}
rcu _ read _ unlock();
returnrem
}
选择oom_score_adj最大、rss内存最大的进程作为选择的待终止进程。
终止进程模式:send _ SIG(SIGGILL,selected,0)向选定的目标进程发送信号9以终止目标进程。
此外,lowmem_minfree[]和lowmem_adj[]数组的个数为6,使用以下两个命令:
module_param_named(debug_level,lowmem_debug_level,uint,S _ IRUGO | S _ IWUSR);
module_param_array_named(adj,lowmem_adj,short & amp;lowmem_adj_size,S _ IRUGO | S _ IWUSR);
当下列节点数据传输发生变化时,lowmem_minfree[]和lowmem_adj[]数组将被修改:
/sys/module/low memorykiller/parameters/min free
/sys/module/low memorykiller/parameters/adj
【shrinker Android LowMemoryKiller原理分析(下)】动词 (verb的缩写)总结
本文主要从框架的ProcessList.java来调整adj,并将事件发送给本地守护进程lmkd通过套接字通信。lmkd根据具体的命令进行相应的操作,主要功能是更新流程的oom_score_adj值和lowmemorykiller驱动的参数(包括minfree和adj);
最后,介绍了低内存驱动程序。通过注册shrinker,借助linux标准内存恢复机制,根据当前系统的可用内存和参数配置参数(adj,minfree),选择合适的selected_oom_score_adj,然后从所有进程中选择adj大于目标值且占用rss内存最大的进程,并将其杀死,从而释放内存。
5.1 lmkd参数:
Oom_adj:表示流程的优先级。值越高,优先级越低,越容易被杀死。数值范围[-16,15]
Oom_score_adj:值范围[-1000,1000]
Oom _ score:lmk政策好像没什么用,应该是OOM用的。
要查看某个流程的上述3个值,您只需了解pid并查看以下节点:
/proc/&lt。pid&gt。/oom_adj
/proc/&lt。pid&gt。/oom_score_adj
/proc/&lt。pid&gt。/oom_score
oom_adj和oom_score_adj之间有一定的映射关系:
Oom_score_adj=1000当oom _ adj = 15

5.2驱动参数
/sys/module/low memorykiller/parameters/min free(表示页数)
/sys/module/lowermorykiller/parameters/adj(for oom _ score _ adj)
例如,向节点/sys/module/low memory killer/parameters/adj写入1,6,向节点/sys/module/low memory killer/parameters/min free写入1024,8192。策略:当系统可用内存小于8192页时,杀死OOM _ score _ adj >: =6进程;当系统可用内存小于1024页时,Oom _ score _ adj >将被杀死。=1个过程。

推荐阅读