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
    
    

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