3GBの壁についてのまとめ(補足)

過去に前編後編に分けて「3GBの壁」についてまとめてみましたが、今回はそこに書ききれなかったことの追加と、新たに判明したことを補足していきたいと思います。

以前の繰り返しになりますが、以下に書かれることはあくまで個人的に集めたもので、情報の正確性は保証できません。情報を元に何かおこなってトラブルが起きても、私としては何の責任も取れません。あくまで自己責任でお願いします。

枯渇する物理アドレスと安くなるメモリ

11月の下旬から12月の上旬にかけて、インプレスのPC Watchで3回に分けて以下の連載がおこなわれました。

元麻布春男の週刊PCホットライン
1GB=2,000円時代のメモリ増設を考える(上)
1GB=2,000円時代のメモリ増設を考える(中)
1GB=2,000円時代のメモリ増設を考える(下)

内容としては相当部分が3GBの壁の技術的な話に当てられており、一通り読めばなぜ「32bit OSで4GBすべてを使用するのが難しいのか」がわかるようになっています。

簡単にまとめますと、問題となるのは以下の3つ。

  1. CPU側が32bit(4GB)を超える物理アドレスをもつこと
  2. チップセットが4GBを超えるメモリをサポートすること
  3. OS(Windows)が4GBを超えるメモリをサポートすること

重要なのはすべて「以上」ではなく「超える」という条件だということです。つまり4GBのサポートでは、いずれにしても壁が存在するということになります。

それでは個別に条件を見ていきましょう。

1. CPU側が32bit(4GB)を超える物理アドレスをもつこと

これが問題になることはありません。今から見れば太古のCPUである、Pentium Pro以降のx86プロセッサなら対応しているとのこと。現行のシステムなら何も気にする必要はないでしょう。

2. チップセットが4GBを超えるメモリをサポートすること

まず前提として、AMDのAthlon64系(と後継のPhenom)はメモリコントローラをCPU側に持つために、チップセットは関係ありません。Athlon64のメモリサポートは8GBまでです。

Intelチップセットのメモリサポート状況は以下のとおり。(2007年12月現在)

8GBまでサポート

955X, 975X, P965, G965, Q965, P35, G35, Q35, G33, Q33, X38

4GBまでのサポート

G31, P31, 945G, 945P

これ以前のチップセットは4GBまでのサポートか、さらに下回る容量のサポートしかありません。もちろん、これらの“古い”チップセットでは3GBの壁に見事に引っかかってしまいます。

つまり3GBの壁の突破には、AMDのCPUを使用しているか、上記で8GBまでのメモリをサポートしているチップセットのM/Bを使用している必要があるのです。これは古いチップセットのアドレス空間自体が4GBまでしか存在せず、32bit OS(Windows)と同じMMIOが原因で、物理アドレス空間が枯渇してしまうためです。(詳しくは前に書いた後編で。)

余談ですが、8GBのメモリをサポートしているチップセットは、メモリの容量以上の64GBまでアドレス空間が拡張されており、「8GBの壁」は存在しないとのことです。

G31とP31の状況

上記の連載には、4GBまでの対応チップセットとして945Gがテスト環境に使われていましたが、新しいチップセットでなおかつ4GBまでしかサポートしてないG31とP31の詳細情報は書かれていませんでした。

Intelのサイトからデータシートをダウンロードしてチェックしたところ、G31とP31はアドレス空間自体が4GBまでに制限されているため、チップセット自体は新しくても3GBの壁が存在するようです。

The system memory requirements are: 4GB (max addressable space) – 1 GB (PCI space) – 35 MB (lost memory) = 3 GB – 35 MB (minimum granularity) = ECB0_0000h

Intel® G31/P31 Express Chipset Datasheet (Intel)

3. OS(Windows)が4GBを超えるメモリをサポートすること

これは以前書いた前編で詳しく触れましたが、基本的に64bit Windowsと一部のサーバ向け32bit Windowsを使用しないと回避することはできません。具体的には以下のものになります。

  • 64bit Windows
    • Windows XP Professional x64 Edition
    • Windows Vista 64bit版のすべてのエディション
  • 32bit Windows
    • Windows 2000 Advanced Server
    • Windows Server 2003 Enterprise Edition以上

Standard EditionとWeb Editionはそれぞれ4GB、2GBまでしかサポートしていません

Windows Server 2003 Standard Editionでも3GBの壁が打ち破れる(4GBすべてを認識できる)という情報もあります。Standard EditionとEnterprise Editionがカーネルを共用しており、Standard Editionで物理アドレス空間が4GB以上存在しているなら技術的には十分可能だと考えられますが、現時点では情報が少なすぎます。

ハードウェアが4GB以上の物理アドレスを持ち(上記参照)、BIOSで「Memory Remap」系のオプションがある場合、もしかしたら4GBすべてを使えるかもしれません。ただし、現時点でも確実に4GBフルに認識させたいなら、Enterprise Edition以上を選んでおくのが無難だと思われます。

