¿Por qué el mecanismo de montón (LFH) de fragmentación baja puede deshabilitarse en algunos equipos que ejecutan Windows Server 2003, Windows XP o Windows 2000

Se aplica a: Microsoft Windows Server 2003 Enterprise Edition (32-bit x86)Microsoft Windows Server 2003 Standard Edition (32-bit x86)Microsoft Windows XP Professional

INTRODUCCIÓN


En algunos equipos que ejecutan Microsoft Windows Server 2003, Microsoft Windows XP o Microsoft Windows 2000, el mecanismo de montón (LFH) de fragmentación baja puede estar deshabilitado. Este artículo describe las causas de este comportamiento. También se describe cómo se puede evitar este comportamiento.

Más información


Fragmentación del montón

En la asignación de memoria basado en montones, se asigna la memoria de un grupo grande de memoria no utilizada. Este grupo se denomina montón.

Cuando la memoria disponible se divide en pequeños bloques no contiguos, esto se conoce como fragmentación del montón. Cuando se produce la fragmentación del montón, asignación de memoria puede fallar, incluso si no hay suficiente memoria en el montón para satisfacer la solicitud. Este comportamiento se produce porque no hay un bloque de memoria es suficiente para satisfacer la solicitud de asignación. Para los programas que tienen requisitos de poca memoria, el montón estándar es suficiente. Normalmente, fragmentación de montón no provoca errores de asignación. Sin embargo, si el programa asigna memoria con frecuencia, y si el programa utiliza una variedad de tamaños de asignación, asignación de memoria puede fallar debido a la fragmentación del montón.

Montón de fragmentación baja

El mecanismo de montón de fragmentación baja (LFH) se introdujo en Windows 2000 y se incluye en Windows XP y en Windows Server 2003. Aunque este mecanismo se basa en el montón existente, correctamente reduce la fragmentación de la memoria del montón.
Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:

816542 la característica de algoritmo de montículo de fragmentación baja de la Windows XP está disponible para Windows 2000

Si programas asignan grandes cantidades de memoria en diversos tamaños de asignación, es óptimo si utilizan LFH. LFH asigna bloques de memoria que sean tan grandes como 16 kilobytes (KB). Para bloques de memoria mayores de 16 KB, la LFH utiliza el montón estándar. Para obtener más información, visite el siguiente sitio Web de Microsoft:El algoritmo LFH reduce la fragmentación del montón. Además, el algoritmo LFH mejora el rendimiento de asignación del montón Win32. Este algoritmo funciona mediante asignación de bloques de memoria de longitud variable o cancelar la asignación de bloques de memoria de longitud variable. Este algoritmo también funciona bien en equipos con varios procesadores.

¿Por qué no se puede habilitar la LFH

No se puede habilitar la LFH si utiliza determinados indicadores globales (gflags) que están relacionados con el montón. Puede establecer estos gflags mediante la herramienta Gflags incluida en muchas versiones de Windows y que también se incluye en las ventanas de herramientas de depuración. Para obtener más información acerca de estas herramientas de depuración, visite el siguiente sitio Web de Microsoft:Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:

243043 cómo establecer el valor de registro de GlobalFlag mediante la herramienta Gflags.exe

Indicadores globales que pueden deshabilitar LFH

Aunque se utilizan indicadores globales en la depuración, puede deshabilitar involuntariamente el LFH al usarlos. Puede utilizar la herramienta Gflags para habilitar diferentes indicadores globales para un programa. Puede ejecutar la herramienta Gflags desde la línea de comandos, o puede utilizar el cuadro de diálogo de interfaz gráfica de usuario para ejecutar la herramienta Gflags. Cuando utiliza el cuadro de diálogo de la interfaz gráfica de usuario, debe establecer las opciones de marca global diferente en la ficha Archivo de imagen en la herramienta Gflags. Para obtener más información acerca de las opciones de línea de comandos, visite el siguiente sitio Web de Microsoft TechNet:Por ejemplo, puede utilizar los comandos siguientes en un símbolo del sistema para instalar los indicadores globales o desinstalar los indicadores globales para el programa Bloc de notas:
gflags /i notepad.exe +hpc
Gflags /i notepad.exe: hpc

