メモリ効率のよい実時間GC 電気通信大学 情報工学科 鵜川 始陽 2008/7/31 第346回PTT@電通大.

Slides:



Advertisements
Similar presentations
計算理工学基礎 「ハイパフォーマンスコンピューティングの基礎」
Advertisements

状況に応じたサービスを 提供するための人や物に 共通の情報管理
Chapter11-4(前半) 加藤健.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
クラウドにおける ネストした仮想化を用いた 安全な帯域外リモート管理
全体ミーティング (4/25) 村田雅之.
.NET Frameworkにおける マネージヒープと ガベージコレクション
仮想マシンの並列処理性能に対するCPU割り当ての影響の評価
全体ミーティング (6/13) 村田雅之.
応用情報処理V 第1回 プログラミングとは何か 2004年9月27日.
オペレーティングシステムJ/K 2004年11月4日
侵入検知システム(IDS) 停止 IDS サーバへの不正アクセスが増加している
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
大きな仮想マシンの 複数ホストへのマイグレーション
応用情報処理V 第1回 プログラミングとは何か 2003年9月29日.
第5回 CPUの役割と仕組み3 割り込み、パイプライン、並列処理
画像情報を用いた交通流計測 情報工学科 藤吉研究室 EP02076 都築勇司
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
演算/メモリ性能バランスを考慮した マルチコア向けオンチップメモリ貸与法
アスペクト指向プログラミングを用いたIDSオフロード
二分探索木によるサーチ.
2004年度 サマースクール in 稚内 JavaによるWebアプリケーション入門
型付きアセンブリ言語を用いた安全なカーネル拡張
SpectreとMeltdown ITソリューション塾・第28期 2018年5月30日 株式会社アプライド・マーケティング 大越 章司
B演習(言語処理系演習)第9回 メモリ管理・ごみ集め
定兼邦彦 今井浩 東京大学理学系研究科 情報科学専攻
VM専用仮想メモリとの連携による VMマイグレーションの高速化
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
実行時情報に基づく OSカーネルのコンフィグ最小化
仮想メモリを用いた VMマイグレーションの高速化
複数ホストに分割されたメモリを用いる仮想マシンの監視機構
コンパイラ 2012年11月15日
仮想計算機を用いたサーバ統合に おける高速なリブートリカバリ
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
ゲーム開発モデルの基礎.
通信機構合わせた最適化をおこなう並列化ンパイラ
動的データ依存関係解析を用いた Javaプログラムスライス手法
東京工業大学 情報理工学研究科 数理・計算科学専攻 千葉研究室 栗田 亮
未使用メモリに着目した 複数ホストにまたがる 仮想マシンの高速化
バイトコードを単位とするJavaスライスシステムの試作
Intel SGXを用いた仮想マシンの 安全な監視機構
複数ホストにまたがって動作する仮想マシンの障害対策
VMMのソフトウェア若化を考慮した クラスタ性能の比較
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
VMが利用可能なCPU数の変化に対応した 並列アプリケーション実行の最適化
仮想環境を用いた 侵入検知システムの安全な構成法
Peer-to-Peerシステムにおける動的な木構造の生成による検索の高速化
JAVAバイトコードにおける データ依存解析手法の提案と実装
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
マイグレーションを支援する分散集合オブジェクト
Boostのスマートなポインタを使ってみる
全体ミーティング (5/23) 村田雅之.
仮想マシンに対する 高いサービス可用性を実現する パケットフィルタリング
「マイグレーションを支援する分散集合オブジェクト」
Mondriaan Memory Protection の調査
オペレーティングシステムJ/K (管理のためのデータ構造)
アルゴリズムとデータ構造1 2009年6月15日
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
強制パススルー機構を用いた VMの安全な帯域外リモート管理
SMP/マルチコアに対応した 型付きアセンブリ言語
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
IPmigrate:複数ホストに分割されたVMの マイグレーション手法
アルゴリズムとデータ構造 2010年6月17日
複数ホストにまたがるVMの メモリ使用状況に着目した高速化
全体ミーティング (9/12) 村田 雅之.
C#プログラミング実習 第1回.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
Presentation transcript:

メモリ効率のよい実時間GC 電気通信大学 情報工学科 鵜川 始陽 2008/7/31 第346回PTT@電通大

自己紹介 鵜川 始陽 (うがわ ともはる) 1996年 京大マイコンクラブ(KMC)入会 1999年 京大湯淺研究室配属 (4年生) 鵜川 始陽 (うがわ ともはる) 1996年 京大マイコンクラブ(KMC)入会 http://www.kmc.gr.jp/ Linux/98: LinuxをNEC PC-9800シリーズに移植 日本語変換エンジンAnthy でもSKKが好き 1999年 京大湯淺研究室配属 (4年生) 博士課程修了までは一級継続の実装の研究 その後,メモリ管理(GCなど)の研究 2008年 湯淺研究室卒業 現在   電通大情報学科

