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

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

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

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

答え1

プロセスがファイルシステムと持つことができるさまざまな相互作用のため、プロセスの再起動可能なスナップショットを作成することは困難です。一般に、UNIXシステムがこれをサポートすることを期待しないでください。再起動可能なコアダンプを備えたいくつかのUnixのバリエーションがありましたが、現代にはそうではないと思います(とても複雑になりました)。

Lispシステムには通常、再起動可能なイメージを生成するdumpコマンドがあります。したがって、サポートされているLisp方言でプログラムを書くことができます。ダンピング

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

最善の解決策は、おそらくプログラムにスナップショット機能を構築することです。純粋な計算プログラムの場合、これは通常わずかに難しいです。マルチスレッドコンピューティングプログラムでは、スナップショットポイントは、すべてのスレッドが通信するグローバル同期ポイントであることがよくあります。プログラムを作業パッケージとして構築し、プロセッサがアイドル状態になるたびに作業を開始するスケジューラでエントリポイントを作成します。シグナルを受信すると、スケジューラは現在のすべてのジョブが完了するのを待ち、プログラムの状態を保存してからジョブのスケジュールを再開します。

答え2

コンピュータをシャットダウンするよりも休止状態をお勧めしますが、本当に状況を回避できない場合は、「スナップショット/復元」システムがあります。クリウ(ユーザースペースのチェックポイント/復元)これはあなたのニーズに適している可能性があります。このフレームワークを使用すると、プロセスを簡単に「固定」(状態を効果的にディスクに保存)してから再び固定を解除できます。

私はこれを広くテストしていませんが、かなり良い文書を持っているようですので、これは役に立ちます。また、CRIUを使用するには、ほとんどのデフォルトのディストリビューション(およびLinux)CONFIG_CHECKPOINT_RESTOREでは、アクティブでない複数のカーネル機能を有効にする必要があるため、CONFIG_MEM_SOFT_DIRTYそれを実行するには独自のカーネルをコンパイルする必要があります。

メモ:プログラムがクラッシュした場合理由事前に凍結することは、プログラムが同じ状況に直面する可能性が高いため、おそらく正しいアプローチではありません(ディスクやメモリがいっぱいになるなどの外部の理由ではない場合)。

関連情報