Linuxでプロセスを「休止状態」にすることは可能ですか?ラップトップの「休止状態」のように、プロセスが使用するすべてのメモリをディスクに書き込み、RAMを解放します。そして、後で、「プロセスを再開」することができます。つまり、メモリからすべてのデータを読み取ってRAMに戻し、プロセスを続行できますか?
Linuxでプロセスを「休止状態」にすることは可能ですか?ラップトップの「休止状態」のように、プロセスが使用するすべてのメモリをディスクに書き込み、RAMを解放します。そして、後で、「プロセスを再開」することができます。つまり、メモリからすべてのデータを読み取ってRAMに戻し、プロセスを続行できますか?
回答:
私はCryoPIDを維持するために使用しました。これは、あなたが話していることを正確に実行するプログラムです。プログラムのアドレス空間、VDSO、ファイル記述子の参照および状態の内容を、後で再構築できるファイルに書き込みます。Linux自体に使用可能なフックがなかったときにCryoPIDが開始され、ユーザー空間から完全に機能しました(実際には、ディストリビューション、カーネル、セキュリティ設定によっては、機能します)。
問題は(確かに)ソケット、保留中のRTシグナル、多数のX11の問題、glibcキャッシングgetpid()の実装などです。ランダム化(特にVDSO)は、Bernardがそこから離れた後、それに取り組んでいる私たちの数人にとって乗り越えられないものであることがわかりました。しかし、それは楽しかったし、いくつかの修士論文のトピックとなった。
実行状態を保存してその状態に直接再起動できるプログラムを検討している場合は、おそらく信号を処理するときに、プログラム自体からその情報を保存する方がはるかに簡単です。
ここに、2014年のステータス更新を掲載したいと思います。
受け入れられた答えは、チェックポイント/復元を実行するためのツールとしてCryoPIDを示唆していますが、このプロジェクトは手に負えず、最近のカーネルでコンパイルすることは不可能であることがわかりました。さて、私はアプリケーションチェックポイント機能を提供する2つのアクティブに管理されたプロジェクトを見つけました。
最初に、私はそれを実行した方が幸運であるので、 主にユーザースペースでチェックポイント/復元を実行するCRIUを提案し、動作するにはカーネルオプションCONFIG_CHECKPOINT_RESTOREを有効にする必要があります。
チェックポイント/ユーザースペースでの復元、またはCRIU(発音はkree-oo、IPA:/krɪʊ/、ロシア語:криу)は、Linuxオペレーティングシステム用のソフトウェアツールです。このツールを使用すると、実行中のアプリケーション(またはその一部)をフリーズし、ファイルのコレクションとしてハードドライブにチェックポイントできます。その後、ファイルを使用して、アプリケーションをフリーズした時点から復元して実行できます。CRIUプロジェクトの特徴は、主にユーザー空間で実装されることです。
後者はDMTCPです。彼らのメインページからの引用:
DMTCP(分散マルチスレッドチェックポイント)は、マルチスレッドおよび分散アプリケーションを含む複数の同時アプリケーションの状態を透過的にチェックポイントするツールです。Linuxカーネルモジュールやその他のカーネル変更を行わずに、ユーザーバイナリ実行可能ファイルを直接操作します。
引数には、すばらしいWikipediaページもあります。Application_checkpointing
この回答ctrl-z
は、実際にはシグナルでプロセスを停止することを示していSIGTSTP
ます。次のコマンドで停止信号を発行できますkill
。
kill -STOP <pid>
それはプロセスの実行を一時停止します。それが使用していたメモリはすぐには解放されませんが、他のプロセスにメモリが必要なため、停止したプロセスが使用していたメモリは徐々にスワップアウトされます。
再び起こしたいときは、
kill -CONT <pid>
CryoPIDのようなより複雑なソリューションは、停止したプロセスがシステムのシャットダウン/再起動に耐えられるようにしたい場合にのみ実際に必要です-必要なようには聞こえません。
問題は、プログラムが開いたストリーム(ファイルとソケット)を復元することです。
OS全体が休止状態になると、ローカルファイルなどを復元できます。ネットワーク接続はサポートしていませんが、インターネットにアクセスするコードは、通常、より多くのエラーチェックなどであり、エラー条件を乗り越えます(またはすべきです)。
プログラムごとの休止状態(アプリケーションサポートなし)を行った場合、開いているファイルをどのように処理しますか?別のプロセスが暫定的にそれらのファイルにアクセスするとどうなりますか?等?
プログラムが読み込まれていない状態を維持することは困難です。
スレッドを一時停止してディスクにスワップさせるだけでも、ほとんど同じ効果がありますか?
または、仮想マシンでプログラムを実行し、VMに一時停止を処理させます。
短い答えは「はい、しかし必ずしも確実ではない」です。CryoPIDを確認してください。
実際、開いているファイルが最も一般的な問題です。CryoPIDは明示的に述べています:
開いているファイルとオフセットが復元されます。リンクが解除され、ファイルシステムでアクセスできない一時ファイルは、常にイメージに保存されます。再開時に存在しない他のファイルはまだ復元されていません。このような状況でファイルの内容を保存するためのサポートが計画されています。
同じ問題はTCP接続にも影響しますが、CryoPIDは接続再開のためにtcpcpをサポートしています。
Linuxカーネルは、チェックポイント/再起動先物を部分的に実装しました:https : //ckpt.wiki.kernel.org/、ステータスはこちらです。
いくつかの有用な情報はlwn(linux weekly net)にあります:http ://lwn.net/Articles/375855/ http://lwn.net/Articles/412749/ ......
答えは「はい」です
短い答えは「はい」です。あなたはこれをいくつかのアイデアのために見ることから始めるかもしれません:コアイメージからのELF実行可能ファイル再構築(http://vx.netlux.org/lib/vsc03.html)
SourceForgeから入手可能なCryopid2と呼ばれるパッケージを作成するCryopidを拡張しました。これは、プロセスを移行するだけでなく、休止状態にすることもできます(開いているファイルとソケットと一緒に-ソケット/パイプ内のデータは休止状態でプロセスに吸い込まれ、プロセスが再起動するとこれらに戻されます)。
私がこのプロジェクトで活動していない理由は、私はカーネル開発者ではないためです-これ(および/または元のクリオピッド)の両方が、最新のカーネル(例:Linux 3.x)で実行できる人をボードに入れる必要があります。 。
Cryopidメソッドは機能します。これは、私が遭遇したLinuxでの汎用プロセスの休止状態/移行に対するおそらく最良のソリューションです。
他の人が指摘したように、アプリケーションが壊れたストリームを処理するには組み込みのエラーチェックが必要なため、OSがこの機能を提供することは困難です。
ただし、補足として、Selfプログラミング言語など、仮想マシンを使用する一部のプログラミング言語とツールは、この機能を明示的にサポートしています。
これは、クラスタ化されたオペレーティングシステムの最終的な目標のようなものです。Mathew Dillonは、Dragonfly BSDプロジェクトでこのようなものを実装するために多くの努力をしています。