細粒度スレッド生成を支援する Java 処理系の構想 東京大学 大学院 理学系研究科 情報科学専攻 米澤研究室 大山 恵弘 田浦健次朗 米澤明憲 目的 低コストなスレッド生成 高いスケーラビリティ プログラマの負担が少ない並列化 を実現する Java 処理系を作る プログラム例 class Pfib { public static int pfib(int n) { if (n < 2) return 1; 同期ブロック else { int x, y; sync { fork { x = pfib(n-1); } fork { y = pfib(n-2); } } return x + y; スレッド生成 } } } プロトタイプの実装 拡張可能 Java プリプロセッサEPP (電総研の一杉による) を利用して実装 Java ソース to ソースの変換 一つの fork ⇔ 一つの Java スレッドの生成 約500行の EPP プラグインコードによる実装 性能は問題外 今後の検討事項 Q: どうやってスレッド生成のコストを下げるか? A: Lazy Task Creation (LTC) の方法が使えそうだ 問題 従来の LTC に基づく処理系: コンパイラ and/or ランタイムがスタックをトリッキーに管理 スタックフレーム情報を明示的にデータ構造に入れる、など しかし... Java ではバイトコードレベルですら call/return/throw でしかスタックを操作できない → どうする? JVM の拡張は有効そうだ。 それとも... Java ソースtoソース変換により フレーム情報を明示的に扱う方法 JavaGo (関口’99) の場合 フレーム情報をデータ構造 int x, y = 0; (コンテキスト)に退避 try { x = foo(y); } catch (NotifyMigration e) { c = make_context(pc, x, y, ...); append_context(c); throw e; } コンテキスト コンテキスト コンテキスト コンテキスト フレーム フレーム フレーム フレーム スレッド移動時に例外を投げ throw コンテキストデータ構造を生成 throw throw スレッド移動以外の実行の オーバヘッド小さい
© Copyright 2025 ExpyDoc