【Android】LMK動作メカニズム
4449 ワード
Android分析のLowMemoryKiller
Android Kernelは、定期的にチェックを実行し、プロセスを殺し、メモリを解放します.
では、どのように判断して、それらのプロセスは殺す必要がありますか?答えは私たちのタイトルです:Low memory killerメカニズム.
Low memory killerはタイミングチェックです.
Low memory killerは主にプロセスのoom_を通じてadjはプロセスの重要度を判定する.この値が小さいほど,プログラムが重要になり,殺される可能性は低い.
oom_adjのサイズとプロセスのタイプ、およびプロセスがスケジューリングされる順序に関係します.
Low memory killerの具体的な実装はkernel/drivers/misc/lowmemorykiller.を参照してください.c
1.oom_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が構成する:
ここにいる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
プロファイルは次の2つです.
/sys/module/lowmemorykiller/parameters/adj
/sys/module/lowmemorykiller/parameters/minfree
owmeme_adjの各数値は閾値の警戒級数を表し、
lowmem_minfreeは、対応するレベル数の残りのメモリを表します.
adjファイルはoom_を格納していますadjメモリ警戒値(4 K単位)0 1536 1 2048 2 4096 7 5120 14 5632 15 6144
すなわち、システムの余剰メモリが6 MB未満の場合、警戒段数は0であり、システムの余剰メモリが8 M未満で6 Mより大きい場合、警戒段数は1であり、64 M未満で16 MBより大きい場合、警戒段数は12である.
一部の小さなメモリデバイスでは、対応するゲート値を調整できます.たとえば、一般的に調整された3つの値です.echo “1536,2048,4096,15360,17920,20480″>/sys/module/lowmemorykiller/parameters/minfree
原文作者:AndyTsui
テキストリンク:http://blog.csdn.net/AndyTsui/archive/2011/02/27/6210653.aspx
2.LMKの動作メカニズム
LMKが作業を開始すると、
まず閾値テーブルに基づいて現在の警戒級数を決定すると,警戒級数より高いプロセスは殺される範囲である.
その後、すべてのプロセスのoom_を巡回します.adj値、minより大きい値が見つかりましたadjのプロセスは,複数見つかった場合,プロセス最大のプロセスをselectedに格納する.
最も重要なステップは、SIGKILL情報を送信し、プロセスを殺すことです.
3.tips
(1)init.rcでの構成:
Android Kernelは、定期的にチェックを実行し、プロセスを殺し、メモリを解放します.
では、どのように判断して、それらのプロセスは殺す必要がありますか?答えは私たちのタイトルです:Low memory killerメカニズム.
Low memory killerはタイミングチェックです.
Low memory killerは主にプロセスのoom_を通じてadjはプロセスの重要度を判定する.この値が小さいほど,プログラムが重要になり,殺される可能性は低い.
oom_adjのサイズとプロセスのタイプ、およびプロセスがスケジューリングされる順序に関係します.
Low memory killerの具体的な実装はkernel/drivers/misc/lowmemorykiller.を参照してください.c
1.oom_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が構成する:
ここにいる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
プロファイルは次の2つです.
/sys/module/lowmemorykiller/parameters/adj
/sys/module/lowmemorykiller/parameters/minfree
owmeme_adjの各数値は閾値の警戒級数を表し、
lowmem_minfreeは、対応するレベル数の残りのメモリを表します.
adjファイルはoom_を格納していますadjメモリ警戒値(4 K単位)0 1536 1 2048 2 4096 7 5120 14 5632 15 6144
すなわち、システムの余剰メモリが6 MB未満の場合、警戒段数は0であり、システムの余剰メモリが8 M未満で6 Mより大きい場合、警戒段数は1であり、64 M未満で16 MBより大きい場合、警戒段数は12である.
一部の小さなメモリデバイスでは、対応するゲート値を調整できます.たとえば、一般的に調整された3つの値です.echo “1536,2048,4096,15360,17920,20480″>/sys/module/lowmemorykiller/parameters/minfree
原文作者:AndyTsui
テキストリンク:http://blog.csdn.net/AndyTsui/archive/2011/02/27/6210653.aspx
2.LMKの動作メカニズム
LMKが作業を開始すると、
まず閾値テーブルに基づいて現在の警戒級数を決定すると,警戒級数より高いプロセスは殺される範囲である.
その後、すべてのプロセスのoom_を巡回します.adj値、minより大きい値が見つかりましたadjのプロセスは,複数見つかった場合,プロセス最大のプロセスをselectedに格納する.
最も重要なステップは、SIGKILL情報を送信し、プロセスを殺すことです.
3.tips
(1)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
(2)进程oom_adj同样可以进行设置,通过write /proc/<PID>/oom_adj ,在init.rc中,init进程的pid为1,omm_adj被配置为-16,永远不会被杀死。
# Set init its forked children's oom_adj.
write /proc/1/oom_adj -16
(3)dumpsys activity dumpプロセスの情報、adj値の表示
procrankでは、プロセスが使用するメモリサイズを表示できます.