Настройка 4 Гигабайт: BCDEdit и Boot.ini
В 32-разрядных выпусках Windows для приложений доступно 4 ГБ виртуального адресного пространства. Виртуальное адресное пространство делится таким образом, что 2 ГБ доступно приложению, а остальные 2 ГБ — только системе. Функция настройки объемом 4 ГБ (настройка ОЗУ 4GT или 4GT), включенная с помощью команды BCDEdit /set increaseuserva , увеличивает виртуальное адресное пространство, доступное приложению, до 3 ГБ, и уменьшает объем, доступный для системы, до 1 до 2 ГБ.
Для приложений с большим объемом памяти, таких как системы управления базами данных (СУБД), использование большего виртуального адресного пространства может обеспечить значительные преимущества производительности и масштабируемости. Однако размер файлового кэша, выгружаемого пула и невыгружаемого пула меньше, что может негативно сказаться на приложениях с интенсивной сетью или операциями ввода-вывода. Поэтому может потребоваться протестировать приложение под нагрузкой и проверить счетчики производительности, чтобы определить, является ли приложение преимуществами большего адресного пространства.
Чтобы включить 4GT, используйте команду BCDEdit /set , чтобы задать параметру загрузочной записи increaseuserva значение в диапазоне от 2048 (2 ГБ) до 3072 (3 ГБ).
Windows Server 2003 и более ранние версии: Чтобы включить 4GT, добавьте параметр /3 ГБ в файл 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 ГБ адресного пространства.
Выпуски Itanium Windows Server 2003: До выпуска с пакетом обновления 1 (SP1) в 32-разрядных процессах доступно только 2 ГБ адресного пространства.
Используйте следующие рекомендации для поддержки 4GT в приложениях:
- Адреса, расположенные вблизи границы 2 ГБ, обычно используются различными системными библиотеками DLL. Таким образом, 32-разрядный процесс не может выделить более 2 ГБ непрерывной памяти, даже если доступно все адресное пространство размером 4 ГБ.
- Чтобы получить общий объем виртуального пространства пользователя, используйте функцию GlobalMemoryStatusEx . Чтобы получить максимально возможный адрес пользователя, используйте функцию GetSystemInfo . Всегда обнаруживайте реальное значение во время выполнения и избегайте использования определений жестко подключенных констант, таких как :
#define HIGHEST_USER_ADDRESS 0xC0000000
. - Избегайте сравнения подписей с указателями, так как они могут привести к сбою приложений в системе с поддержкой 4GT. Для указателя, превышающего 2 ГБ, имеет значение false:
if (pointer > 40000000)
. - Код, использующий самый высокий бит указателя для определенной приложением цели, завершится ошибкой при включении 4GT. Например, 32-разрядное слово может считаться адресом в пользовательском режиме, если оно находится ниже 0x80000000, и кодом ошибки, если выше. Это не относится к 4GT.
VirtualAlloc обычно возвращает низкие адреса перед высокими адресами. Таким образом, ваш процесс может не использовать очень высокие адреса, если он не выделяет много памяти или не имеет фрагментированного виртуального адресного пространства. Чтобы принудительно выделять выделения из более высоких адресов перед более низкими адресами в целях тестирования, укажите MEM_TOP_DOWN при вызове VirtualAlloc или задайте для следующего значения реестра значение 0x100000:
HKEY_LOCAL_MACHINE\Системы\CurrentControlSet\Управления\Диспетчер сеансов\Управление памятью\AllocationPreference
Связанные темы