web-dev-qa-db-ja.com

64ビットオペレーティングシステムで32ビットプロセスがアクセスできるメモリ量は?

Windowsでは、通常の状況では、32ビットプロセスは2GBのRAM(またはboot.iniファイルの特別なスイッチを使用して3GB)のみにアクセスできます。64ビットで32ビットプロセスを実行する場合オペレーティングシステム、使用可能なメモリ量、これを変更できる特別なスイッチや設定はありますか?

79
jjxtra

デフォルトでは2 GB。アプリケーションが大きなアドレス空間を認識している場合(/ LARGEADDRESSAWAREとリンク)、4 GBを取得します(3 GBではなく、 http://msdn.Microsoft.com/en-us/library/aa366778.aspx を参照) =)

多くのアプリケーションはポインターの最上位ビットがゼロであることに依存しているため、それらはまだ2 GBに制限されています。

80
Michael

/ LARGEADDRESSAWAREとリンクする場合、4 GBからシステムが使用しているものを引いたもの。

もちろん、そのフラグを設定する場合は、ポインター演算にさらに注意する必要があります。

18
MSN

多くの異なる32ビットアプリケーションがある場合、wow64サブシステムは4Gを超えるメモリのどこにでもマップできるので、十分なメモリのある64ビットウィンドウでは、さらに多くの32ビットアプリケーションを実行できるという事実に触れている人はいないようです。ネイティブの32ビットシステムよりも。

14
Harm ten Napel

32ビットプロセスは、64ビットOSと同じ制約に制限されています。問題は、メモリポインタの幅が32ビットしかないため、プログラムが32ビットを超えるメモリアドレスを割り当てたり解決したりできないことです。

7
Ben S

64ビットOSでの単一の32ビットプロセスは2Gbに制限されています。ただし、IMAGE_FILE_LARGE_ADDRESS_AWAREビットが設定されたEXEファイルにコンパイルされる場合、2Gbではなく4GBの制限があります- https://msdn.Microsoft.com/en-us/library/aa366778(VS .85).aspx

いずれの場合も、カーネルの仮想アドレス空間はすべてのプロセスで共有されます。 64ビットオペレーティングシステム、たとえば16 GBで使用可能なメモリが大量にあるにもかかわらず、非常に多数の32ビットプロセスがメモリ不足になる場合があるのは、このためです。合計でプロセスは、利用可能なカーネルの仮想アドレス空間(最大2GB)をすぐに使い果たす可能性があります。

特別なブートフラグ、3 GB、/ 3GBスイッチ、または/ uservaについて耳にすることは、すべて32ビットオペレーティングシステムに関するものであり、64ビットWindowsには適用されません。

詳細については、 https://msdn.Microsoft.com/en-us/library/aa366778(v = vs.85).aspx を参照してください。

考えに反して、32ビットオペレーティングシステムについては、32ビットオペレーティングシステムの物理的な制限は4 GBです。たとえば、Microsoft Windows Server 2008 32ビットなどの32ビットサーバーオペレーティングシステムは、 64 GB (Windows Server 2008 EnterpriseおよびDatacenterエディション)–物理アドレス拡張(PAE)により、Pentium Proで最初にIntelによって導入され、後にAthlonプロセッサでAMDによって導入され、3レベルのページテーブル階層を定義します。それぞれ32ビットではなく64ビットのテーブルエントリを使用して、これらのCPUが4ギガバイトを超える物理アドレス空間に直接アクセスできるようにします。したがって、理論的には32ビットOSは理論的に2 ^ 64バイト、つまり17,179,869,184ギガバイトにアクセスできますが、セグメントは4GB。ただし、マーケティング上の理由により、Microsoftは、サーバー以外のオペレーティングシステムでアクセス可能な最大メモリをわずか4GB、または事実上3GBに制限しています。したがって、1つのプロセスが32ビットOSで4GB以上にアクセスできます。MicrosoftSQLサーバーがその例です。

3
Maxim Masiutin