いずれにしても一番注意しなければならない点は、最新のWindowsであるWindows Vistaでも32bit版では依然として3GBの壁は存在するということです。

Windows Vista SP1で「3GBの壁」問題は解決されるか?

そろそろWindows Vista SP1のリリースが近くなってきましたが、そのSP1で3GBの壁に対する修正がなされるのではないかという話が出てきました。具体的にはこのようなことが書かれています。

 このほかにも、32bit版において、メモリを4GB搭載した場合にシステムのプロパティで4GBすべてが表示されない件に関し修正が入るという。ただし、注意書きとして対応BIOSが必要になると書かれており、すべてのユーザーのシステムでこの表示が有効になるかは不明だ。

MicrosoftがVista SP1 RC版をβテスターに公開 ~多くの改良で性能や消費電力を改善 (笠原一輝のユビキタス情報局)

これを読む限り、Vista SP1で3GBの壁に対する何らかの対策がおこなわれるように見えます。ところがすぐ後にはこのように書かれています。

それ以上の説明がないので詳細は不明だが、表示が4GBと修正された場合でも、32bit OSの仕組み上、4GBをすべて使えるわけではないので注意が必要だ。

MicrosoftがVista SP1 RC版をβテスターに公開 ~多くの改良で性能や消費電力を改善 (笠原一輝のユビキタス情報局)

この文章をそのままの意味で受け取るならば、Vista SP1で修正されるのはあくまで表示のみであるということでしょう。つまり、メモリを4GB搭載するとシステムプロパティからは4GBと表示されるが、やはり実際に使用できるのは3GBまでということになります。

なぜこのような中途半端な修正がおこなわれるのでしょうか?

結局のところ、3GBの壁は32bit Windowsがアドレス空間を4GBしか持っていないことが原因です。抜本的に解決するにはアドレス空間を拡張するしかないのですが、そのような修正は32bit Windowsではごく一部のサーバ向け上位エディションにしか適用されていません。(技術的には「物理アドレス拡張」 - PAEと呼ばれています。)

サービスパック(SP)のようなマイナーバージョンアップでは、このような大きい変更がおこなわれるとは考えにくく、また互換性の問題も出てくるでしょう。マイクロソフトの基本的な姿勢としては、大容量のメモリを使用したければ、64bit版のWindowsを使えということに変わりはないのだと思われます。

ただし、表記上の問題が3GBから4GBに解消されることによって、3GBの壁自体を認識することが(特に初心者にとっては)少なくなるでしょう。そういう意味では一つの解決策なのかもしれません。実際に使用できる容量がわかりにくくなるという副作用は生まれるかもしれませんが。

実際にその通りだったようです。

おまけ アプリケーションには「2GBの壁」がある

メモリを2GB以上に増設しても、実際に一つのアプリケーションから扱えるメモリは2GBまでです。ある一つのアプリケーションを快適にしようとして、2GB以上のメモリを搭載することはあまり意味がありません。

例えば3GBのメモリを搭載したPCで、画像処理ソフトのみを起動したとします。この場合は画像処理ソフトに割り当てられるメモリは最大で2GBで、残りの1GBはその画像処理ソフトがどんなにメモリを必要していても割り当てられることはありません。(この問題はWindowsの「3GBスイッチ」で解決することがありますが、それはまたの機会に。)

ただし、通常はOSであるWindowsの他、何かしらのアプリケーションも同時に動いているはずです。(アンチウィルスソフトやWebブラウザなど。)重いソフトを同時に2個以上動かすこともあり得ますし、2GB以上のメモリが必要かどうかはケースバイケースとなるでしょう。

この問題は32bitアプリケーションで発生し、制限が存在しないのは64bitネイティブのアプリケーションのみです。64bit OSを使用していたとしても、その上で走っているのが32bitアプリケーションならば、結局アプリケーションの2GBの壁は存在します。

さらに困ったことに、実は64bit OS上で64bitネイティブのアプリケーションを使用している場合でも、この問題が発生することはあり得ます。最後はこの問題の部分を前出の1GB=2,000円時代のメモリ増設を考える(中)から引用して終わります。

64bit版のバイナリになっても、ユーザーモードのプロセスが利用可能なアドレス空間(仮想アドレス)は、デフォルトでは2GBのままだからだ。 32bit版Windowsが4GBの仮想アドレス空間を2GBのカーネルと2GBのユーザーに分割したように、64bit版Windowsでは16TB (44bit)の仮想アドレス空間を8TBのカーネルと8TBのユーザーに分割する(64bit版Windowsの仕様)。しかし、アプリケーション作成時に明示的に8TBのユーザーアドレスを利用すると指示しない限り、ユーザープロセスが利用可能なアドレス空間は2GBのままなのである(おそらくは 64bit版Windows上で同時実行されるであろう32bitバイナリとの互換性のため)。

1GB=2,000円時代のメモリ増設を考える(中) (元麻布春男の週刊PCホットライン)

アドレス空間がよくわからない(区別が付かない)という方のために以下の記事を書きました。興味がある方は参照してください。

参考サイト