たとえば、すべての計算能力を消費しているアプリケーションがあるとします。次に、他の必要な作業を行います。Linuxで、そのアプリケーションに割り込んでその状態をチェックポイントし、後で中断された状態から再開できるようにする方法はありますか?
特に、アプリケーションを停止して別のマシンで再起動できる方法に興味があります。それも可能ですか?
たとえば、すべての計算能力を消費しているアプリケーションがあるとします。次に、他の必要な作業を行います。Linuxで、そのアプリケーションに割り込んでその状態をチェックポイントし、後で中断された状態から再開できるようにする方法はありますか?
特に、アプリケーションを停止して別のマシンで再起動できる方法に興味があります。それも可能ですか?
一般的に、プロセスのチェックポイントは完全には可能ではありません(プロセスはアドレス空間であるだけでなく、ファイル記述子やTCP / IPソケットなどの他のリソースもあるためです...)。
実際には、BLCRなどのチェックポイントライブラリを使用できます。特定の制限条件を使用すると、チェックポイントイメージをあるシステムから別のシステムに移行できる場合があります(ソースシステムと非常によく似ています:同じカーネル、同じバージョンのライブラリとコンパイラ)。など)。
イメージの移行は、仮想マシンレベルでも可能です。それらのいくつかはそのためにかなり良いです。
また、独自のチェックポインティング機構を使用してソフトウェアを設計および実装することもできます。次に、ガベージコレクションの手法と用語の使用を検討する必要があります。Emacs(またはXemacs)のunexec.cファイル(マシンに大きく依存します)も調べてください。
一部の言語の実装とランタイムには、チェックポイントプリミティブがあります。SBCL(無料のCommon Lisp実装)は、コアイメージを保存して後で再起動することができます。SML/NJは画像をエクスポートできます。Squeak(Smalltalkの実装)にもそのような機能があります。
チェックポインティングの他の例として、GCCコンパイラーは、永続化手法*.h
を使用して、実際に単一のヘッダーを(GCCヒープの永続的なイメージであるプリコンパイル済みヘッダーファイルに)コンパイルできます。
直交永続性についてもっと読む。研究テーマでもあります。シリアル化も関連します(JSON、YAML、XMLなどのテキスト形式を使用することもできます)。(システム全体のレベルで)休止状態の手法を使用することもできます。
マニュアルページからman kill
プロセスの中断には、次の2つのステップが必要です。
止まる
kill -STOP <pid>
と
続ける
kill -CONT <pid>
<pid>
プロセスIDはどこにありますか。
タイプ:Control + Z
プロセスを一時停止します(SIGTSTPを送信します)
次にbg
/fg
バックグラウンドまたはフォアグラウンドで再開します
POSIXでは、個々のプロセスをチェックポイントすることは基本的に不可能です。これは、プロセスが独立していないためです。彼らは相互作用することができます。他に何もないとしても、プロセスには一意のプロセスIDがあり、これは内部のどこかに保存されている可能性があります。別のプロセスIDで再開すると、すべての地獄が崩壊する可能性があります。これは、プロセスが任意の種類のロック/同期プリミティブを使用する場合に特に当てはまります。もちろん、元のプロセスIDと同じプロセスIDでプロセスを再開することもできません。これは、新しいプロセスによって取得される可能性があるためです。
おそらく、プロセス(およびスレッド)IDを128ビット程度にして、それらが普遍的に一意になるようにすることで、問題を解決できます...
Linuxでは、このプロセスSTOP信号を送信することで実現できます。CONT信号を送信して再開します。キルマニュアルを参照してください。