2009-04-03 12 views
21

プロセスを一時停止し、メモリの内容をファイルに保存してから、後でファイルを再ロードしてプログラムを続行できますか?後で使用するためにプロセスのメモリを保存しますか?

編集 私はこのことについて読んでいる:

http://en.wikipedia.org/wiki/Setcontext

は、それが構造体の内容をダンプし、何とか同じメモリ領域を割り当てるためにmalloc関数を強制することは可能ですか?

+0

Linuxでカーネルを変更せずにcryopidを実行することができます。 – user2284570

答えて

16

技術的には可能ですが、システムに割り当てられたすべてのリソースの状態も保存する必要があります。たとえば、ファイルのデコーダーのようにしてから復元する必要があります。だからそれは難しい作業です。

あなたが望むものを達成する最も簡単な方法は、VMWareのような仮想マシンを使用することです。一時停止すると、実行中のすべてのプログラムとともにマシン状態全体が実際に保存されます。

+0

そして、VMWareはネットワークインターフェイスのような他のリソースが適切に再起動されるようにします。 –

+0

それは挑戦だけでなく、一般的には不可能です。 http://blogs.msdn.com/oldnewthing/archive/2004/04/20/116749.aspx – GSerg

+0

@GSergを参照すると、そのリンクは、プロセス外のリソースが休止状態になったときに解放されることを前提としています。これは、プロセスが実行されないキューに隠されており、エキスプロセス・リソースを放棄することなくディスクに送信されるアドレス空間です。 – paxdiablo

0

.NET 3.0以上のWorkflow Foundationでは、ワークフローを停止して再起動することができます。

2

まあ、javaはシリアル化を持っていて、それはどこか近くにあります。あなたがプロセスを一時停止した時と同じ状態にする必要があるので、CPUレジスタのメモリアドレスなどの最下位レベルにはできません。

これはsharptoothは言及してそれは、ネイティブコードを扱う際には不可能であることのポイントに厄介だ

1

:-) Linuxカーネルモジュールとしては良いプロジェクトになることができます。

しかし、設定ファイルを扱うのではなく、設定を保持するために "自分のメモリをダンプする"トリックを使用しているプログラム(iirc emacsなど)があります。ただし、これはWindowsでは動作しません。実行ファイルは拒否書き込み共有モードで実行されるためです。しかし、それはLinuxやDOS上でかわいい(でも、危険な)トリック:)

6

これは通常persistent continuationと呼ばれます。 SmallTalkやSBCLのような言語の中には、永続的な継続を第一級でサポートしているものがあります。ほとんどの言語はそうではありません。

+0

継続はプログラム内で制御フローを構成しますが、プログラムの実行を停止または開始しません。 – sth

+0

@sth一部のSmalltalkランタイムとSBCLは、あなたが考えている一時的なものではなく、永続的な継続をサポートしています。 –

4

要件やOSに応じて、あなたは私が実際にgdb以外の最大のバックコアダンププログラムをロードしようとしたことがないcore dump

を強制的に試みることができます。シャープポイントが指摘しているように、開いているファイルやプログラムメモリにない他の状態が失われるようです。

もう1つのアプローチは、プログラムでディスクにする必要がある状態を単純にシリアライズすることです。それは吸うが、あなたがプログラムの実行を中断することに満足していない限り、おそらく最も信頼できる方法だろう。それはあなたのオペレーティングシステムのスレッドライブラリで行うことができます。あるいは、あなたのシェルで1人のポスターが指摘されていました。

0

Raymond Chen explainsなぜそれが不可能なのですか?明らかに、ヘッダーをプリコンパイルするときにVisual Studioコンパイラがこれを行うので、すべてのMicrosoftエンジニアがこれを読んでいるわけではありません。最初にヘッダーをコンパイルした後、自身の状態をダンプし、自身を復元して続行します。

+1

陳氏は正しい、間違っています。外部プロセスのリソースがなくなるのは不可能です。これは起こる必要はありません。プロセス外のリソースを保護しながらプロセスを完全に停止することができます。再起動しても元の状態に戻ることはできませんが、ここで必要なことは必ずしも必要ではありません。 – paxdiablo

+0

CPUを多用する作業をしている間にプロセスを完全に1時間停止する機能は、依然として貴重です。その後、そのプロセスを再開するだけです。 SIGSTOP/SIGCONTは既にUNIXなどでこれを行っています。 – paxdiablo

+0

実際には、アイドル状態に優先順位を下げるだけで十分です。最後のコアの最後の数%を使用しても害はありませんが、多くの並列アルゴリズムは、特にツリー全体で完全な並列処理を維持できません。 – MSalters

1

"Persist (hibernate!) a process state to disk for quiker loading"(SIC)から引用:

Q.このスワップがどのように働いてプロセス状態がディスクに保存され、必要に応じて再利用できるようにすることができますか?」

A.ページファイルは、ディスク上の特別な場所です。 このよう プロセスが実行して再開します。高度に最適化された方法で保存され、システムが自動的にバック メモリにそれを読み取り、それはちょうどそれがあった場所から続けています。それは プログラムは、iPad上で実行する方法の一種である:)

すべてこの機能 プロセスが実行されている間、システムはメモリが またはpaのいずれかであることを確認しますあなたは を無視することができますが、いくつかの例外があります。

つまり、Windowsはすでにプロセスをページファイルに休止させることができます。レイモンド・チェンからの@MSaltersの引用「explaining why its impossible」は単に間違っている。

+1

ページアウトされたプロセスの簿記は、依然としてRAM(カーネル)に存在することに注意してください。そのウィンドウハンドルは有効なままです。ページを戻すなどのメッセージを送ることができます。そのため、これは一般にプロセスの休止状態とはみなされません。 – MSalters

関連する問題