概要 組込み用のJava処理系に実時間GCを実装 KVM: J2ME CLDCのVM スナップショットGC リターンバリア 複製に基づくコンパクション

目的 組込みソフトウェアの開発にGCを使いたい GC(ごみ集め,Garbage Collection) 組込みソフトウェア 自動メモリ管理 最近は空気みたいなもの Java, LISP, Haskell, ML, … Perl, PHP, Python, Ruby, JavaScript, … ないのはC, C++, Fortran, アセンブラぐらい 組込みソフトウェア 特定のハードウェアのためのソフトウェア 携帯電話 自動車やロボットの制御 工場のラインで製品の検査装置

ごみ集め(GC)とは プログラムが使わなくなったデータ(ごみ)を検出 領域を再利用 ポインタを基準にごみを判定 プログラムはポインタで指されなくなったデータを扱えない ヒープ レジスタ ルート集合 スタック

組込みソフトウェア 性能があまりよくないハードウェア バグが出たら致命的 実時間アプリケーションが多い 遅いプロセッサ 余裕のないメモリ ソフトウェアのバグが原因の事故 動作が予測可能 実時間アプリケーションが多い

実時間アプリケーション イベントから一定時間以内に反応する 人型ロボットが倒れそうになったら倒れる前に 間接を制御してバランスをとる ビデオの再生で,バッファが空になる前に次の フレームをデコードする ゲームで,1/60秒以内に1フレーム分の 処理をする デッドライン イベント 応答 イベント 応答

組込みソフトウェア開発 従来はC++で開発される場合がほとんど そろそろ破綻してきている ⇒プログラムの品質低下 プログラマがアプリケーションの動きを把握できる アセンブラよりは書きやすい 熟練したプログラマが開発 そろそろ破綻してきている 短い開発期間 プログラムの大規模化 人的リソース不足 ⇒プログラムの品質低下

組込みソフトウェアにGCを GCのある言語で組み込みプログラム開発 利点 欠点 メモリ管理の労力削減 メモリ関連のバグがなくなる⇒品質向上 メモリリーク 誤った解放 欠点 洗練されたC++プログラムより実行速度は劣る GCが始まると,ユーザプログラムが停止する 実時間アプリケーションでは問題

実時間GC アプリケーションプログラムの実行の間に 少しずつGCを進める 従来型(Stop the world GC) 実時間GC デッドライン イベント 応答 アプリケーション ごみ集め 実時間GC イベント 応答 アプリケーション ごみ集め

実時間GCのアルゴリズム スナップショットGC リターンバリアによるルートスキャン 複製に基づく実時間コンパクション

参照カウント方式(1) オブジェクトが被参照数を保持 ポインタを更新すると直ちに 参照カウント更新 その場でごみが発見できる アプリケーションの実行の間に少しずつGC できている! 落とし穴 回収されたオブジェクトからの参照は 消える リスト構造などは連鎖的に回収 ⇒長い停止時間 2 1 1 1 1

参照カウント方式(2) その他の欠点 循環構造が回収できない オーバヘッドが大きい ポインタ書き込みの度に参照カウントを更新 スタックやレジスタへの 書き込みにもオーバヘッド 2 1 1

マークスイープ方式(1) マーク・フェイズ ルートからポインタをたどる 到達できたオブジェクトにマーク付け グラフの探索 ヒープ 探索用スタック ルート集合

マークスイープ方式(1) マーク・フェイズ ルートからポインタをたどる 到達できたオブジェクトにマーク付け グラフの探索 ヒープ 探索用スタック ルート集合

マークスイープ方式(1) マーク・フェイズ ルートからポインタをたどる 到達できたオブジェクトにマーク付け グラフの探索 白:まだ到達していない 灰:到達したが,   その先はまだ調べていない 黒:調べ終わった   (二度と調べられない) ヒープ 探索用スタック ルート集合

マークスイープ方式(1) マーク・フェイズ ルートからポインタをたどる 到達できたオブジェクトにマーク付け グラフの探索 白:まだ到達していない 灰:到達したが,   その先はまだ調べていない 黒:調べ終わった   (二度と調べられない) ヒープ 探索用スタック ルート集合

マークスイープ方式(2) スイープ・フェイズ ヒープを端からスキャン マークがついていないオブジェクトを回収 ⇒空き領域のリスト(フリーリスト)に登録 ヒープ ルート集合

制限されたメモリでマークフェイズ 探索用スタック溢れの危険 溢れたらヒープをスキャンしてマークのついた オブジェクトを探す 全てのマークがついたオブジェクトから 探索しなおす ヒープ

マークスイープの実時間化 マーク・フェイズとスイープ・フェイズをそれぞれ分割して,アプリケーションの実行の間に少しずつ行う アプリケーション ごみ集め

マーク処理の分割 GC の進行中でも,アプリケーションの実行が進む オブジェクト間の参照関係が変化する可能性  ⇒生きているオブジェクトのマーク漏れ a b c a.right = b.right; a b c b.right = d; d a b c 21

