LowMemory Killer

いまさらながら、androidさんには、プロセスが殺される要因として、
OOM Killerとは別に、LowMemoryKiller が存在していることに気づいた。

そして、OOM Killerによって殺されていると考えていたのが間違いだった。
http://blog.kmckk.com/archives/2795577.html#more

LowMemory関連の情報は、ActivityManager.MemoryInfo で取得できるようだ。
http://techbooster.jpn.org/application/1517/

LowMemory Killer の起動

こいつのソースコードは、これのようです。
http://www.google.co.jp/codesearch/p?hl=ja#iCXnLOj7beI/drivers/misc/lowmemorykiller.c&q=android.git%20common%20lowmemorykiller.c&d=0

lowmem_shrink()によって、プロセスは、killされる様子である。

では、lowmem_shrink()は、どこから呼ばれるか?

static struct shrinker lowmem_shrinker = {
        .shrink = lowmem_shrink,
        .seeks = DEFAULT_SEEKS * 16
};

この構造体に設定されているので、どこかでこの構造体を参照しているはず。

static int __init lowmem_init(void)
{
        register_shrinker(&lowmem_shrinker);
        return 0;
}

register_shrinker()の引数に与えられている。
このregister_shrinker()は、あちこちでコールされている。
何をするものなのだろうか。最近追加されたもの?

/*
 * Add a shrinker callback to be called from the vm
 */
void register_shrinker(struct shrinker *shrinker)
{
        shrinker->nr = 0;
        down_write(&shrinker_rwsem);
        list_add_tail(&shrinker->list, &shrinker_list);
        up_write(&shrinker_rwsem);
}
EXPORT_SYMBOL(register_shrinker);

http://www.google.co.jp/codesearch/p?hl=ja#iCXnLOj7beI/mm/vmscan.c&q=android.git%20common%20register_shrinker&sa=N&cd=1&ct=rc
shrinker_listに追加しているだけ。
このshrinker_listが使用されるのはどこか?

unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask,
                        unsigned long lru_pages)
・・・略

shrink_slab()でコールされている。


ここまで、整理すると。
Linuxには、shrinker という機構があるようで、
必要に応じてコールされるようです。
このあたりは、よく分からないので、誰かが説明を書いてくれることを期待する。


ともかく、lowmem_shrink()によって、プロセスがkillされているのは確実である。