こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Windowsの仮想メモリシステムについて

こんにちは。

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で使用されたのかという事になります。
この件について、皆さんはどう思われるでしょうか?

長くなりましたが以上です。
何か御存じの方がいらっしゃれば、是非、アドバイスして頂きたく思います。
では、よろしくお願い致します。

投稿日時 - 2011-11-10 17:11:35

QNo.7125058

困ってます

質問者が選んだベストアンサー

物理メモリは、CPUが持つアドレス バスに接続されているメモリでRAM限定ではない。
物理アドレスは、アドレス バスの信号値と1対1の関係にあって、OSによって変更できない。

論理アドレスは、CPUが持つMMU機能によって実現されているもので、仮想記憶の基底。
プロセス等毎に独立したアドレス空間を割り当てられている。

仮想メモリは、MMU機能が持つページ機能によってメモリをページ単位で任意の物理アドレスに割り当てたり、内容を他の記憶媒体に追い出して割り当てを解除したりしている実現されている。
OSによって管理されている。

ページファイルは、仮想メモリから退避させられる内容の保存先。

そのプログラムはメモリの予約をしているだけですね。
Windowのバージョンによっても挙動が変わるはずです。

投稿日時 - 2011-11-10 23:23:19

お礼

御回答ありがとうございます。

アドレスバスやMMUなど、知らない言葉が出てきて、
まだまだ理解が甘かったという事が分かりました。

投稿日時 - 2011-11-12 14:24:32

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

かなり技術的な内容なのでこちらのカテゴリーよりプログラミング関連の方が回答がつきやすいと思います。

一つ質問なのは確保したメモリに適当な値を代入しても同じ結果になりますか?
------------------------------------------------------------
#include <stdio.h>
#include <algorithm>

char *p;
for(int i=1; i<=2000 ; i++){
p=new char[1024*1024];
std::fill(p, p+1024*1024, 0);
}
}
------------------------------------------------------------

投稿日時 - 2011-11-10 20:03:22

お礼

u-botさん

はじめまして、御回答ありがとうございます。
御提示頂いたプログラムは、2000MB分の文字を、pに割り当てたメモリ領域に書き込むというものですね。
書き込みが終了した時点で、もう一度タスクマネージャを見ると、
ワーキングセットとプライベートワーキングセットの値が、一気に2000MBくらい上昇し、コミットチャージとほぼ同じ値になっていました。
(ワーキングセットの値は、コミットチャージの値を少し上回りました。)
また、タクスマネージャのパフォーマンスタブで見る事ができる、物理メモリの使用量の合計も、一気に2000MBくらい上昇しました。
この事から、プログラムに割り当てたメモリ領域に対して、データの読み書きが行われない限り、物理メモリは使用されないのだという事が分かりました。

ありがとうございました。

投稿日時 - 2011-11-10 21:34:13

あなたにオススメの質問