Ajuste de 4 Gigabytes: BCDEdit e Boot.ini
Em edições de 32 bits do Windows, os aplicativos têm 4 GB (gigabyte) de espaço de endereço virtual disponível. O espaço de endereço virtual é dividido para que 2 GB fiquem disponíveis para o aplicativo e os outros 2 GB só fiquem disponíveis para o sistema. O recurso de ajuste de 4 gigabytes (ajuste de 4GT ou 4GT RAM), habilitado com o comando BCDEdit /set increaseuserva , aumenta o espaço de endereço virtual disponível para o aplicativo em até 3 GB e reduz a quantidade disponível para o sistema entre 1 e 2 GB.
Para aplicativos com uso intensivo de memória, como DBMS (sistemas de gerenciamento de banco de dados), o uso de um espaço de endereço virtual maior pode fornecer benefícios consideráveis de desempenho e escalabilidade. No entanto, o cache de arquivos, o pool paginado e o pool nãopagado são menores, o que pode afetar negativamente os aplicativos com rede pesada ou E/S. Portanto, talvez você queira testar seu aplicativo sob carga e examinar os contadores de desempenho para determinar se o aplicativo se beneficia do espaço de endereço maior.
Para habilitar o 4GT, use o comando BCDEdit /set para definir a opção de entrada de inicialização increaseuserva para um valor entre 2048 (2 GB) e 3072 (3 GB).
Windows Server 2003 e versões anteriores: Para habilitar o 4GT, adicione a opção /3GB ao arquivo Boot.ini. Há suporte para a opção /3GB nos seguintes sistemas:
- Windows Server 2003
- Windows XP Professional
O comutador /3 GB disponibiliza um espaço de endereço virtual completo para aplicativos e reduz a quantidade disponível para o sistema para 1 GB. No Windows Server 2003, a quantidade de espaço de endereço disponível para aplicativos pode ser ajustada definindo a opção /USERVA em Boot.ini para um valor entre 2048 e 3072, o que aumenta a quantidade de espaço de endereço disponível para o sistema. Isso pode ajudar a manter o desempenho geral do sistema quando o aplicativo requer mais de 2 GB, mas menos de 3 GB de espaço de endereço.
Para permitir que um aplicativo use o espaço de endereço maior, defina o sinalizador IMAGE_FILE_LARGE_ADDRESS_AWARE no cabeçalho da imagem. O vinculador incluído no Microsoft Visual C++ dá suporte à opção /LARGEADDRESSAWARE para definir esse sinalizador. Definir esse sinalizador e, em seguida, executar o aplicativo em um sistema que não tem suporte 4GT não deve afetar o aplicativo.
Em edições de 64 bits do Windows, aplicativos de 32 bits marcados com o sinalizador IMAGE_FILE_LARGE_ADDRESS_AWARE têm 4 GB de espaço de endereço disponíveis.
Edições itanium do Windows Server 2003: Antes do SP1, os processos de 32 bits têm apenas 2 GB de espaço de endereço disponível.
Use as seguintes diretrizes para dar suporte ao 4GT em aplicativos:
- Endereços próximos ao limite de 2 GB normalmente são usados por várias DLLs do sistema. Portanto, um processo de 32 bits não pode alocar mais de 2 GB de memória contígua, mesmo que todo o espaço de endereço de 4 GB esteja disponível.
- Para recuperar a quantidade de espaço virtual total do usuário, use a função GlobalMemoryStatusEx . Para recuperar o endereço de usuário mais alto possível, use a função GetSystemInfo . Sempre detecte o valor real em runtime e evite usar definições constantes com fio rígido, como:
#define HIGHEST_USER_ADDRESS 0xC0000000
. - Evite comparações assinadas com ponteiros, pois elas podem fazer com que os aplicativos falhem em um sistema habilitado para 4GT. Uma condição como a seguinte é falsa para um ponteiro acima de 2 GB:
if (pointer > 40000000)
. - O código que usa o bit mais alto de um ponteiro para uma finalidade definida pelo aplicativo falhará quando o 4GT estiver habilitado. Por exemplo, uma palavra de 32 bits pode ser considerada um endereço de modo de usuário se estiver abaixo 0x80000000 e um código de erro, se acima. Isso não é verdade com 4GT.
VirtualAlloc geralmente retorna endereços baixos antes de endereços altos. Portanto, seu processo pode não usar endereços muito altos, a menos que ele aloque muita memória ou tenha um espaço de endereço virtual fragmentado. Para forçar alocações a alocar de endereços mais altos antes de endereços inferiores para fins de teste, especifique MEM_TOP_DOWN ao chamar VirtualAlloc ou defina o seguinte valor do Registro como 0x100000:
HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Controle\Gerenciador de\ Sessão Gerenciamento de\ Memória AllocationPreference
Tópicos relacionados