開いているプログラムが多数あり、マシンのメモリ/CPU 使用率が高すぎる場合は、状態を失わずにプログラムを閉じて (仮想メモリに送信して)、後でプログラムを再開するとよいかもしれません。これは OS によって自動的に行われますが、OS はプログラムを一時停止する時間を把握していないため、各プログラムの一部をメモリ上に保持し、他の部分を仮想メモリにスワップしようとするため、最終的には非常に遅くなります。プログラム全体を手動で仮想メモリに送信し、必要なときに同じ状態で取得できれば便利な機能ですが、これを行うツールはありますか? または、作成できますか?
答え1
プログラムは常に仮想メモリ内で実行されます。(ページファイルのサイズを設定するダイアログ内の Windows の用語は、非常に誤解を招くものです。)
求めているのは、プログラムを強制的にページアウトする機能です。これを直接行う方法はありません。
そのため、すべてのプログラムの一部をメモリ上に保持し、他の部分を仮想メモリにスワップしようとすると、最終的には非常に遅くなります。
そんなことは起こりません。アクセスされていないメモリ ページは、常に他の用途に解放できます (必要に応じてディスクに書き込まれます)。OS は、アクセスされているかどうかに関係なく、すべてのプログラムの一部をメモリに保持しようとはしません。アクセスされていない場合 (アイドル プログラムのプライベート ページの場合は通常そうなります)、他のプログラムのニーズによって負荷がかかるまでメモリに保持されます (それまではページ アウトしても意味がありませんよね)。
Windows XP では、アプリのウィンドウを最小化するとワーキング セットが強制的に消去されますが、これが当てはまるのは XP が最後だったと思います。
ただし、本当にこれを実行したい場合は、VMmap
SysInternals のツールを使用できます。起動すると、プロセスを選択するように求められます。それを選択してから、[表示] | [空のワーキング セット] を選択します。
ただし、これによって解放されるのは、変更されたページ リストまたはスタンバイ ページ リストのみであることに注意してください (他のプロセスのワーキング セットに含まれていないページのみ)。変更されたリストにドロップされたページは、ページ ファイルに書き込まれ、スタンバイ リストに移動されます。スタンバイ リストにあるページは「使用可能」と見なされますが、他の用途に再利用されるまで、元のプロセスの内容が保持されます。
最終的な結果は、使用可能なメモリに圧力がある場合に Windows が行うこととまったく同じです。つまり、そのような要求が実際に発生する前により早く実行するだけです。
詳細は、もちろん、Windows 内部ソロモン、ルッシノビッチ、イオネスク著。