4 GB のチューニング: BCDEdit と Boot.ini
Windows の 32 ビット版では、アプリケーションで 4 GB の仮想アドレス空間を使用できます。 仮想アドレス空間は、2 GB をアプリケーションで使用できるように分割され、他の 2 GB はシステムでのみ使用できます。 BCDEdit /set increaseuserva コマンドで有効になっている 4 ギガバイトのチューニング (4GT または 4GT RAM チューニング) 機能は、アプリケーションで使用できる仮想アドレス空間を最大 3 GB まで増やし、システムで使用できる容量を 1 から 2 GB に減らします。
データベース管理システム (DBMS) など、メモリを大量に消費するアプリケーションでは、より大きな仮想アドレス空間を使用すると、パフォーマンスとスケーラビリティの利点が大きくなる可能性があります。 ただし、ファイル キャッシュ、ページ プール、および非ページ プールは小さく、ネットワークや I/O が多いアプリケーションに悪影響を与える可能性があります。 そのため、負荷の下でアプリケーションをテストし、パフォーマンス カウンターを調べて、アプリケーションが大きなアドレス空間からメリットを得られるかどうかを判断することができます。
4GT を有効にするには、 BCDEdit /set コマンドを使用して 、increaseuserva ブート エントリ オプションを 2048 (2 GB) から 3072 (3 GB) の値に設定します。
Windows Server 2003 以前: 4GT を有効にするには、 /3 GB スイッチを Boot.ini ファイルに追加します。 /3GB スイッチは、次のシステムでサポートされています。
- Windows Server 2003
- Windows XP Professional
/3 GB スイッチを使用すると、アプリケーションで 3 GB の仮想アドレス空間を完全に使用できるようになり、システムで使用できる容量が 1 GB に減ります。 Windows Server 2003 では、アプリケーションで使用できるアドレス空間の量は、Boot.iniの /USERVA スイッチを 2048 から 3072 の間の値に設定することで調整できます。これにより、システムで使用できるアドレス空間の量が増えます。 これは、アプリケーションで 2 GB を超えるが 3 GB 未満のアドレス空間が必要な場合に、システムの全体的なパフォーマンスを維持するのに役立ちます。
アプリケーションで大きなアドレス空間を使用できるようにするには、イメージ ヘッダーで IMAGE_FILE_LARGE_ADDRESS_AWARE フラグを設定します。 Microsoft Visual C++に含まれるリンカーは、このフラグを設定するための /LARGEADDRESSAWARE スイッチをサポートしています。 このフラグを設定してから、4GT サポートを持たないシステムでアプリケーションを実行しても、アプリケーションに影響を与えてはなりません。
Windows の 64 ビット エディションでは、 IMAGE_FILE_LARGE_ADDRESS_AWARE フラグでマークされた 32 ビット アプリケーションでは、4 GB のアドレス空間を使用できます。
Windows Server 2003 の Itanium エディション: SP1 より前の 32 ビット プロセスでは、2 GB のアドレス空間しか使用できません。
アプリケーションで 4GT をサポートするには、次のガイドラインを使用します。
- 2 GB 境界付近のアドレスは、通常、さまざまなシステム DLL で使用されます。 そのため、32 ビット プロセスでは、4 GB のアドレス空間全体が使用可能な場合でも、2 GB を超える連続したメモリを割り当てることはできません。
- ユーザー仮想空間の合計量を取得するには、 GlobalMemoryStatusEx 関数を使用します。 可能な限り高いユーザー アドレスを取得するには、 GetSystemInfo 関数を使用します。 実行時に常に実際の値を検出し、次のようなハードワイヤード定数定義を使用しないようにします
#define HIGHEST_USER_ADDRESS 0xC0000000
。 - ポインターとの符号付き比較は避けてください。これは、4GT 対応システムでアプリケーションがクラッシュする可能性があるためです。 2 GB を超えるポインターの場合、次のような条件は false です。
if (pointer > 40000000)
- アプリケーション定義の目的でポインターの最上位ビットを使用するコードは、4GT が有効になっていると失敗します。 たとえば、32 ビットワードが0x80000000より下にある場合はユーザー モード アドレスと見なされ、上記の場合はエラー コードと見なされる場合があります。 これは 4GT では当てはまらない。
VirtualAlloc は通常、高いアドレスの前に低いアドレスを返します。 そのため、大量のメモリを割り当てたり、断片化された仮想アドレス空間を持っていない限り、プロセスで非常に高いアドレスを使用できない場合があります。 テスト目的で、より小さいアドレスの前に上位のアドレスから割り当てるよう割り当てを強制するには、VirtualAlloc を呼び出すときに MEM_TOP_DOWN を指定するか、次のレジストリ値を 0x100000 に設定します。
Hkey_local_machine\システム\CurrentControlSet\コントロール\セッション マネージャー\メモリ管理\AllocationPreference
関連トピック