Open棟梁Project - マイクロソフト系技術情報 Wiki
目次 †
概要 †
物理メモリのライフサイクルについて説明する。
※ 仮想メモリ管理とは別です。
物理メモリの割当・解放 †
- システムの起動時には、全てのメモリが未使用ページリスト(Free Page List)に入れられている。
- Windowsではゼロページスレッドが、未使用ページリストをゼロページリスト(Zero Page List)に入れる。
- プロセスは開始時に、ゼロページリストから必要なページのみを取得し、ワーキングセットを作る。
- プロセスの終了時には、ワーキングセットが未使用ページリスト(Free Page List)に戻される。
※ ゼロページスレッドによるゼロページ化はメモリ・スキャベンジ防止のセキュリティ対策のため。
割当 †
プロセスが(仮想記憶上で)メモリ割当を行った場合、
解放 †
プロセスが(仮想記憶上で)メモリ開放を行った場合、
ワーキングセットとスタンバイリスト †
ワーキングセット †
各プロセスに割り当てられる物理メモリ。
- 各々のプロセスは、ワーキングセットと呼ばれるメモリページの集合を保持している。
- ワーキングセットは、常に物理メモリ上に割り当てられるメモリページ群である。
- ワーキングセットは、物理メモリのことなので、仮想メモリとは直接関係はない。
- 最小ワーキングセットサイズ ≦ ある瞬間の実際のワーキングセット ≦ 最大ワーキングセットサイズ
- ワーキングセットに含まれるメモリページの数は
システムによって動的に変化するが、上限と下限が定められている。
この上限と下限はSetProcessWorkingSetSize?関数によって指定可能である。
- プロセスがメモリ割り当てを行うと、システムはこのワーキングセットから
未使用のページを探し、これをメモリ割り当てに使用する。
- このため、ワーキングセットに関するカウンタは物理メモリのOSによる管理状況を確認するために利用する。
※ アプリケーションによるメモリ使用量(仮想メモリの使用量)を確認する用途に使用するのは適切ではない。
プライベート ワーキングセット †
ワーキングセットのうち、他のプロセスと共有できない(DLL、MMFを除く)メモリ ページのセット。
システム ワーキングセット †
システムに割り当てられる物理メモリ。≒ (ファイル)システムキャッシュ
- システム キャッシュ ページ
Memory\System Cache Resident Bytes
- ページ プール
Memory\Pool Paged Resident Bytes
- Ntoskrnl.exe 内のページング可能なコードとデータ
Memory\System Code Resident Bytes
- デバイス ドライバ内のページング可能なコードとデータ
Memory\System Driver Resident Bytes
- システム マップドビュー
・・・
スタンバイリスト †
スタンバイリストは利用可能なページを溜め込んでいるリスト的なもの。
- トリミング
ワーキングセットのサイズが過剰と判断された場合、
アイドル時間が最も長いワーキングセットのページがスタンバイリストに移動させられる。
- 長時間プロセスがメモリ割り当てを行わない場合、スタンバイリストのページは自動的に破棄される。
通常のスタンバイリスト †
スタンバイリストは、プログラムによって書き換えられていないページ。
変更済みページリスト †
変更済みページリストは、プログラムによって書き換えられたページであり、
ページングファイル(ディスク)に書き込まれた後に、スタンバイ リストを経由してでないとワーキングセットに戻せない。
ページ フォールト †
ハード ページ フォールト †
ワーキングセット中に未使用のメモリページが存在せず、メモリページの個数が上限に達している場合、ワーキングセットからメモリページを取り除き、取り除いたメモリページを必要に応じてページングファイルにスワップアウトし、新たに物理メモリ上のメモリページを割り当て、ワーキングセットに追加する。
ソフト ページ フォールト †
また、利用中のワーキングセットのページがトリミングによりスタンバイリストに移動させられた際に、プロセスがこれらのページにアクセスした場合、ページは、ワーキング セットへ "ソフト ページ フォールト" で戻される。これは"ハード ページ フォールト"と比べるとディスク アクセスを必要としないので非常に高速である。
ツール †
物理メモリのページ確認 †
Windbgの以下のコマンドで確認できる。
0: kd> !memusage
loading PFN database
loading (100% complete)
Compiling memory usage data (99% Complete).
Zeroed: 173816 (695264 kb)
Free: 0 ( 0 kb)
Standby: 71317 (285268 kb)
Modified: 1387 ( 5548 kb)
ModifiedNoWrite: 561 ( 2244 kb)
Active/Valid: 145881 (583524 kb)
Transition: 16 ( 64 kb)
Unknown: 0 ( 0 kb)
TOTAL: 392978 (1571912 kb)
(ファイル)システムキャッシュのサイズ設定 †
以下の様なツールも存在する。
参考 †