2009-03-12 19 views
74

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

+0

http://msdn.microsoft.com/en-us/library/Aa366521 –

答えて

74

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

多くのアプリケーションは、ゼロである。

+4

プロセスが完全な4GBにアクセスできない理由を誰かが説明できますか? – BlueTrin

+0

どういう意味ですか?自分で構築する場合は、/ LARGEADDRESSAWAREフラグを使用して、4GBで動作させることができます。そうしなかった場合は、行った開発者の慈悲を受けます。 – SilverbackNet

+0

ポインタが2の補数で危険に解釈される可能性があるからですか? – rosstex

17

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

Of course, you should be even more careful with pointer arithmetic if you set that flag.

+0

-1:システムは64ビットアドレスを使用しますので、何かを引き算する必要はありません –

+0

@ThomasW。少なくともWindowsでは。 WOW64では、64ビットシステムコールに32ビットのサンクが必要です。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa384274(v=vs.85).aspx – MSN

+1

を参照してください。これらのDLLは605 KBですか?申し訳ありませんが、GBのメモリに関する質問が増えたので、私はそれを理解しませんでした。 –

-1

のWin64の下で32ビットのプロセスを実行しているときは、同じ基本的な制限を持っています。あなたのアプリケーションはWin32のように見えるように最適な32個のサブシステムで動作しますが、これにはプロセスのメモリ制限が含まれています(OSは2GB、OSは2GB)

7

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

+2

これは、32ビットが4GBのスペースを扱うことを明確にした場合に役立つでしょう。 –

-7

制限は2gまたは3gbではなく、32ビットの場合は4GBです。

なぜ3GBというのは、実際には4GBのシステムRAMを搭載しているとOSが3GBの空き容量を見せているからです。

合計RAMは4GBです。あなたが1GBのビデオカードを持っていれば、それは32ビットOSで見られる総ラムの一部としてカウントされます。

4Gig not 3 not 2?

+2

これは間違っています。標準的なx86システム(メモリ拡張なし)では、(コンピュータがページングのために1GiBのRAMしか持っていなくても)カーネルは4GiBのメモリ空間に完全にアクセスできます。カーネルは、それ自身のために上位2GiB(一部のカーネルは1GiBまたは3GiBを代わりに予約)を予約します。各プロセスの仮想メモリにもカーネルの予約メモリがマップされているため、プロセスは2GiBのメモリを使用できません。 –

+3

また、ビデオカードは、プロセスが使用できるメモリ量とは何の関係もありません。 ACPIテーブル、メモリマップIOなどは物理メモリアドレスを使いますが、仮想メモリのおかげでそれは避けられます。 –

+1

これは間違っています。マイクロソフトでは、* Virtual * 32ビットアドレス空間をWindows NTと分割して、OS(ドライバ/ API /システムコールなど)のマッピング用に2GBを予約し、アプリケーション用に2GBを残すように選択しました。/3GBブートスイッチは、この動作を変更します(OSマッピングの場合は1GB、アプリケーションコードの場合は3GB)。私は以前のWindows NT 3.xの仮想メモリアーキテクチャのドキュメントを読者のための練習として見つけ出すことを残しました:-) – ripvlan

14

多くの異なる32ビットアプリケーションがある場合、wow64サブシステムは4Gを超えるメモリ内のどこにでもマップできるため、十分なメモリを備えた64ビットのウィンドウでは、ネイティブの32ビットシステムよりも32ビットのアプリケーションが必要です。

+7

OPが仮想メモリを指している物理RAMについて話しています。 32ビットシステムでも、ページファイルのサイズが十分である限り、多くのアプリケーションを実行できます。 –

2

64ビットOSで単一の32ビットプロセスが2Gbに制限されています。それはIMAGE_FILE_LARGE_ADDRESS_AWAREビットが設定されたEXEファイルにコンパイルされている場合でも、それは次いで、4 GB、ないの2Gbの限界を持っている - のいずれかの場合にはhttps://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx

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

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

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

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

+1

この質問は、単一プロセス*がアクセスできるメモリの量について質問しています。これは、32ビット仮想メモリのアドレス空間によって制限されます。 PAEを使用している32ビットOSの場合でも、同じコンピュータ上で4GBを使用する複数の32ビットプロセス*を1つずつ*持つことができます。しかし、これは*この質問が求めるものではありません。 –

+0

@PeterCordes - 申し訳ありませんが、ありがとうございます - 2GB/4GB制限についての回答を更新しました。 –

関連する問題