android OOM_adj 的设置流程

来源:互联网 发布:隔音好的耳机 知乎 编辑:程序博客网 时间:2024/05/01 01:37

流程如下:

setOomAdj

--> framework/base/core/jni/android_util_Process.cpp
android_os_Process_setOomAdj 
{
sprintf(text, "/proc/%d/oom_adj", pid);
int fd = open(text, O_WRONLY);
sprintf(text, "%d", adj);
write(fd, text, strlen(text));
}
-->kernel/fs/proc/base.c
    INF("oom_score", S_IRUGO, proc_oom_score),
    REG("oom_adj",   S_IRUGO|S_IWUSR, proc_oom_adjust_operations),
    REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations),
-->kernel/fs/proc/base.c
static const struct file_operations proc_oom_adjust_operations = {
    .read        = oom_adjust_read,
    .write        = oom_adjust_write,
    .llseek        = generic_file_llseek,
};
--> kernel/fs/proc/base.c
copy_from_user(buffer, buf, count)
err = kstrtoint(strstrip(buffer), 0, &oom_adjust);
task->signal->oom_adj = oom_adjust; //warn,oom_adj is deprecated

task->signal->oom_score_adj = (oom_adjust * OOM_SCORE_ADJ_MAX) -OOM_DISABLE;


说明:

Ams调用setOomAdj设置某进程的adj值,

通过jni接口写到oom_adj文件里,

这个文件是在base.c里注册的文件,里面有个oom_adjust_write方法

该方法将这个值赋给task->signal->oom_score_adj

0 0