El primer comando instala los indicadores globales, y el segundo comando desinstala los indicadores globales. En estos comandos, "hpc" significa "Habilitar comprobación de parámetros de montón". Cuando se habilita un indicador global, cree un valor hexadecimal para la subclave del programa bajo la subclave del registro siguiente:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
Por ejemplo, cuando se establece el indicador global de un programa, se crea una entrada del Registro similar al siguiente:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File ejecución seguridad\ < Myprogram.exe >
Nombre: GlobalFlag
Tipo de valor: DWORD
Datos del valor: 0x00000040
Puede establecer las siguientes opciones en la ficha Archivo de imagen en la herramienta Gflags.
GflagDatos de valor¿Afecta a LFH?
Detener en excepciones00000001No
Deshabilitar la extensión de la pila00010000No
Mostrar instantáneas de cargador00000002No
Habilitar la comprobación de la cola de montón00000010
Habilitar saltos críticos del sistema100000No
Habilitar la comprobación libre de montón00000020
Deshabilitar el montón se aglutinan en libre200000No
Habilitar comprobación de parámetros de montón00000040
Habilitar la validación de montón en llamada00000080
Habilitar el Comprobador de aplicación00000100No
Habilitar el montón de la página02000000
Habilitar el etiquetado de montón00000800
Crear base de datos de seguimiento de pila de usuario modo00001000No
Creación de evento de sección crítica temprana10000000No
Habilitar el etiquetado de montón por DLL00008000No
Deshabilitar la comprobación de DLL protegida80000000No
Nota: Si configura más de un gflag, el valor de la entrada de registro será la suma de los valores de todos los gflags que establezca.

El valor de PageHeapFlags

La entrada de registro PageHeapFlags se encuentra por separado bajo la siguiente subclave del registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File ejecución seguridad\ < My_Program.exe >
La entrada de registro PageHeapFlags se utiliza junto con los valores de entrada del registro de GlobalFlag. A menos que se dedica a depurar o rastrear un problema con la Ayuda de los servicios de soporte técnico de Microsoft, se recomienda que mantenga el valor de PageHeapFlags establecido en 0 en todo momento.

Cuando utiliza la herramienta Gflags para habilitar el montón de la página, el valor de la entrada de registro PageHeapFlags se establece a 0 x 00000003. Desactivando la casilla de verificación Habilitar el montón de la página y aplicar los cambios no eliminar ni cambiar el valor de la entrada de registro PageHeapFlags. En su lugar, desactivar esta casilla de verificación establece el valor GlobalFlag para el montón de página a 0. Este valor en 0 reemplaza y deshabilita el comportamiento que se configura mediante la entrada de registro PageHeapFlags. Como alternativa, puede eliminar la entrada de registro PageHeapFlags o cambiar manualmente el valor a 0 sin utilizar la herramienta Gflags.

Otros marcadores que pueden deshabilitar LFH

Además, la siguiente gflags también puede deshabilitar LFH.

El indicador HEAP_NO_SERIALIZE

De forma predeterminada, no se establece el indicador HEAP_NO_SERIALIZE para el HeapAlloc() de la API. Cuando se serializa el acceso del montón, dos o más subprocesos pueden asignar memoria y pueden liberar memoria en el mismo montón al mismo tiempo. Si se establece este indicador, se deshabilita LFH. Cuando se establece este indicador, significa que la exclusión mutua no se utilizará cuando las funciones del montón asignan memoria desde este montón.

El indicador HEAP_GROWABLE

Cuando el indicador HEAP_GROWABLE no se establece como un indicador para RtlCreateHeal(), LFH está deshabilitado. Cuando no se puede ampliar el montón, puede haber suficiente espacio en el montón de la aplicación debido a la gran superficie de LFH. Al establecer este indicador, se habilita el montón a crecer según sea necesario. Debe especificar este indicador si la dirección de HeapBase es NULL.

Cómo impedir que los depuradores de deshabilitar LFH

Cuando se utiliza un depurador, LFH no funcionen como se esperaba. Este comportamiento puede producirse debido a varias opciones de depuración. De forma predeterminada, estas opciones están habilitadas con frecuencia de depuración. Para evitar este problema, utilice uno de los métodos siguientes.

Método 1

Cuando se utiliza el depurador WinDbg o el depurador Cdb, puede utilizar el siguiente comando para deshabilitar las opciones de depuración del montón:
-hd

Método 2

Puede impedir que el depurador WinDbg o el depurador Cdb deshabilitar LFH utilizando el siguiente comando para establecer una variable de entorno:
Establecer NO_DEBUG_HEAP = 1
También puede utilizar la siguiente configuración de la imagen. Sin embargo, no recomendamos esta opción como alta.
Establezca NtGlobalFlags = 0