web-dev-qa-db-ja.com

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

開いているプログラムが多数あり、マシンのメモリ/ CPU使用率が高くなりすぎている場合は、状態を失うことなくプログラムを閉じて(仮想メモリに送信)、後でプログラムを再開することをお勧めします。これはOSによって自動的に実行されますが、OSはプログラムを一時停止する時間を認識しないため、すべてのプログラムの一部をメモリに保持し、他の部分を仮想メモリに交換しようとすると、最終的には非常に遅くなります。プログラム全体を手動で仮想メモリに送信し、必要に応じて同じ状態で取得するのは素晴らしい機能ですが、これを行うためのツールはありますか?またはそれを書くことができますか?

2

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

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

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

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

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

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

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

最終的な結果は、使用可能なメモリにプレッシャーがかかった場合にWindowsが実行することとまったく同じです。そのような要求が実際に存在する前に、より早く実行しているだけです。

完全な詳細はもちろん、Solomon、Russinovich、およびIonescuによるWindows Internalsのメモリ管理の章にあります。

4
Jamie Hanrahan