※ ChatGPTを利用し、要約された質問です(原文:Windowsの仮想メモリシステムについて)
このQ&Aのポイント
Windowsの仮想メモリシステムについての質問内容と解釈について解説します。
Windowsの仮想メモリシステムにおける物理メモリ、仮想メモリ領域、ページファイル、コミットページ、ワーキングセットページの役割と関係について説明します。
C++プログラムにおいて、約2000MBのメモリが割り当てられた場合、タスクマネージャや専用ソフトに表示されるメモリ使用量の差異について考察します。
こんにちは。
OSは現在、WindowsVistaと、Windows7を使っています。
こういったWindows系OS全てに共通している、仮想メモリなどのメモリ関係の用語について、かなり詳しく調べたのですが、最近、それらをきちんと理解できていない事に気づきましたので、今回の質問をさせて頂きます。
まず僕は、メモリ関係の各用語について、以下のように解釈しています。
----------------------------------------------------------------------------------
●物理メモリ
基本的にはRAM上にあるメモリの事であり、OSによってアクセスされる。
OSは起動後、各物理メモリに、物理アドレス(物理アドレス空間におけるアドレス)を割り当てる。
●仮想メモリ領域
仮想メモリ領域は、各プロセスが、メモリを使うためにアクセスするアドレス空間の事であり、物理メモリと、次で説明するページファイルで構成されてる。
現在のWindows系OSでは、プロセスが起動すると、そのプロセスとセットになる、4GBの仮想メモリ領域 (仮想アドレス空間とも呼ばれる) が割り当てられ、実行するプログラムコードと、そのコードが参照して操作するデータが、そこにマップされる。
プロセスの持つ仮想メモリ空間4Gバイトの内、ユーザが使用可能なメモリ領域は、下位2Gバイトであり、上位2Gバイトはシステムによって使用される、「カーネルメモリ」となる。
OSと、コンピュータ上の専用のハードウェアコンポーネントは、プロセスが使用している仮想アドレスを、物理アドレスに変換する処理を行っている。
Windowsの場合、仮想メモリの各フラグメントを、「ページ」といい、サイズは通常 4KB である。
●ページファイル
物理メモリの不足を補うために、HDDに用意されたメモリ領域の事である。
デフォルトではC:\pagefile.sys というファイルが、ページファイルとなっている。
これによって、RAM容量よりも大きなサイズの、仮想メモリ空間を利用することができる。
ページファイル上に置かれたページにアクセスするには、そのページをRAM上に読み込まなければならないため、現在使われていないRAM上のページとの入れ替えが、OSによって行われる。
このとき、RAM上の不要なページをページファイルに書き出し、RAMから消去することを「ページアウト」あるいは「スワップアウト」と呼び、必要なページをページファイルから読み出し、RAM上に配置することを「ページイン」あるいは「スワップイン」という。
●コミットページ(コミットチャージ)
プロセスに割り当てられた、使用可能な仮想メモリページ全てを表す。
これには、RAMからページアウトされたメモリページも含まれまれる。
コミットページの合計サイズと現在使用中のサイズは、タスクマネージャのパフォーマンスタブにある[ページファイル]の部分で確認できる。
この[ページファイル]という部分は、上で説明したページファイルの事ではなく、
RAMとページファイルの両方に存在している、メモリページのサイズを意味する。
●ワーキングセットページ
プロセスから最も頻繁かつ直近にアクセスされる、常にRAM上にあるメモリページの事である。
ワーキングセットページには、そのプロセスしか使えない部分(プライベートワーキングセット)と、他のプロセスと共有可能な部分がある。
共有可能なワーキングセットは、他のユーザープロセスで、物理メモリが不足し始めた場合に使用できる。
-----------------------------------------------------------------------------------
まず、以上の解釈で、おかしいと思う部分がありましたら、どしどし突っ込んで下さい。
次に、以下のようなコードブロックを含む、C++プログラムを作成して実行しました。
------------------------------------------------------------
char *p;
for(int i=1; i<=2000 ; i++)
p=new char[1024*1024];
------------------------------------------------------------
このコードブロックは、pというポインタに対し、1024×1024B = 1MB のメモリの割り当て作業を、2000回行います。
つまり、このプログラムをビルドして作成された、a.exeという実行ファイルを実行すると、
約2000MBのメモリがa.exeに割り当てられるという事が予想できます。
プログラムの実行中に、タスクマネージャのプロセスタブにある、a.exeの行を見ていると、
メモリに関する列項目値は、
コミットサイズ:2012.928KB=1965.75MB
ワーキングセット:4616KB=4.51MB
プライベートワーキングセット(a.exeしか使えないワーキングセット):2656KB=2.59MB
となっていました。
ワーキングセットページのサイズが4.51MBとしかない事から、約2000MBのメモリの割り当ての大半は、RAM上にはないメモリページ、つまりページファイル上のメモリページを使って行われたのだと、僕は思いました。
ところが、ページファイル上のメモリページの使用量を、専用のソフトで調べてみると、
a.exeの実行前から全く変化していなかったので、実際はページファイル上のメモリページを使用しなかったのだという事になります。
では一体、どこにあるメモリページが、a.exeで使用されたのかという事になります。
この件について、皆さんはどう思われるでしょうか?
長くなりましたが以上です。
何か御存じの方がいらっしゃれば、是非、アドバイスして頂きたく思います。
では、よろしくお願い致します。
お礼
御回答ありがとうございます。 アドレスバスやMMUなど、知らない言葉が出てきて、 まだまだ理解が甘かったという事が分かりました。