C++アプリケーションが使用する最大メモリに制限があるかどうか疑問に思っています
これは2GBだと理解しています-それは正しいですか?
C ++アプリが2GBを超えるメモリを要求しようとすると、メモリがクラッシュしますか?
最後の質問-C++アプリが実行されているマシンのメモリがすでに不足していて、C ++アプリが100MBのアレイ(つまり、連続したメモリ)を要求した場合、OSは仮想メモリを使用してこれに対応しますか?
C++アプリケーションが使用する最大メモリに制限があるかどうか疑問に思っています
これは2GBだと理解しています-それは正しいですか?
C ++アプリが2GBを超えるメモリを要求しようとすると、メモリがクラッシュしますか?
最後の質問-C++アプリが実行されているマシンのメモリがすでに不足していて、C ++アプリが100MBのアレイ(つまり、連続したメモリ)を要求した場合、OSは仮想メモリを使用してこれに対応しますか?
これにより動的メモリ割り当ての失敗が発生し、通常は結果としてアプリケーションがクラッシュしますが、技術的には、このイベントに耐えるようにアプリケーションを作成できます。実際、2GBは個々のプロセスのユーザーアドレス空間サイズです。アプリケーションは複数のプロセスを使用する場合があります(最も簡単な例:Chrome)。アプリケーションが100MBの連続したメモリを要求する場合、そのメモリは物理的に連続していなくても実質的に連続している必要があり、使用可能な連続したページが十分にない場合は、割り当てに失敗します。
仮想メモリは常に使用されます-すべてのメモリは仮想です。
ほとんどの場合、2GBが制限です。通常、ユーザー用に2GB、カーネル用に2GBが使用されますが、Windowsにユーザー用に3GB、カーネル用に1GB(リスクはあります)、64ビットでは32ビットアドレスの4GB全体を作成するように依頼できます。ユーザーはスペースを利用できます。増加したアドレス空間は、アプリケーションをとしてコンパイルした場合にのみ使用できます/LARGEADDRESSAWARE
。
制限はオペレーティングシステムによって異なります。標準のLinuxは2Gb、Solarisは3 Gb、Windowsは(言われていますが)PAEの使用方法に応じて2または3です。
ただし、データ用にその2Gのすべてを取得できるわけではありません。あなたのコードはそれの一部を取り、あなたのプログラムのスタックはいくつかを取り、Cライブラリはあなたが参照する他の共有ライブラリと同様にいくつかを取ります。通常、OSはコード、ヒープ、およびスタックを整理して、それらの間に意図的なギャップがあるようにします。
最後の質問ですが、それはすべて仮想メモリです。あなたが実際に求めているのは、「私のマシンのプログラムがそのすべての物理メモリを使用する場合、OSはスワップを使用するか」ということです。そして答えはイエスですが、あなたの考えとはまったく異なります。
CPUは物理RAMにのみアクセスできます。ディスクに保存されているデータについては何も知りません。したがって、実行中のプロセスに物理メモリを与えるために、OSはそのメモリを別のプロセスから取得します。メモリを取得するために、それをスワップに書き込みます。他のプロセスがメモリにアクセスする必要がある場合、OSはそれを読み戻し、他のプロセスのメモリをスワップに書き込む可能性があります。
通常、32ビットOSは4GBの物理RAMしかアドレス指定できません。実際には、この制限はやや低くなる傾向がありますが、仮想RAMを使用することで軽減できます。Windowsの特定のバージョンでは、物理アドレス拡張を使用して増やすことができます。
あなたの質問にとってさらに重要なのは、32ビットWindowsでは、ユーザーアプリケーションが使用できるアドレス空間にも2GBの制限があるということです。これにより、使用可能な物理RAMまたは仮想RAMの量に関係なく、単一のアプリケーションが使用できるメモリの量に厳しい制約が課せられます。デフォルトの2GBの制限は3GBに増やすことができます。
次のページで制限について詳しく説明しています:http://msdn.microsoft.com/en-us/library/aa366778 (v = vs.85).aspx
通常の場合、他の回答は正しいですが、Windows XP 32 ビットでは、 Address Windowing Extensionsを使用して 3GB を超えるメモリを使用することがサポートされています。
AWE は通常、データベース サーバーが非常に大きなメモリ セットにアクセスできるようにするために使用されます。実際にメモリを管理するには Win API を使用する必要があるため、本当に必要な場合にのみ使用することをお勧めします。
アクセスできるメモリはすべて仮想です。アプリケーションから直接物理メモリにアクセスすることはできません。OSは必要に応じてページファイルを使用します。多くのアプリケーションが物理メモリを使い果たすことで見られる効果は、スワッピングの増加と顕著な速度低下です。
Win 32ビットでは、アプリケーションで2GBの仮想アドレス空間を使用できます。これは、実行可能ファイルとDLL(メモリマップトファイルなど)をスタックとヒープにマッピングするために使用されます。このスペースは通常、いくらか断片化されています。アプリケーションが「LargeAddressAware」として構築されており、OSが64ビットであるか、ユーザー/カーネルモードメモリを3 / 1GBとして分割するように構成されている場合、アドレス空間は64ビットでほぼ4GB、32ビットで3GBです。少し。
割り当てることができるメモリは、通常、17〜1800MBの範囲です。小さな部分を割り当てると、これに到達します。大きな連続ブロックを割り当てようとすると、アドレススペースが断片化されるため、はるかに早く制限に達する可能性があります。
たとえば、MSDNの仮想アドレス空間またはウィキペディアの仮想アドレス空間を参照してください。