Androidアプリの内部動作に関する情報(2)

AkioHoshiのAndroidの内部動作モデルに関する質問に対して、今度は組み込みJavaやLinuxで豊富な経験をお持ちのtetsu_kobaさんが情報を寄せて頂きました。情報をまとめてみます。いままでの経緯はこちら。 http://togetter.com/li/13467
25
星 暁雄 (ITと人権) @AkioHoshi

皆さまに質問:iPhoneOS4.0のマルチタスク化で、改めて #Android の動作モデルに興味が湧きました。Dalvik VMの各インスタンスがそれぞれLinuxプロセスとして動きずっとメモリ常駐、との理解で合ってますか? また良い資料があれば教えてくださいませんか?

2010-04-09 18:46:50
安藤化石 @androidzaurus

@AkioHoshi Google I/O 2008での Anatomy&Physiology of an Android http://bit.ly/6dDKXL と Dalvik VM Internals http://bit.ly/bPqWN が未だに一番詳しいです。

2010-04-09 19:12:10
星 暁雄 (ITと人権) @AkioHoshi

Androidの動作モデルに関するGoogle I/Oの発表資料を見てます。今更ながら改めて見直すと、JavaでもLinuxでもない。独自OSぐらいに思った方がいいですね。現実的でモダンで独創的。しかもオープンソース。

2010-04-09 22:47:41
星 暁雄 (ITと人権) @AkioHoshi

Androidの動作モデルの件、Dan Bornsteinの "Dalvik VM Internals" http://bit.ly/bPqWN にいは "OS without swap space" との問題意識とメモリ効率についての議論があり、興味深く見ました。

2010-04-09 23:03:56
mryo0826 @mryo0826

亀レスですがhttp://bit.ly/9vW7Cf の 「androidの画面描画機構をチューニングする!」の資料が一部役に立つかも QT @AkioHoshi: 皆さまに質問:… Dalvik VMの各インスタンスがそれぞれLinuxプロセスとして動きずっとメモリ常駐、との…

2010-04-10 04:24:40
星 暁雄 (ITと人権) @AkioHoshi

@mryo0826 情報ありがとうございます。見てみます。なお、今まで頂いた情報を http://bit.ly/aK7kng にまとめています。

2010-04-10 07:06:04
koba @tetsu_koba

.@AkioHoshi DalvikVMについて。ZygoteのプロセスはDalvikVMそのもののインスタンス。Javaのプログラムを実行するプロセスはZygoteからforkされる。

2010-04-10 10:23:19
星 暁雄 (ITと人権) @AkioHoshi

@tetsu_koba ありがとうございます。Anatomy&Physiology of an Android http://bit.ly/6dDKXL のスライドpp.82-94 あたりが関係ありそうですね。

2010-04-10 10:35:10
koba @tetsu_koba

このときLinuxのシステムコールのforkが使用されるが、exec系は使われない。なので、プロセスの中のメモリの初期状態はZygoteと同じ。書き込みがあったところだけCopyOnWriteのしくみが働く。

2010-04-10 10:26:35
koba @tetsu_koba

Zygoteは通常必要になる全てのダイナミックリンクライブラリがあらかじめロードされている。だから新しいJavaのプロセスは最初から必要なダイナミックリンクライブラリがすでにメモリ上にある状態から開始される。

2010-04-10 10:28:59
koba @tetsu_koba

Zygotoは時々明示的にガベージコレクションを行っている。これも新しいJavaプロセスのJavaのヒープメモリが「綺麗な」状態から始まるようにするための工夫だと思われる。

2010-04-10 10:30:28
安藤化石 @androidzaurus

どんどん呟いてー QT @tetsu_koba: .@AkioHoshi DalvikVMについて。ZygoteのプロセスはDalvikVMそのもののインスタンス。Javaのプログラムを実行するプロセスはZygoteからforkされる。

2010-04-10 10:30:30
koba @tetsu_koba

Javaのプログラムを動かすためにはDalvikVMをはじめとしてたくさんのダイナミックリンクライブラリを必要とするのでメモリの使用量は普通のネイティブのプログラムよりも大きくなる。

2010-04-10 10:33:24
koba @tetsu_koba

しかし、たくさんのJavaプログラムが動作している状況では全てのリードオンリーのコードとデータはJavaプロセスの間で共有されるのでトータルのメモリ使用量は節約できる。

2010-04-10 10:34:06
koba @tetsu_koba

個々のJavaプログラムが新たに消費するメモリ量はZygoteからの差分だけ。

2010-04-10 10:35:06
koba @tetsu_koba

このようにDalvikVMはLinuxの仮想メモリの仕組みを十二分に活用している。システムコール mmap がカナメ。

2010-04-10 10:37:30
koba @tetsu_koba

imodeなどのJavaVMは搭載するOS間の互換性を重視するために、このような仮想メモリを活用する実装はできなかったと思われる。最初に携帯にJavaが載った頃のOSには仮想メモリの仕組みはなかった。

2010-04-10 10:40:46
koba @tetsu_koba

Androidのダイナミックリンクライブラリも通常のPCのLinuxとは異なる。

2010-04-10 10:41:54
koba @tetsu_koba

最初からシステムに存在するダイナミックリンクライブラリはあらかじめ重ならないようにロードアドレスが決められている。つまりprelinkされている。

2010-04-10 10:43:33
koba @tetsu_koba

普通のPCのLinuxでは世の中の全てのダイナミックリンクライブラリを重ならないようにアドレスを決めようするとユーザーメモリのアドレス空間に入りきれなくなる。

2010-04-10 10:51:02
koba @tetsu_koba

なので、プロセスごとにダイナミックリンクのprelinkを行っている。

2010-04-10 10:52:24
koba @tetsu_koba

Androidの場合は同時に使う可能性のあるダイナミックリンクライブラリを全て並べてもユーザーメモリ空間からはみ出ることはないことを前提にしてよい。なのではるかに簡単な仕組みになっている。

2010-04-10 10:55:03
koba @tetsu_koba

さらに言えば、AndroidのダイナミックリンクのしくみはZygoteに対して最適化すればよいという割り切りができる。

2010-04-10 10:57:12
koba @tetsu_koba

これもそれ以前の携帯とは設計思想が大きくことなるところ。JavaVMは後から追加されたものなので、JavaVMのほうが既存のしくみにあわせるしかなかった。

2010-04-10 10:58:39