[置頂]Android学習のlowmemorykiller driver


これは、AndroidがLinuxの元に生まれたoomメカニズムの改良であり、ハンドヘルドのoomをより効果的に処理することが期待されている。
/sys/module/lowmemorykiller/parameters/adj
write /sys/module/lowmemorykiller/parameters/minfree
オームの行動を制御して、システムがoomの時に、アンディロイドの定義に従って、適当なprocessを選んでkillに来ることができます。標準linuxのあのような複雑な計算ロジックによってprocessを選択するのではありません。
androidはadjとminfreeの中の設置によって、いくつかの種類に分けられます。userはprocessに対応するoom_を設置します。adjがlowmemorykillerにどんな条件でkillを行うかを教えてくれます。以下の通りです。
Androidシステムにおけるlowmemorykillerへの応用:
まずdeviceで起動するinit.rcスクリプトには、Cyanogemodのpassion携帯電話などの設定があります。
ヽoo。ツ。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。adj values for the classis of processes that can be嗳killed by the kersnel.  These are used in ActivityManagerService.
xiここは該当型のアプリケーションのadj値です。    set prop ro.FOREGROUND_APP_.ADJ 0    set prop ro.VISIBLE_APP_.ADJ 1    set prop ro.PERCEPTIBLE_APP_.ADJ 2    set prop ro.HEAVY_WEIGHT_APP_.ADJ 3    set prop ro.SECONDARY_SERVER_ADJ 4    set prop ro.BACKUP_APP_.ADJ 5    set prop ro.HOME_APP_.ADJ 6    set prop ro.HIDDEN_APP_.MIN_ADJ 7    set prop ro.EMPTY_APP_.ADJ 15落Define the memory threstholds ab off process clases willÜbe killd.  ザ・セnumbers are in pages(4 k)
󑧙ここは該当型のアプリケーションが占有するメモリ値(minfree)です。    set prop ro.FOREGROUND_APP_.MEM 2048    set prop ro.VISIBLE_APP_.MEM 3072    set prop ro.PERCEPTIBLE_APP_.MEM 4096    set prop ro.HEAVY_WEIGHT_APP_.MEM 4096    set prop ro.SECONDARY_SERVER_MEM 6144    set prop ro.BACKUP_APP_.MEM 6144    set prop ro.HOME_APP_.MEM 6144    set prop ro.HIDDEN_APP_.MEM 7168    set prop ro.EMPTY_APP_.MEM 8192〓Write value must be consistent with the above properties.菗Note that the driver only supports 6 sloots,so we have compned some of the class into the same memory level。the assiociated processes of higher.co clases will still be killed first.    write/sys/module/lowmemorykiller/parameters/adj 0,1,2,4,7,15
噫Set init its forked children's oom_adj.    write/proc/1/oom_adj-16
アドjは、ユーザプログラムにおいて、oom_と定義されている。adjに対応する最低制限は、プロセスのminfreeが達成されたときに
/sys/module/lowmemorykiller/parameters/minfree
で定義されている下限値は、このminfree下限に対応するadj値をケネルが探しています。見つけたら、ユーザー側のoom_となります。adjの値を比較して、ユーザープロセスにおけるすべてのoom_adjがadj以上のプロセスはlowmemorykillerによって選択されます。adjを並べて、誰がkill.ここにいるかを判断します。adjの取得範囲は-17~15で、値が大きいほど選択されやすくなります。
frame ebookは控訴init.rcの種類によって、アプリのoom_を動的に変更します。adjの値、例えば一つのアプリがserviceしかない時、frame ebookはそのoom_を作ることができます。adjは9であり、ユーザーがこのアプリを開くと、フロントのapになります。frame ebookはそのoom_を利用します。adjを0に変更し、init.rcで定義されているデフォルトadjとfreemが一致します。
例えば、
システムの設定が以下の通りであれば、
葃cat/sys/module/lowmemorykiller/parameters/adj 0,1,2,4,7,15
萼cat/sys/module/lowmemorykiller/parameters/minfree 2048,3072,4096,6144,7168,8192
また、一つのプロcessのoom_adjが0であると、その空き容量が2048個のpageに達したら、そのoom_のために、ということになります。adjは0で、キルルと呼ばれる候補者に選ばれます。
関連するフレームワーク層のコードは以下の通りです。
frame eworks/base/services/java/com/android/server/am/ActivityManagerService.java:UpdateOom Adj Locked(…)
and fram eworks/base/core/java/android/off/Process.java:set Oom Adj()=frame eworks/base/core/jni/android_utilu.Process.cpp:and roid_オズProcess.set OomAdj()
最後に、もう一つの価値があるのは、lowmemorykillerの実現は依然として他のkersnelの拡張と同じで、既存のkersnelの体系構造とインターフェースに基づいて、androidのハンドヘルドに対する理解によって、これらの既存のインターフェースを利用して、android独自のメカニズムを実現しました。シュリンカーのようなコールバックは、上記の判定条件に従い、global_を通過します。page_stateからpageを検出し、mm子システムにおけるpage管理機能との相互作用を実現し、lowmemorykillerの機能を実現しました。
参考資料:
Android Kernel Feature s
<Android技術の裏側>
スタンダードなオームadjの紹介:http://lwn.net/Articles/317814/
androidはケネルの拡張について紹介します。http://www.lindusembedded.com/blog/2010/12/07/android-linux-kernel-additions/