Skip to content

MS_PhysicalMemoryManagement

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

物理メモリ管理

概要

物理メモリのライフサイクルについて説明する。
仮想メモリ管理とは別です。

物理メモリの割当・解放

  • システムの起動時には、全てのメモリが未使用ページリスト(Free Page List)に入れられている。
  • Windowsではゼロページスレッドが、未使用ページリストをゼロページリスト(Zero Page List)に入れる。
  • プロセスは開始時に、ゼロページリストから必要なページのみを取得し、ワーキングセットを作る。
  • プロセスの終了時には、ワーキングセットが未使用ページリスト(Free Page List)に戻される。

※ ゼロページスレッドによるゼロページ化はメモリ・スキャベンジ防止のセキュリティ対策のため
(前のプロセスが使っていた内容が、別プロセスから読めてしまわないようにするため)。

割当

プロセスが(仮想記憶上で)メモリ割当を行った場合、

  • 可能ならばスタンバイリストのページをワーキングセット中に移動し利用する。
  • (恐らく)無ければゼロページリストから必要なページのみを取得し、ワーキングセット中に移動し利用する。

解放

プロセスが(仮想記憶上で)メモリ開放を行った場合、

  • ワーキングセット中のメモリページがすぐに破棄されるわけではない。
  • この場合、メモリページはワーキングセットからは取り除かれ、スタンバイリストに追加される。

ワーキングセットとスタンバイリスト

トリミング

ワーキングセットをスタンバイリストに移動する Windows OS の物理メモリ管理の動作を指す。

ワーキングセット

各プロセスに割り当てられる物理メモリ。

  • 各々のプロセスは、ワーキングセットと呼ばれるメモリページの集合を保持している。
  • ワーキングセットは、常に物理メモリ上に割り当てられるメモリページ群である。
  • ワーキングセットは、物理メモリのことなので、仮想メモリとは直接関係はない。
  • 最小ワーキングセットサイズ ≦ ある瞬間の実際のワーキングセット ≦ 最大ワーキングセットサイズ
  • ワーキングセットに含まれるメモリページの数はシステムによって動的に変化するが、
    上限と下限が定められている。この上限と下限は SetProcessWorkingSetSize 関数によって指定可能である。
    ※ 内部動作に影響を与え、システム全体の性能に影響するため慎重に使用すること。
  • プロセスがメモリ割り当てを行うと、システムはこのワーキングセットから
    未使用のページを探し、これをメモリ割り当てに使用する。
  • このため、ワーキングセットに関するカウンタは物理メモリのOSによる管理状況を確認するために利用する。
    ※ アプリケーションによるメモリ使用量(仮想メモリの使用量)を確認する用途に使用するのは適切ではない。

補足: 「アプリのメモリ使用量」を見たい場合は、 ワーキング セット(物理メモリ)ではなく プライベート バイトProcess(*)\Private Bytes、コミット済みの仮想メモリ)を見るのが定石。 ワーキング セットは OS の都合(他プロセスからの圧力など)で増減するため、 リークの判定には使えないパフォーマンス カウンタを参照。

プライベート ワーキングセット

ワーキングセットのうち、他のプロセスと共有できない(DLL、MMF を除く)メモリ ページのセット。

システム ワーキングセット

システムに割り当てられる物理メモリ。≒ (ファイル)システムキャッシュ

  • システムキャッシュとは使用されていないメモリをキャッシュ領域として使用するスタンバイリストの仕組み。
  • スタンバイ リスト(変更済みページリストを含む)が実質的にシステムキャッシュとなる
    (ソフト ページ フォールトを伴う)。
  • システム キャッシュ(システム ワーキングセット)は、次の 5 種類のワーキングセットが
    合計されたサイズになる。パフォーマンス ログでは Memory\Cache Bytes カウンタを確認する。
内訳 カウンタ
システム キャッシュ ページ Memory\System Cache Resident Bytes
ページ プール Memory\Pool Paged Resident Bytes
Ntoskrnl.exe 内のページング可能なコードとデータ Memory\System Code Resident Bytes
デバイス ドライバ内のページング可能なコードとデータ Memory\System Driver Resident Bytes
システム マップドビュー

スタンバイリスト

スタンバイリストは利用可能なページを溜め込んでいるリスト的なもの。

  • ワーキングセットのサイズが過剰と判断された場合、トリミングにより、
    アイドル時間が最も長いワーキングセットのページがスタンバイリストに移動させられる。
  • 長時間プロセスがメモリ割り当てを行わない場合、スタンバイリストのページは自動的に破棄される。

通常のスタンバイリスト

スタンバイリストは、プログラムによって書き換えられていないページ。

変更済みページリスト

変更済みページリストは、プログラムによって書き換えられたページであり、
ページングファイル(ディスク)に書き込まれた後に、
スタンバイ リストを経由してでないとワーキングセットに戻せない。

※ タスク マネージャーの「メモリ」タブに出る
「使用中」「変更済み」「スタンバイ」「空き」は、ここで説明しているリストにそのまま対応する。
「スタンバイ」は実質的に空きに近い(必要になれば即座に再利用される)ため、
「空き」が少ないこと自体はメモリ不足を意味しない。

ページ フォールト

ハード ページ フォールト

ワーキングセット中に未使用のメモリページが存在せず、メモリページの個数が上限に達している場合、
ワーキングセットからメモリページを取り除き、取り除いたメモリページを必要に応じて
ページングファイルにスワップアウトし、新たに物理メモリ上のメモリページを割り当て、
ワーキングセットに追加する。

ソフト ページ フォールト

また、利用中のワーキングセットのページがトリミングによりスタンバイリストに移動させられた際に、
プロセスがこれらのページにアクセスした場合、ページはワーキング セットへ
"ソフト ページ フォールト" で戻される。
これは "ハード ページ フォールト" と比べるとディスク アクセスを必要としないので非常に高速である。

※ 性能問題の切り分けでは Memory\Page Reads/sec(ハード) を見る。
Page Faults/sec はソフトを含むため、値が大きくても問題とは限らない。

物理メモリ確認ツール

物理メモリのページ確認

WinDbg の以下のコマンドで確認できる。

0: kd> !memusage
             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)

tasklistとtaskmgrの違い

  • tasklist
    • /fo csv/fo list で取得できる Mem Usage は「ワーキングセット
    • ワーキングセットは、プロセスが現在物理メモリ上に持っているページのサイズを表す。
  • taskmgr
    • 「メモリ」列はデフォルトでは「プライベート ワーキングセット」で、
      共有メモリは含まれない。
    • 「詳細」タブで「ワーキング セット (メモリ)」列を追加すれば、tasklist と同じ値に近づくが、
      合計メモリは差が残る。

※ その他、tasklist では各プロセスに重複して含まれることがあり、
OS やカーネルで使っているメモリが含まれないなどの違いがある。

(ファイル)システムキャッシュのサイズ設定

以下の様なツールも存在する。

参考


Tags: Windows, メモリ管理, 障害対応, デバッグ

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally