全4337文字

 Windowsの内部構造を詳細に解き明かす定番書籍「インサイドWindows」。1992年の初版発行以来(初版の訳書は1993年発行)、Windowsに接するすべてのITエンジニアのバイブルとして永く読み継がれてきました。最新刊の第7版は、2017年5月に上の原書が発行され(訳書の発行は2018年5月、山内和朗訳)、約4年の歳月を経て2021年10月に下の原書が発行されました(訳書の発行は2022年9月、山内訳)。

 第7版完結を機に、「インサイドWindows」の読みどころを、上(第1章~第7章)と下(第8章~第12章)から抜粋してお届けします。今回は第5章(上)からの抜粋で、Windowsのメモリマネージャーについて取り上げます。(日経BOOKSユニット第2編集部)

第5章 メモリ管理

 この章では、Windowsがどのように仮想メモリを実装し、物理メモリ内で仮想メモリのサブセットがどのように保持されるのかを学びます。この章ではまた、メモリマネージャーを形作っている内部構造とコンポーネントについて説明します。これには、主要なデータ構造体とアルゴリズムが含まれます。

 これらのメカニズムについて調べていく前に、メモリマネージャーによって提供される基本的なサービスと、予約済みメモリ、コミット済みメモリ、共有メモリなど、主要な概念についておさらいしておきましょう。

5.1 メモリマネージャーの概論

 既定では、32ビットバージョンのWindowsにおける1つのプロセスの仮想メモリサイズは2GBです。実行可能イメージがLARGEADDRESSAWARE(大きいアドレスの処理)として特別にマークされており、システムが特別なオプション(本書『インサイドWindows 第7版 上』のこの章の「5.5.1 x86アドレス空間レイアウト」の項を参照)でブートされた場合、32ビットプロセスは32ビット版Windows上で最大3GB、64ビット版Windows上で最大4GBまで拡張することが可能です。

 64ビットバージョンのWindows 8およびWindows Server 2012のプロセスの仮想アドレス領域のサイズは8192GB(8TB)であり、64ビット版Windows8.1以降およびWindows Server 2012 R2以降は128TBです。

 本書の「第2章 システムアーキテクチャ」で見てきたように、Windowsで現在サポートされる最大の物理メモリ容量は2GB(Windows 7 Starter)から24TBであり、そのサイズはWindowsのバージョンとエディションに依存します。仮想アドレス領域はコンピューター上の物理メモリよりも大きくまたは小さくなることがあるため、メモリマネージャーは次の2つの主要な役割を持ちます。

  • プロセスの仮想アドレス領域を物理メモリに変換またはマッピングし、そのプロセスのコンテキストで実行中のスレッドが仮想アドレス領域を読み書きするときに、正しい物理アドレスが参照されるようにします(物理メモリに常駐するプロセスの仮想アドレス領域のサブセットはワーキングセットと呼ばれます。ワーキングセットについては、この章の「5.12 ワーキングセット」の節で詳しく説明します)。
  • オーバーコミットされたとき、つまり、実行中のスレッドが現在利用可能な物理メモリよりも多くを使用しようとしたとき、メモリの内容の一部をディスクにページングします。その内容が必要になったとき、再び物理メモリに読み戻します。