新しいプロセスが作成されると、そのプロセスに関連付けられた仮想アドレス空間が存在することを知っています。その仮想アドレス空間は、仮想メモリ ページに配置され、物理メモリ内のメモリ ページに不連続な方法でマップされます。
私の質問は:
スレッドが変数に値を格納したりスペースを割り当てたりすると、仮想メモリに格納/割り当てられますが、それらの変更は同時に物理メモリに書き込まれますか?
要するに、はい。
メモリに対して読み書きできるようにするには、仮想アドレスを物理メモリにマップする必要があります。そのため、変数への書き込みは常に物理メモリによってサポートされます (キャッシュによる遅延が発生する場合がありますが、これは物理対仮想とは関係ありません)。書き込み時にメモリが現在マップされていない場合、ページ フォールトが発生し、OS が介入して物理メモリをマップできるようになります。
メモリをマップする必要がある場合は、「スタンバイ」リストから取得できます。これは、メモリが既に物理メモリにあり、OS がそれを接続する必要があることを意味します (a soft fault
)。または、ディスクからメモリを読み取る必要がある場合があります (別名 a hard fault
)。これは、ページファイル、メモリ マップ ファイル、またはバイナリ ファイルの内容から取得できます。
編集 - メモリ リストとページ フォールトの明確化:
ゼロ リスト これらは、解放され、ゼロに設定された物理メモリのページです。アプリケーションがより多くのメモリを割り当てると、OS は最初にこのメモリ プールからプルします (利用可能な場合)。これらをプロセスのアドレス空間にマッピングすることは、ソフト フォールトです。
フリー リスト これらは、OS がスクラブ処理中で、ゼロ リストに貼り付けようとしている物理メモリのページです。
Standby List
Windows は、他の誰かがより多くのメモリを必要とする可能性がある場合に備えて、定期的に仮想メモリからメモリのマップを解除します。逆に、Zero List に大量のメモリがある場合、アプリケーションが再び必要とする可能性が高いメモリのページを見つけて、メモリにプリロードします。これらのページはすべてStandby
リストに保存されます。それらはどのアプリケーションにも割り当てられず、より多くのメモリが突然必要になるアプリケーションがある場合、スクラブされて再割り当てされる傾向があります。
実行perfmon.exe /res
して「メモリ」タブをクリックし、さまざまなリストに関連付けられている量を確認します。多くの場合、Windows はスタンバイ リストにかなりの量のメモリを保持することを好みます。
ソフト フォールト アプリケーションがメモリを割り当てたり、OS が盗んだりプリロードした (そしてスタンバイ リストに置かれた) メモリに読み書きしたりする場合、OS がプロセスに割り当てるのは非常に簡単です。ソフトフォールトは安価です。
ハード フォールト 必要なメモリが物理メモリのどこにもない場合、ハード フォールトが発生し、OS はある種のストレージ デバイスからそれを「ページング」する必要があります。これは通常遅く、開発者がパフォーマンス チューニングの際に懸念する可能性があることです。
コメントに答えるに
は 通常、メモリを割り当てると、OS がゼロ リストから取得し、スタンバイ リストからスチールして要求を満たすため、ソフト フォールトが発生します。物理メディアから読み取る必要がないため、ハード フォールトは発生しませんでした。
メモリを割り当てると、OS は後でそのメモリをスタンバイ リストにプッシュする場合があります。再度参照すると、アドレス空間に戻すためのソフト フォールトが発生します。他の誰かがメモリを必要とした場合、OS はそのメモリをページ ファイルにフラッシュできます (データの書き込みは「障害」ではありません)。そのメモリ アドレスを再度参照すると、ハード フォールトが発生し、ページが読み取られてアドレス空間にマップされます。