Настройка 4 гигабайт: BCDEdit и Boot.ini
В 32-разрядных выпусках Windows приложения имеют 4 гигабайта (ГБ) виртуального адресного пространства. Виртуальное адресное пространство разделено таким образом, чтобы в приложении было доступно 2 ГБ, а остальные 2 ГБ доступны только системе. Функция настройки 4-гигабайтовой (4GT или 4GT RAM Tuning), включенная с помощью команды BCDEdit /set increaseuserva, увеличивает виртуальное адресное пространство, доступное приложению, до 3 ГБ и сокращает объем, доступный системе, до 1–2 ГБ.
Для приложений с большим объемом памяти, таких как системы управления базами данных (СУБД), использование большего виртуального адресного пространства может обеспечить значительные преимущества производительности и масштабируемости. Однако кэш файлов, страничный пул и нестраничный пул являются меньшими по размеру, что может негативно повлиять на приложения с интенсивными сетевыми или I/O операциями. Поэтому может понадобиться протестировать ваше приложение под нагрузкой и проверить счетчики производительности, чтобы определить, приносит ли ваше приложение пользу от большего адресного пространства.
Чтобы включить 4GT, используйте команду BCDEdit /set , чтобы задать вариант начальной записи increaseuserva, установив значение в диапазоне от 2048 (2 ГБ) до 3072 (3 ГБ).
Windows Server 2003 и более ранние версии: Чтобы включить 4GT, добавьте параметр /3GB в файл Boot.ini. Переключатель /3ГБ поддерживается в следующих системах:
- Windows Server 2003
- Windows XP Professional
Параметр /3 ГБ делает все 3 ГБ виртуального адресного пространства доступным для приложений и сокращает объем, доступный системе до 1 ГБ. В Windows Server 2003 объем адресного пространства, доступного для приложений, можно настроить, задав параметру /USERVA в Boot.ini значение от 2048 до 3072, что увеличивает объем адресного пространства, доступного для системы. Это может помочь обеспечить общую производительность системы, если приложению требуется более 2 ГБ, но менее 3 ГБ адресного пространства.
Чтобы приложение использовало большее адресное пространство, задайте флаг IMAGE_FILE_LARGE_ADDRESS_AWARE в заголовке изображения. Компоновщик, включенный в Microsoft Visual C++, поддерживает переключатель /LARGEADDRESSAWARE для установки этого флага. Установка этого флага и запуск приложения в системе, которая не поддерживает 4GT, не должна влиять на приложение.
В 64-разрядных выпусках Windows 32-разрядные приложения, помеченные флагом IMAGE_FILE_LARGE_ADDRESS_AWARE, имеют доступ к 4 ГБ адресного пространства.
выпуски Windows Server 2003 для Itanium: До пакета обновлений SP1 32-разрядные процессы имеют только 2 ГБ адресного пространства.
Используйте следующие рекомендации для поддержки 4GT в приложениях:
- Адреса вблизи границы размером 2 ГБ обычно используются различными системными библиотеками DLL. Поэтому 32-разрядный процесс не может выделить более 2 ГБ непрерывной памяти, даже если доступно все адресное пространство размером 4 ГБ.
- Чтобы получить общий объем виртуального пространства пользователя, используйте функцию GlobalMemoryStatusEx. Чтобы получить максимально возможный адрес пользователя, используйте функцию GetSystemInfo. Всегда обнаруживайте реальное значение во время выполнения и избегайте использования жестких определений констант, таких как
#define HIGHEST_USER_ADDRESS 0xC0000000
. - Избегайте подписанных сравнений с указателями, так как они могут привести к сбою приложений в системе с поддержкой 4GT. Следующее условие является ложным для указателя, превышающего 2 ГБ:
if (pointer > 40000000)
. - Код, использующий старший бит указателя для цели, определяемой приложением, не будет работать при включении 4GT. Например, 32-разрядное слово может рассматриваться как адрес пользовательского режима, если он находится ниже 0x80000000, и код ошибки, если выше. Это не так с 4GT.
VirtualAlloc обычно возвращает низкие адреса перед высокими адресами. Поэтому процесс может не использовать очень высокие адреса, если он не выделяет много памяти или имеет фрагментированное виртуальное адресное пространство. Чтобы принудительно выделять память, начиная с более высоких адресов, а затем по более низким для тестирования, укажите MEM_TOP_DOWN при вызове VirtualAlloc или установите следующее значение реестра на 0x100000:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Управление памятью\AllocationPreference