2GB制限ってほんとなの?

32bitOSのメモリ使用可能上限とか、マイクロソフトのOSの場合はとか、ServerOSの場合はとか、
ほんと、どっかに正確な情報が整理されているところはないのだろうか?

ファイルシステムにより1ファイルのファイルサイズ制限があったり、ハードディスクの容量の壁があったりと、
世の中の技術が進歩しすぎて、以前は気にしなくても良かったことが気にしなくてはならなくなって、うれしいのか悲しいのか
ほんとわけわからん状況です。

 


そもそもの発端は、現在 Windows Vista Ultimate 64bit SP2 で 32bitアプリケーション(DirectXを使用)のゲームを使用しており、物理メモリは4GBを搭載しているのですが、実際にはこのアプリケーションがどこまでメモリを使用するのか?という疑問からです。
今後、PCを買い換えることを考えるとWindows 7でCore i7、メモリ6GB以上搭載したりするのも普通に選択肢としてあるわけで、そのときにメモリを多く搭載するメリットが如何ほどなのか?というのにも関係しています。
ゲームが64bitネイティブで動作してくれれば良いのでしょうが・・・64Bitネイティブで動作するゲームタイトルが主流になる日はまだまだ先のようです。

今回の悩みは、「1つの32bitアプリケーションが使用できるメモリの上限」です。
これに関しての疑問点は以下の1~4です。
1.1つの32bitアプリケーションが使用できるメモリの上限
2.その上限は何できまるのか?
3.上限の緩和をする方法はないのか?
4.64bitOSで32bitアプリケーションを実行しても、1~3は同じなのか?

前提とするOSは、マイクロソフト社のWindows Vista/XP/7 とします。

ひとつひとつ正確に調査することにしました。
正確に・・・となるとやっぱり技術文書を読まなくてはいけないわけですが、それらしいものが入手できる先は、マイクロソフト社のサイトでしょう。

1.物理メモリ
こちらのサイトに記載されています。

2.仮想メモリ
こちらのサイトに記載されています。

3.OSバージョン、デストリビューションごとの物理メモリと仮想メモリの上限
Memory Limits for Windows Releasesとして、こちらのサイト(英語)にまとめられています。


OS上では、4GB(2の32乗)、カーネルとプロセスで1:1に均等で割り振られるため、プロセスは2GBとなる。
そのため、32bitアプリケーション(プロセス)の仮想メモリ使用量は、通常2GB
32bitOS上では、LARGEADDRESSAWAREモードにより、1:3にすることができるため、上限が3GBにできる。
64bitOS上では、LARGEADDRESSAWAREモードにより、0:4にすることができるため、上限が4GBにできる。
64bitOS上で64bitアプリケーションを動作させる場合は、LARGEADDRESSAWAREモードにより、上限が8TBにできる。

PAE(物理アドレス拡張)モードがサポートされているのは以下、x86-32bitのみ。x64には不要。

  • Windows 7 (32 bit only)

  • Windows Server 2008 (32-bit only)

  • Windows Vista (32-bit only)

  • Windows Server 2003 (32-bit only)

  • Windows XP (32-bit only)

  • Windows 2000 Datacenter Server

  • Windows 2000 Advanced Server

ただし、OSだけでなくアプリケーションもPAE(物理アドレス拡張)モードがサポートが必須。

要約すると
物理メモリを使用する(制御する)にはアドレスを指定してアクセスできないといけないわけで、32bitではメモリ容量でいうと約4GB分が上限になる。
PCに搭載しているマザーボードやその他周辺機器に使われるメモリにもアクセスできないといけないのでその分が差し引きされると残っている分は約3.2GB程度になる。
これはPCの構成により前後する。
一時期のWindows OSでは残っている分のメモリ容量が表示されていたので物理メモリを4GB搭載していても3.2GB程度の表示になっていた。
今は、物理メモリ搭載容量が表示されるようになっている。残りの物理メモリはなんらかわらないので利用できるメモリが増えたわけではない。

仮想メモリは、プロセスごとに4GBまで利用できるが、カーネルモードとユーザーモードで1:1に割り振るため通常のプログラム(バイナリー)は半分の2GBが上限になる。
仮想メモリはハードディスクなどの記憶デバイスが利用されるが、計算時(実処理)では物理メモリにロードされ不要になればアンロードされる。
物理メモリの制御はメモリコントローラが担い、OSごとに最適化の手法は異なる。
そのため、物理メモリ使用量が常に100%だからといって、メモリ不足というわけではない。
ハードディスクより高速な物理メモリをフルに活用しているといえ、リソースを無駄なく利用している状態と思えばよい。

物理メモリが不足している状態の例として、スワップイン-スワップアウトを頻繁に繰り返し、ディスクアクセスが異常に発生している状態がある。

以上、32bitOSでは32bitアドレッシングによって容量約4GB分のメモリにしかアクセスできない。

64bitOSでは64bitアドレッシングになるのでWindowsクライアントOSでは128GBまでアクセス可能。(Windows7 Ultimate)
注意が必要なのは、マザーボードが認識できるメモリ上限。いくらOSが64bitだからといってもマザーボード(CPU、チップセット、BIOS)で搭載するメモリ容量をサポートしていなければだめ。
※ソフトがサポートしていてもハードがサポートしていないと少ないほうが上限になる。

ただし、32bit時代に開発されているプリケーション(プログラム)は32bitAPIを利用しているので4GBの制限がある。
たとえばゲームタイトルのほとんどが32bitAPIを使用している。
しかし、OS自体は4GBの制限がないので、4GB以上の物理メモリを搭載した場合、複数のアプリケーションを動作させる使い方では恩恵がある。
また、動画エンコード用ソフトウェアはネイティブ64bit対応をしていく方向にあるようなので、動画編集をする用途では恩恵がある。

でいいのかなぁ


2015.12.16 追記

搭載メモリの最大容量は、Windows 10 HOME は128GB、Windows 10 Pro は2TBに対して、最新マザーボード(Z170チップセット)では64GBまで対応。
なので、現状は、マザーボート(CPU、チップセット、BIOS)の制限が上限になります。
物理メモリの価格を見ると、お買い得なのは4GB、8GBあたりなので、8GB~16GBあれば十分かと思います。