« 演習3第1期 | Main | システムコールの割り込み番号 »

April 21, 2005

Dragonflyでcheckpoint

プログラムの動作中の状態をそのまま保存しておいて、その時点から実行を再開できるようにしたものを「チェックポイント」という。保存した状態は何も同じマシンで再開しなくてもいいじゃないの、ということで別のマシンに計算を移せるようにすることを「マイグレーション」と言って、ある種流行ってい(る|た)技術らしい。一般的には仮想マシンにこうした機能を盛り込むのが実装的に楽そうなので仮想化技術とセットで語られることが多いようである。

用途としてはとりあえずグリッドコンピューティングなんかにおいて計算の移動を柔軟に行えるようにすることで計算資源の柔軟な参加や脱退を容易にする、とか、超高速にマイグレーションを行うことでサービスを事実上無停止のままサービスを提供するハードウェアを切り替えるとか、その辺が提案されたり実用化されたりしているようだ。

クラスタとかグリッドとか、雲の上みたいなでっかい話だけじゃなくて、もっと一般ユーザーが家庭や職場で使って便利/楽しい用途はないかね?とおーくら氏と議論してみたりしたが、とりあえず出てきたのが「アプリケーションを個別にフリーズさせて保存/再開できたらいいんじゃね?」という案。例えば重要な箇所で保存しておいてクラッシュしたときにはそこから再開、あるいはクラッシュの直前で保存しておくことでデバッグ効率が上がる[1]、とりあえずしばらく使わないPhotoshopを作業状態を保ったまま保存してメモリから完全に追い出しておくことで他の作業がスムーズに、卑近な例ではセーブ機能のないゲームでボス戦の直前で保存しておく、などなど、それなりにおもしろいことができそう。

で、Windowsアプリに対してこのような機能を提供するVMレイヤーみたいなものを提供できるか?と考えてみたのだが、数秒で破綻。プロセス単位でコンテキストを保存し後から復帰した場合、そのプロセスが以前持っていたハンドル類はどうするのか。少なくともWindowsに手を入れることなしに実現することは難しそうである(*)。

じゃあOSに手を入れればできるのか、といえばできるらしい。FreeBSDの亜種として有名なDragonflyBSDになんとチェックポイント機能が含まれているらしい。

(*)…書きながら思ったのだが、(できるのかどうか知らないけど)全WindowsAPI呼び出しをフックして、ハンドルが生成された場合にはテーブルにその値を書いておく。保存する際にはそのハンドルのテーブルも保存しておく。復帰後は、テーブルに記録された情報に従って全てのハンドルを作り直して、保存前のハンドルの値と復帰後のハンドルの値との対応表を作っておく。で、アプリケーションがWindows APIを呼び出した際にハンドルが使われていれば対応表を見て復帰後に作り直した正しいハンドルを用いて実際にWindows APIをコールする。こうすれば少なくともハンドルの問題は解決できそう。とまあ原理的にはさらっと書けるが本当にそんなことできる?すぐ思いつく問題点がいくつもある。1つめ、本当に全てのWindowsAPI呼び出しをフックできるのか?2つめ、復帰時に以前と完全に同じ状態のハンドルを復元できるか?

[1]…Debugging Operating Systems with Time-Traveling Virtual Machines

|

« 演習3第1期 | Main | システムコールの割り込み番号 »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/39126/3790132

Listed below are links to weblogs that reference Dragonflyでcheckpoint:

« 演習3第1期 | Main | システムコールの割り込み番号 »