More Related Content
Similar to Dalvik仮想マシンのアーキテクチャ 改訂版
Similar to Dalvik仮想マシンのアーキテクチャ 改訂版 (20)
More from Takuya Matsunaga
More from Takuya Matsunaga (6)
Dalvik仮想マシンのアーキテクチャ 改訂版
- 2. 自己紹介
Web上での活動
・ハンドルネーム : kmt-t
・はてなダイアリ ID : kmt-t2
・Twitter ID : kmt_t
属性
属性
・鳥取県から大阪に出稼ぎ中です
・組み込みプログラマらしい
・ミドルウェアが得意です
→画像処理(2D/3D)、ファイルシステム、仮想マシンが専門です
・使用言語はC++(not C)/C#/Python
→C++11とかC#の最新の仕様がキャッチアップできていません…
- 9. 仮想マシンバイトコード
命令のイメージ (架空の例)
たとえば
レジスタAとレジスタBを加算してレジスタCに格納する命令の例
オペコード オペランド オペランド オペランド
ADD レジスタ番号C レジスタ番号A レジスタ番号B
(8bit) (8bit) (8bit) (8bit)
命令長=32bit
- 10. Java仮想マシン
スタックマシンの特徴
特徴
・可変長命令フォーマット
・オペランドは8bit
・演算対象はオペランドスタックのトップと決まっている命令が多い
→この場合オペランドが省略可能
・オペランドスタックを操作するための命令が必要なケースがある
→そのため命令数がレジスタマシンにくらべて多くなるケースがある
まとめると
・バイトコードのサイズは小さい (オペランドが省略できるため)
・同じ処理をした場合の命令数はレジスタマシンにくらべて多い
- 11. Dalvik仮想マシン
レジスタマシンの特徴
特徴
・可変長命令フォーマット
・オペランドは8bit
・レジスタがオペランドとなる場合、オペランドサイズは最大16bitになる
→レジスタが最大65535個あるため
・命令は16bitでアライメントされている
・オペランドスタックを操作するための命令が不要である
まとめると
・バイトコードのサイズは大きい (オペランドが大きいため)
・同じ処理をした場合の命令数はスタックマシンにくらべて少ない
- 15. 一般的なインタープリタの
問題点
重い処理が多い
・ジャンプが多い (ジャンプは最悪10CPUサイクル以上かかる処理)
1. 命令ごとにループを回す箇所のジャンプ
2.命令実行ルーチンに飛ぶためのジャンプ
→このジャンプはCPUによる最適化処理(分岐予測)が効かない
3. 命令実行ルーチンから戻るためのジャンプ
・テーブル参照がある
巨大なオーバーヘッド
バイトコード命令が単なる加算である場合は、それそのものの処理は
数CPUサイクルで完了するが、バイトコード命令ごとに発生する
インタープリタのオーバーヘッドは数十サイクル以上ある
- 16. Dalvik仮想マシンの
インタープリタの実装
擬似コードによる例
・スレッドインタープリタと呼ばれる方式
# 最初の命令処理ルーチンのアドレスをBASE_ADDRとする
# 各命令処理ルーチンの間隔は64バイトでアライメント
.ALIGN 64
OP_A :
… # ここで命令実行
NEXT INSTR # 次の命令に移動する
GOTO BASE_ADDR + 64 * INSTR->OPCODE
.ALIGN 64
OP_B :
… # ここで命令実行
NEXT INSTR # 次の命令に移動する
GOTO BASE_ADDR + 64 * INSTR->OPCODE
… # 以下繰り返し
- 19. まとめ
要約
・実行するバイトコード命令ごとに発生するオーバーヘッドは大きい
・Dalvik仮想マシンではインタープリタを改良、改善している
・しかし依然として実行するバイトコード命令の数は少ないほうが良い
まとめ
・バイナリサイズはJava仮想マシンの方がだいぶん小さい
・実行速度はDalvik仮想マシンの方が高速にできる「かもしれない」
→インタープリタのパフォーマンスでは有利
→JITコンパイラを採用するとどちらが有利か微妙