日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android的oomkiller_Android Low memory killer

發布時間:2023/12/3 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android的oomkiller_Android Low memory killer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android Low memory

killer

by 永遠的伊蘇

Android中,進程的生命周期都是由系統控制的,即使用戶關掉了程序,進程依然是存在于內存之中。這樣設計的目的是為了下次能快速啟動。當然,隨著系統運行時間的增長,內存會越來越少。Android Kernel 會定時執行一次檢查,殺死一些進程,釋放掉內存。

那么,如何來判斷,那些進程是需要殺死的呢?答案就是我們的標題:Low memory killer機制。

Android 的Low memory

killer是基于linux的OOM(out of memory) 規則改進而來的。 OOM通過一些比較復雜的評分機制,對進程進行打分,然后將分數高的進程判定為bad進程,殺死并釋放內存。OOM只有當系統內存不足的時候才會啟動檢查,而Low memory killer 則是定時進行檢查。

Low

memory killer 主要是通過進程的oom_adj

來判定進程的重要程度。oom_adj的大小和進程的類型以及進程被調度的次序有關。

Low

memory killer 的具體實現可參看:kernel/drivers/misc/lowmemorykiller.c

其原理很簡單,在linux中,存在一個kswapd的內核線程,當linux回收存放分頁的時候,kswapd線程將會遍歷一張shrinker鏈表,并執行回調,定義如下:

所以只要注冊

Shrinker,變可以在內存分頁回收時根據規則釋放內存,下面我們來看看其實現。

首先定義shrinker結構體,lowmem_shrink為回調函數的指針,當有內存分頁回收的時候,這個函數將會被調用。

初始化模塊時進行注冊,結束時注銷。

Android中,存在著一張內存閾值表,這張閾值表是可以在init.rc中進行配置的,

合理配置這張表,對于小內存設備有非常重要的作用。

我們來看lowmemorykiller.c中這張默認的閾值表:

Lowmeme_adj中各項數值代表閾值的警戒級數,lowmem_minfree代表對應級數的剩余內存。

也就是說,當系統的剩余內存為小于6MB時候,警戒級數為0,當系統內存剩余小于8M而大于

6M的時候,警戒級數為1,當內存小于64M大于16MB的時候,警戒級數為12.

Low memory killer

的規則就是根據當前系統的剩余內存多少來獲取當前的警戒級數,如果進程的oom_adj大于警戒級數并且最大,進程將會被殺死(相同omm_adj的,則殺死占用內存較多的)。Omm_adj越小,代表進程越重要。一些前臺的進程,oom_adj會比較小,而后臺的服務,omm_adj會比較大,所以當內存不足的時候,Low memory killer 殺掉的必然先殺掉的是后臺服務而不是前臺的進程。

OK,現在我們來看具體代碼,也就是lowmem_shrink這個回調函數:

首先通過global_page_state獲取當前剩余內存大小,然后根據剩余內存和內存閾值表查找當前的內存警戒數min_adj。接著遍歷所有進程,找到oom_adj大于min_adj并且oom_adj最大的進程:

進程的oom_adj

小于警戒閾值,則無視。

獲取這個進程所占用的內存大小tasksize,如果小于比我們當前選出進程的內存,則無視。

如果大于則選中這個進程:

經過for_each的遍歷,selected 就是我們選出要釋放掉的bad進程,它具有下面兩個條件:

Oom_adj大于當前警戒閾值并且最大。

在同樣大小的oom_adj中,占用內存最多。

最后,我們釋放掉這個進程的內存,通過force_sig(SIGKILL, selected)來向進程發送一個不可以忽略或阻塞的SIGKILL信號。

閾值表可以通過/sys/module/lowmemorykiller/parameters/adj和/sys/module/lowmemorykiller/parameters/minfree進行配置,例如在init.rc中:

# Write value must be consistent with the above properties.

write /sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15

write /proc/sys/vm/overcommit_memory 1

write /sys/module/lowmemorykiller/parameters/minfree 1536,2048,4096,5120,5632,6144

class_start default

進程oom_adj同樣可以進行設置,通過write

/proc//oom_adj,在init.rc中,init進程的pid為1,omm_adj被配置為-16,永遠不會被殺死。

# Set init its forked children's oom_adj.

write /proc/1/oom_adj -16

Low memory killer的基本原理我們應該弄清了,正如我前面所說的,進程omm_adj的大小是跟進程的類型以及進程被調度的次序有關。進程的類型,可以在ActivityManagerService中清楚的看到:

static final int EMPTY_APP_ADJ;

static final int HIDDEN_APP_MAX_ADJ;

static final int HIDDEN_APP_MIN_ADJ;

static final int HOME_APP_ADJ;

static final int BACKUP_APP_ADJ;

static final int SECONDARY_SERVER_ADJ;

static final int HEAVY_WEIGHT_APP_ADJ;

static final int PERCEPTIBLE_APP_ADJ;

static final int VISIBLE_APP_ADJ;

static final int FOREGROUND_APP_ADJ;

static final int CORE_SERVER_ADJ = -12;

static final int SYSTEM_ADJ = -16;

ActivityManagerService定義各種進程的oom_adj,CORE_SERVER_ADJ代表一些核心的服務的omm_adj,數值為-12,由前面的分析可知道,這類進程永遠也不會被殺死。

其他未賦值的都在static塊中進行了初始化,是通過system/rootdir/init.rc進行配置的:

在init.rc中:

# Define the oom_adj values for the classes of

processes that can be

# killed by the kernel. These are used in

ActivityManagerService.

setprop ro.FOREGROUND_APP_ADJ 0

setprop ro.VISIBLE_APP_ADJ 1

setprop ro.SECONDARY_SERVER_ADJ 2

setprop ro.HIDDEN_APP_MIN_ADJ 7

setprop ro.CONTENT_PROVIDER_ADJ 14

setprop ro.EMPTY_APP_ADJ 15

# Define the memory thresholds at which the above

process classes will

# be killed. These numbers are in

pages (4k).

setprop ro.FOREGROUND_APP_MEM 1536

setprop ro.VISIBLE_APP_MEM 2048

setprop ro.SECONDARY_SERVER_MEM 4096

setprop ro.HIDDEN_APP_MEM 5120

setprop ro.CONTENT_PROVIDER_MEM 5632

setprop ro.EMPTY_APP_MEM 6144

由此我們知道EMPTY_APP 最容易被殺死,其實是CONTENT_PROVIDER ,FOREGROUND的進程很難被殺死。

現在我們再來說影響oom_adj的第二個因素,進程的調度次序。這涉及到了ActivityManagerService的復雜調度,我們下次再來看吧。呵呵。

See

you next time !!!

總結

以上是生活随笔為你收集整理的android的oomkiller_Android Low memory killer的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。