开场白:历史已经成为过去,而过去的却已经埋藏在看不见的沙子里面,成为不了历史
代码存放:/mm/oom_kill.c
主函数: void out_of_memory(int gfp_mask)
主要功能如下:
1)调用select_bad_process(void)函数返回选择删除的进程的task_struct结构体
2)调用oom_kill_process(struct task_struct *p)函数对进程发出终止信号
辅助函数说明:select_bad_process(void)
遍历所有的进程(进程1除外),按照一定的算法统计出当前进程的预算值,将预算值最大的进程描述符返回。其中调用badness函数统计每个进程的预算值。
对于badness函数,将根据内存占用量,启动使用时间和CPU占用时间,是否是root权限进程,尤其是直接访问硬件,所以实际情况上,可能我们需要根据自己的系统进行修改。实际上这是非常有异常的。
辅助函数说明:oom_kill_process(struct task_struct *p)
并没有终止父进程,而是终止父进程中的一个子进程,然后就退出了,如果当前父进程没有子进程,尝试终止自己。所以终止的这个进程未必能够解决问题。当然很可能会被多次调用,但是不一定会解决问题。
转载于:https://blog.51cto.com/fengyuzaitu/1588102