Dalvik仮想マシンのアーキテクチャ  発表者 : 僻地の暗黒プログラマ kmt-t
自己紹介 Web上での活動  ハンドルネーム : kmt-t  はてな ID : kmt-t2  Twitter ID : kmt_t 属性    僻地といいながら去年の10月から大阪在住です    組み込みプログラマらしい? ...
今後の話の前振り Dalvik仮想マシン三部作  Dalvik仮想マシンのアーキテクチャ  Dalvikバイトコードのリファレンスの読み方  DEXファイルフォーマット 今回は第一部のみを解説  機会があれば第二部、第三部もやりたい...
本日の前振り 仮想マシンの基本的なアーキテクチャ  スタックマシンとは?レジスタマシンとは?  スレッドインタープリタとは? Java仮想マシンの詳細についてのリファレンス  「Java仮想マシン仕様 第二版」    ISBN : ...
アーキテクチャ比較Java仮想マシン vs Dalvik仮想マシン Java仮想マシン  スタックマシン Dalvik仮想マシン  レジスタマシン 両者の違いとトレードオフの関係は?  当然両者一長一短  今回の解説ではこの点をク...
Java仮想マシンスタックマシン 計算に使用する値をスタックに積んでいく スタックから値をポップして、その値で演算 演算結果をスタックに積む                  値3メモリ                      演算  ...
Dalvik仮想マシンレジスタマシン (1) レジスタとよばれる領域を使って計算する       R0       R1     メモリ       R2       R3       R4                    演算    ...
Dalvik仮想マシンレジスタマシン (2) Dalvik仮想マシンは特殊なレジスタマシン  レジスタはメソッドごとに用意される  レジスタはスタック領域に積まれる形で用意   される  レジスタ数が可変 (0~65535個)  C言...
Dalvik仮想マシンレジスタマシン (3) メソッドAからメソッドBを呼んだ場合のスタック      メソッドB R0 (ローカル変数)      メソッドB R1 (ローカル変数)             メソッドBレジスタ       ...
一般的に考えられるバイトコードのフォーマット バイトコード命令には最低必要な情報  命令の種類をあらわす「オペコード」  命令の対象となるデータを指す「オペランド」  これは仮想マシンだけでなく本物のCPUも同様 命令のバイナリサイズ...
バイトコード命令のバイナリデータの例 バイトコード命令の例 (架空の例) DEST = SRC1 + SRC2 演算命令            オペランド8bit   オペランド8bit   オペランド8bitオペコード8bit      ...
Java仮想マシンのバイトコードのフォーマット オペコードは8bit オペランドは省略できることが多い  スタックマシンなので命令の対象データがス   タックトップに決まっている命令が多いため  そのため、Java仮想マシンのバイトコー...
Dalvik仮想マシンのバイトコードのフォーマット オペコードは8bit レジスタを指すオペランドは最大16bit  レジスタは最大65535個あるため  Java仮想マシンのような省略は不可  3オペランドの命令の場合、普通に考える...
Dalvik仮想マシンのバイトコードの工夫 レジスタが多いため、オペランドが巨大化  この問題を解決するため、「すべての命令で   すべてのレジスタを参照」しない  多くの命令はレジスタ番号0~15または0~255   までのレジスタしか...
命令数が多いことによる問題点 レジスタマシンにしたのは何故か?  スタックマシンは命令長が短い代わりにスタック操作   のための命令の挿入が必要  つまり命令数はJava仮想マシンの方が多い  命令数が多くなるのを嫌ったのでは? イン...
一般的なインタープリタ実装 擬似コードで書くと以下のような感じ   普通の感覚では特に問題ないように思える   実は非常にオーバヘッドが大きなコード どの辺りがオーバヘッドが大きいのか?# INSTR = 現在実行中のバイトコード命令#...
一般的なインタープリタの問題点 ジャンプ命令が必要な箇所が多い    命令ごとにループを回す箇所のジャンプ    命令実行ルーチンに飛ぶためのジャンプ    命令実行ルーチンから戻るためのジャンプ    ジャンプは最悪10CPUサイク...
Dalvik仮想マシンのインタープリタ スレッドインタープリタ方式# 最初の命令処理ルーチンのアドレスをBASE_ADDRとする# 各命令処理ルーチンの間隔は64バイトでアライメント.ALIGN 64OP_A :        … # ここで...
Dalvik仮想マシンインタープリタの改善点 ジャンプ命令が必要な箇所が少ない  命令処理の最後に一回ジャンプするだけ メモリアクセス  テーブル参照が存在しない 命令処理に対し数倍程度のオーバーヘッド  唯一のジャンプがCPUが分...
まとめ Dalvik仮想マシンではインタープリタを改  善すべく工夫されている  それでも命令毎のオーバーヘッドは大きい  依然としてバイトコードの命令数は少ないほ   うが良い 以上をまとめると  バイナリサイズはJava仮想マシン...
今後の予定 Dalvikバイトコードのリファレンスの読み方  今回解説した内容をベースにDalvikバイトコード   のリファレンスの読み方を次回解説したい  ここまでいけば自力でインタープリタのソースは   読めるようになる みんなで...
以上で発表は終わりですご静聴ありがとうございました!
Upcoming SlideShare
Loading in...5
×

