Ajuste de 4 gigabytes: BCDEdit y Boot.ini

En las ediciones de 32 bits de Windows, las aplicaciones tienen 4 gigabytes (GB) de espacio de direcciones virtual disponible. El espacio de direcciones virtuales se divide para que haya 2 GB disponibles para la aplicación y los otros 2 GB solo están disponibles para el sistema. La característica de ajuste de 4 gigabytes (4GT o 4GT RAM Tuning), habilitada con el comando BCDEdit /set increaseuserva , aumenta el espacio de direcciones virtuales que está disponible para la aplicación hasta 3 GB y reduce la cantidad disponible para el sistema a entre 1 y 2 GB.

En el caso de las aplicaciones que consumen mucha memoria, como los sistemas de administración de bases de datos (DBMS), el uso de un espacio de direcciones virtual más grande puede proporcionar ventajas considerables de rendimiento y escalabilidad. Sin embargo, la caché de archivos, el grupo paginado y el grupo no paginado son más pequeños, lo que puede afectar negativamente a las aplicaciones con redes pesadas o E/S. Por lo tanto, es posible que quiera probar la aplicación bajo carga y examinar los contadores de rendimiento para determinar si la aplicación se beneficia del espacio de direcciones más grande.

Para habilitar 4GT, use el comando BCDEdit /set para establecer la opción de entrada de arranque increaseuserva en un valor entre 2048 (2 GB) y 3072 (3 GB).

Windows Server 2003 y versiones anteriores: Para habilitar 4GT, agregue el modificador /3GB al archivo Boot.ini. El modificador /3GB se admite en los siguientes sistemas:

  • Windows Server 2003
  • Windows XP Professional

El modificador /3GB hace que haya disponible un espacio de direcciones virtual completo de 3 GB para las aplicaciones y reduce la cantidad disponible para el sistema a 1 GB. En Windows Server 2003, la cantidad de espacio de direcciones disponible para las aplicaciones se puede ajustar estableciendo el modificador /USERVA en Boot.ini en un valor entre 2048 y 3072, lo que aumenta la cantidad de espacio de direcciones disponible para el sistema. Esto puede ayudar a mantener el rendimiento general del sistema cuando la aplicación requiere más de 2 GB, pero menos de 3 GB de espacio de direcciones.

Para permitir que una aplicación use el espacio de direcciones más grande, establezca la marca IMAGE_FILE_LARGE_ADDRESS_AWARE en el encabezado de imagen. El enlazador incluido con Microsoft Visual C++ admite el modificador /LARGEADDRESSAWARE para establecer esta marca. Establecer esta marca y, a continuación, ejecutar la aplicación en un sistema que no tiene compatibilidad con 4GT no debe afectar a la aplicación.

En las ediciones de 64 bits de Windows, las aplicaciones de 32 bits marcadas con la marca IMAGE_FILE_LARGE_ADDRESS_AWARE tienen disponibles 4 GB de espacio de direcciones.

Ediciones itanium de Windows Server 2003: Antes de SP1, los procesos de 32 bits solo tienen disponibles 2 GB de espacio de direcciones.

Use las instrucciones siguientes para admitir 4GT en aplicaciones:

  • Las direcciones cercanas al límite de 2 GB suelen usarse en varios archivos DLL del sistema. Por lo tanto, un proceso de 32 bits no puede asignar más de 2 GB de memoria contigua, incluso si todo el espacio de direcciones de 4 GB está disponible.
  • Para recuperar la cantidad total de espacio virtual de usuario, use la función GlobalMemoryStatusEx . Para recuperar la dirección de usuario más alta posible, use la función GetSystemInfo . Detecte siempre el valor real en tiempo de ejecución y evite usar definiciones de constantes cableadas de forma permanente, como: #define HIGHEST_USER_ADDRESS 0xC0000000.
  • Evite comparaciones firmadas con punteros, ya que pueden provocar que las aplicaciones se bloqueen en un sistema habilitado para 4GT. Una condición como la siguiente es false para un puntero que está por encima de 2 GB: if (pointer > 40000000).
  • El código que usa el bit más alto de un puntero para un propósito definido por la aplicación producirá un error cuando se habilite 4GT. Por ejemplo, una palabra de 32 bits podría considerarse una dirección en modo de usuario si está por debajo de 0x80000000 y un código de error si está arriba. Esto no es cierto con 4GT.

VirtualAlloc normalmente devuelve direcciones bajas antes de las direcciones altas. Por lo tanto, es posible que el proceso no use direcciones muy altas a menos que asigne mucha memoria o tenga un espacio de direcciones virtuales fragmentado. Para forzar las asignaciones a asignar desde direcciones superiores antes de las direcciones inferiores con fines de prueba, especifique MEM_TOP_DOWN al llamar a VirtualAlloc o establezca el siguiente valor del Registro en 0x100000:

HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Control\Administrador de\ sesiones Administración de\ memoria AllocationPreference

Límites de memoria para versiones de Windows

Extensión de dirección física

Referencia técnica 4GT