スナップショットGC [湯淺 ’90] 書込みバリア GC開始時にルートは一括してスキャン ルートにバリア不要 ポインタを書き換えるとき, それまで指されていたオブジェクトが白なら灰色にする GC開始時にルートは一括してスキャン ルートにバリア不要 GC開始のタイミングが見積もりやすい a b c d a b c

スナップショットGCの問題 ルートスキャンは分割しない オブジェクトを移動しない 深い再帰呼出し 多数のスレッド ⇒リターンバリア メモリフラグメンテーション 空き領域の合計は十分あっても,連続領域が確保できず,大きなオブジェクトが作れない ⇒リターンバリア ⇒実時間コンパクション

ルートスキャンの問題 ルート集合 全てのスレッドのスタックをスキャン しなければならない レジスタ ⇒固定 大域変数 ⇒固定 スタック ⇒動的に伸縮 全てのスレッドのスタックをスキャン しなければならない イベント処理用スレッドのスタックは 小さくても・・・ スタックのスキャンによる 停止時間が問題となる場合も search search search search search main スタック

リターンバリア[湯淺ら ’01] スタックを関数フレーム単位で 分割してスキャン アプリケーションは カレントフレームしかアクセスしない GC開始時:少なくとも全てのスレッド のカレントフレームをスキャン それ以外のフレームはアプリケーション の実行の間に少しずつスキャン search search search search search main スタック

リターンが早いと リターンがスキャンを 追い越しそうになったら リターンバリア起動 スキャンを少し進める リターンバリアを再設定 リターンする search search search search search search search search search search search search search search search main main main

リターンバリアの実装 リターンアドレスをフック BYTECODE rbcode[0]={ RBINST }; スキャンを進める; Previous IPにジャンプ; リターンアドレス previous IP リターンバリアなし リターンバリアあり スレッド構造体

フラグメンテーション アプリケーション GC アプリケーション GC コンパクション

コンパクションの分割 コンパクションはオブジェクトを移動させる 移動したオブジェクトを指すポインタも 更新しないと問題 a a a

リードバリア オブジェクトのスロット読み出し時に オブジェクトが移動していたら, 移動先から読み出す if (引越(a)) x = a.転居先.left; else x = a.left; X = a.left; a 引 越

リードバリアの欠点 オーバヘッド大 システムの信頼性低下の場合も 読み出し操作の回数 >> 書込み操作の回数 手続き型言語でも当てはまる システムの信頼性低下の場合も バリアの挿入が自動でできない場合 CやC++で書かれたライブラリ バリアの挿入箇所が膨大 ⇒バリア挿入忘れ

複製に基づく実時間コンパクション[話者ら ’08] Replication GC[Nettlesら ’93]を応用 コンパクションの進行中は,移動元と移動先の 両方が最新の状態を保持する アプリケーションはどちらにアクセスしてもよい リードバリアなし 書き込みバリア ポインタ比較演算にバリア

不完全なコンパクション 連続した空き領域を作ることが目的 フラグメンテーションの激しい箇所のオブジェクトを移動させる

コンパクションの流れ オブジェクトを複製 ヒープをスキャンして ポインタ更新 ルートをスキャンして ポインタ更新 a’ a a’ a a’

書き込みバリア(1) 書き込みの複製 片方に書き込んだら他方にも書き込みを反映 a’.left = 1; a a’ a.left = 1;

書き込みバリア(2) 書き込み時のポインタ更新 ポインタ更新済みの領域に書こうとしたポインタを更新 b.left = a; b a a’

ポインタ比較演算のバリア 同じオブジェクトの実体が二つある 「==」演算に注意 定数との比較はバリア不要 NULLチェック if (x == y || (引越(x) && x.転居先 == y)) if (x == y) y x a a’

性能測定 実験環境 Java VM: KVM CLDC 1.1 Sun のリファレンス・インプリメンテーション Community license 携帯電話のJava(iアプリ) CPU: Core2Duo 6400 (3.13GHz, Cache 2MB) ARMプロセッサでの計測を進行中… OS: Linux 2.6 ベンチマークプログラム GrinderBench: 携帯電話用Javaベンチマーク

分割したGC1回の時間 ミリ秒 ヒープサイズ:5MB

フラグメンテーションの評価 連続空き領域(単位:バイト) 時間 Chessベンチマーク 実時間コンパクションあり コンパクションなし ヒープ全体に対して 100% 実時間コンパクションあり コンパクションなし 約25% (GC開始) 時間 Chessベンチマーク

ベンチマークスコア Stop the world GCとのスコア比(高いほど高速)

現状 現実味のある評価やデモの準備中 ARMプロセッサの乗ったボードでの性能評価 本物の携帯電話(PDAのようなもの)に実装して市販ゲームでデモ

まとめ 組込み用のJava処理系に実時間GCを実装 PC上ではそれなりの実験結果 スナップショットGC リターンバリア 複製に基づくコンパクション PC上ではそれなりの実験結果