Dalvik仮想マシンのアーキテクチャ

10,182

Published on

改定しました
http://www.slideshare.net/kmt-t/dalvik-10316622

Published in: Technology
0 Comments
14 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
10,182
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
75
Comments
0
Likes
14
Embeds 0
No embeds

No notes for slide

Dalvik仮想マシンのアーキテクチャ

  1. 1. Dalvik仮想マシンのアーキテクチャ 発表者 : 僻地の暗黒プログラマ kmt-t
  2. 2. 自己紹介 Web上での活動  ハンドルネーム : kmt-t  はてな ID : kmt-t2  Twitter ID : kmt_t 属性  僻地といいながら去年の10月から大阪在住です  組み込みプログラマらしい?  画像処理、ファイルシステムなどのミドルウェア中心  使用する言語はC++(not C)/C#/たまにPython  関数型言語はOcaml/F#派。あまり触れてませんが
  3. 3. 今後の話の前振り Dalvik仮想マシン三部作  Dalvik仮想マシンのアーキテクチャ  Dalvikバイトコードのリファレンスの読み方  DEXファイルフォーマット 今回は第一部のみを解説  機会があれば第二部、第三部もやりたい 三部作のゴール  ソースコードを誰でも読めるようにしたい
  4. 4. 本日の前振り 仮想マシンの基本的なアーキテクチャ  スタックマシンとは?レジスタマシンとは?  スレッドインタープリタとは? Java仮想マシンの詳細についてのリファレンス  「Java仮想マシン仕様 第二版」  ISBN : 489471356X ガベージコレクションは以下の本が詳しい  「ガベージコレクションのアルゴリズムと実装」  ISBN : 4798025623  Dalvik仮想マシンの「今の」実装は大幅に変わっている
  5. 5. アーキテクチャ比較Java仮想マシン vs Dalvik仮想マシン Java仮想マシン  スタックマシン Dalvik仮想マシン  レジスタマシン 両者の違いとトレードオフの関係は?  当然両者一長一短  今回の解説ではこの点をクリアにしたい
  6. 6. Java仮想マシンスタックマシン 計算に使用する値をスタックに積んでいく スタックから値をポップして、その値で演算 演算結果をスタックに積む 値3メモリ 演算 値2 値3 値2 値1 値1
  7. 7. Dalvik仮想マシンレジスタマシン (1) レジスタとよばれる領域を使って計算する R0 R1 メモリ R2 R3 R4 演算 R5 R6 R7
  8. 8. Dalvik仮想マシンレジスタマシン (2) Dalvik仮想マシンは特殊なレジスタマシン  レジスタはメソッドごとに用意される  レジスタはスタック領域に積まれる形で用意 される  レジスタ数が可変 (0~65535個)  C言語のローカル変数と扱いは近い
  9. 9. Dalvik仮想マシンレジスタマシン (3) メソッドAからメソッドBを呼んだ場合のスタック メソッドB R0 (ローカル変数) メソッドB R1 (ローカル変数) メソッドBレジスタ メソッドB R2 (引数1) 成 (VM-specific internal goop) 長 メソッドA R0 (ローカル変数) 方 メソッドA R1 (ローカル変数) 向 メソッドAレジスタ メソッドA R2(引数1) メソッドA R3(引数2) …
  10. 10. 一般的に考えられるバイトコードのフォーマット バイトコード命令には最低必要な情報  命令の種類をあらわす「オペコード」  命令の対象となるデータを指す「オペランド」  これは仮想マシンだけでなく本物のCPUも同様 命令のバイナリサイズを命令長と呼ぶ  命令長は短いほうが実行ファイルサイズ的に有利  命令長は可変長、固定長どちらもありうる  Java/Dalvik仮想マシンは可変長  本物のCPUのARM/MIPSなどは固定長
  11. 11. バイトコード命令のバイナリデータの例 バイトコード命令の例 (架空の例) DEST = SRC1 + SRC2 演算命令 オペランド8bit オペランド8bit オペランド8bitオペコード8bit (DEST (SRC1 (SRC2 (ADD) レジスタ番号) レジスタ番号) レジスタ番号) 命令長32bit
  12. 12. Java仮想マシンのバイトコードのフォーマット オペコードは8bit オペランドは省略できることが多い  スタックマシンなので命令の対象データがス タックトップに決まっている命令が多いため  そのため、Java仮想マシンのバイトコードは オペコードのみの8bit命令が多い
  13. 13. Dalvik仮想マシンのバイトコードのフォーマット オペコードは8bit レジスタを指すオペランドは最大16bit  レジスタは最大65535個あるため  Java仮想マシンのような省略は不可  3オペランドの命令の場合、普通に考えると、 オペコード8bit、オペランド16bit*3=48bitで命 令長が56bitになる 命令長は必ず16bitでアライメント  命令長的にはJava仮想マシンに比べて不利
  14. 14. Dalvik仮想マシンのバイトコードの工夫 レジスタが多いため、オペランドが巨大化  この問題を解決するため、「すべての命令で すべてのレジスタを参照」しない  多くの命令はレジスタ番号0~15または0~255 までのレジスタしか参照できない  オペランドサイズを4bitまたは8bitに圧縮 これでもJava仮想マシンより命令長は長い
  15. 15. 命令数が多いことによる問題点 レジスタマシンにしたのは何故か?  スタックマシンは命令長が短い代わりにスタック操作 のための命令の挿入が必要  つまり命令数はJava仮想マシンの方が多い  命令数が多くなるのを嫌ったのでは? インタープリタのパフォーマンス上非常に不利  インタープリタは命令そのものの処理より、命令毎に 発生するオーバーヘッドのほうが非常に大きい  JITコンパイラを使えばこのオーバーヘッドは回避でき る。JITコンパイラで高速化できる理由は主にこの点が 大きい
  16. 16. 一般的なインタープリタ実装 擬似コードで書くと以下のような感じ  普通の感覚では特に問題ないように思える  実は非常にオーバヘッドが大きなコード どの辺りがオーバヘッドが大きいのか?# INSTR = 現在実行中のバイトコード命令# TBL = オペコードに対応した処理の関数テーブルLOOP : FUNC = TBL[INSTR->OPCODE] CALL FUNC(INSTR) # 関数呼び出し NEXT INSTR # 次の命令に移動する GOTO LOOP # 繰り返し
  17. 17. 一般的なインタープリタの問題点 ジャンプ命令が必要な箇所が多い  命令ごとにループを回す箇所のジャンプ  命令実行ルーチンに飛ぶためのジャンプ  命令実行ルーチンから戻るためのジャンプ  ジャンプは最悪10CPUサイクル以上かかる重い処理 メモリアクセス  テーブル参照のメモリアクセス 命令処理に対し数十倍のオーバーヘッド  命令処理内容が単なる加算だとすると、それ自体は 1CPUサイクル(ARMの場合)程度で完了
  18. 18. Dalvik仮想マシンのインタープリタ スレッドインタープリタ方式# 最初の命令処理ルーチンのアドレスをBASE_ADDRとする# 各命令処理ルーチンの間隔は64バイトでアライメント.ALIGN 64OP_A : … # ここで命令実行 NEXT INSTR # 次の命令に移動する GOTO BASE_ADDR + 64 * INSTR->OPCODE.ALIGN 64OP_B : … # ここで命令実行 NEXT INSTR # 次の命令に移動する GOTO BASE_ADDR + 64 * INSTR->OPCODE… # 以下繰り返し
  19. 19. Dalvik仮想マシンインタープリタの改善点 ジャンプ命令が必要な箇所が少ない  命令処理の最後に一回ジャンプするだけ メモリアクセス  テーブル参照が存在しない 命令処理に対し数倍程度のオーバーヘッド  唯一のジャンプがCPUが分岐予測できない  最新のARMプロセッサだとパイプラインストー ルで十数CPUサイクルのロス
  20. 20. まとめ Dalvik仮想マシンではインタープリタを改 善すべく工夫されている  それでも命令毎のオーバーヘッドは大きい  依然としてバイトコードの命令数は少ないほ うが良い 以上をまとめると  バイナリサイズはJava仮想マシンの方がだい ぶん小さい  実行速度はDalvik仮想マシンの方が高速にでき る「かもしれない」
  21. 21. 今後の予定 Dalvikバイトコードのリファレンスの読み方  今回解説した内容をベースにDalvikバイトコード のリファレンスの読み方を次回解説したい  ここまでいけば自力でインタープリタのソースは 読めるようになる みんなでDalvik仮想マシンを語れるように
  22. 22. 以上で発表は終わりですご静聴ありがとうございました!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×