web-dev-qa-db-ja.com

プログラムの実行状態を保存する方法

完了までに数日かかる長い計算を実行するプログラムがあります。

プログラムの実行状態を保存する方法はありますか?そのため、コンピュータの電源を切り、保存された状態からプログラムを実行できるようになります。または、何らかの理由でプログラムがクラッシュした場合、(最初からではなく)保存された状態からプログラムを再起動できますか?

8
nano - merge me

プロセスはファイルシステムとあらゆる種類の相互作用を持つ可能性があるため、プロセスの再起動可能なスナップショットを作成することは非常に困難です。原則として、unixシステムがこれをサポートすることを期待しないでください。再起動可能なコアダンプを備えたUNIXの亜種がありましたが、最近のもの(複雑になりすぎている)には当てはまらないと思います。

LISPシステムには通常、再起動可能なイメージを作成するダンプコマンドがあります。したがって、プログラムは dumping をサポートするLISP方言で作成できます。

仮想マシンでコードを実行し、仮想マシンマネージャー(VirtualBoxなど)を使用して定期的なスナップショットを作成できます。プログラムの機能によっては、パフォーマンスが低下する場合と低下しない場合があります。

最善の解決策は、おそらくスナップショット機能をプログラムに組み込むことです。純粋に計算プログラムの場合、これはしばしば適度に難しいだけです。マルチスレッドの計算プログラムでは、スナップショットポイントは通常、すべてのスレッドが通信するグローバル同期ポイントです。プログラムをタスクのバッグとして構造化し、エントリポイントを、プロセッサが解放されるたびにタスクを開始するディスパッチャにします。信号を受信すると、ディスパッチャは現在のすべてのタスクが終了するのを待ち、プログラムの状態を保存して、タスクのディスパッチを再開します。

コンピュータをシャットダウンする代わりに休止状態にすることをお勧めしますが、これを本当に回避できない場合は、 [〜#〜] criu [〜#〜] (Checkpoint/Restore inユーザースペース)、それはあなたのニーズに合うかもしれません。このフレームワークを使用すると、プロセスを非常に簡単に「フリーズ」(実際には状態をディスクに保存)し、後で再度解凍することができます。

私はまだこれを広範囲にテストしていませんが、彼らはかなり良いドキュメントを持っているようですので、あなたはそれが役に立つかもしれません。また、CRIUを使用するには、ほとんどの株式分布ではおそらく有効になっていないいくつかのカーネル機能を有効にする必要がある場合があることに注意してください(CONFIG_CHECKPOINT_RESTOREおよびCONFIG_MEM_SOFT_DIRTY)なので、実行するには独自のカーネルをコンパイルする必要がある可能性があります。

注:プログラムが理由でクラッシュした場合、事前にフリーズするのはおそらく道のりではありません、ほとんどの場合、プログラムは同じ条件で再び実行されます(ディスクやメモリがいっぱいなどの外部的な理由がない場合)。

3
Andreas Wiese