lowmemorykiller 杀死进程

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         
    
    
* For example, write "0,8" to /sys/module/lowmemorykiller/parameters/adj and
* "1024,4096" to /sys/module/lowmemorykiller/parameters/minfree to kill
* processes with a oom_score_adj value of 8 or higher when the free memory
* drops below 4096 pages and kill processes with a oom_score_adj value of 0 or
* higher when the free memory drops below 1024 pages.
    
    
举个例子: 
/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
    
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章