Windows でプログラムを仮想メモリに手動で送信することは可能ですか?

Windows でプログラムを仮想メモリに手動で送信することは可能ですか?

開いているプログラムが多数あり、マシンのメモリ/CPU 使用率が高すぎる場合は、状態を失わずにプログラムを閉じて (仮想メモリに送信して)、後でプログラムを再開するとよいかもしれません。これは OS によって自動的に行われますが、OS はプログラムを一時停止する時間を把握していないため、各プログラムの一部をメモリ上に保持し、他の部分を仮想メモリにスワップしようとするため、最終的には非常に遅くなります。プログラム全体を手動で仮想メモリに送信し、必要なときに同じ状態で取得できれば便利な機能ですが、これを行うツールはありますか? または、作成できますか?

答え1

プログラムは常に仮想メモリ内で実行されます。(ページファイルのサイズを設定するダイアログ内の Windows の用語は、非常に誤解を招くものです。)

求めているのは、プログラムを強制的にページアウトする機能です。これを直接行う方法はありません。

そのため、すべてのプログラムの一部をメモリ上に保持し、他の部分を仮想メモリにスワップしようとすると、最終的には非常に遅くなります。

そんなことは起こりません。アクセスされていないメモリ ページは、常に他の用途に解放できます (必要に応じてディスクに書き込まれます)。OS は、アクセスされているかどうかに関係なく、すべてのプログラムの一部をメモリに保持しようとはしません。アクセスされていない場合 (アイドル プログラムのプライベート ページの場合は通常そうなります)、他のプログラムのニーズによって負荷がかかるまでメモリに保持されます (それまではページ アウトしても意味がありませんよね)。

Windows XP では、アプリのウィンドウを最小化するとワーキング セットが強制的に消去されますが、これが当てはまるのは XP が最後だったと思います。

ただし、本当にこれを実行したい場合は、VMmapSysInternals のツールを使用できます。起動すると、プロセスを選択するように求められます。それを選択してから、[表示] | [空のワーキング セット] を選択します。

ただし、これによって解放されるのは、変更されたページ リストまたはスタンバイ ページ リストのみであることに注意してください (他のプロセスのワーキング セットに含まれていないページのみ)。変更されたリストにドロップされたページは、ページ ファイルに書き込まれ、スタンバイ リストに移動されます。スタンバイ リストにあるページは「使用可能」と見なされますが、他の用途に再利用されるまで、元のプロセスの内容が保持されます。

最終的な結果は、使用可能なメモリに圧力がある場合に Windows が行うこととまったく同じです。つまり、そのような要求が実際に発生する前により早く実行するだけです。

詳細は、もちろん、Windows 内部ソロモン、ルッシノビッチ、イオネスク著。

関連情報