Soporte de programa grande

Este tema proporciona información sobre cómo utilizar los modelos de espacio de direcciones grandes y muy grandes para acomodar los programas que requieren áreas de datos que son más grandes que las proporcionadas por el modelo de espacio de direcciones predeterminado.

El modelo de espacio de direcciones grande está disponible en AIX® 4.3 y posteriores. El modelo de espacio de direcciones muy grande está disponible en AIX 5.1 y posteriores.

Nota: Esta discusión sólo se aplica a procesos de 32 bits.

El espacio de direcciones virtual de un proceso de 32 bits se divide en 16 áreas de 256 megabytes (o segmentos), cada una de las cuales se direcciona mediante un registro de hardware independiente. El sistema operativo hace referencia al segmento 2 (direcciones virtuales 0x20000000-0x2FFFFFFF) como el segmento process-private . De forma predeterminada, este segmento contiene la pila de usuario y los datos, incluido el almacenamiento dinámico. El segmento proceso-privado también contiene el bloque u del proceso, que es utilizado por el sistema operativo y no es legible por una aplicación.

Puesto que se utiliza un único segmento para los datos de usuario y la pila, su tamaño de agregado máximo es ligeramente inferior a 256 MB. Sin embargo, determinados programas requieren grandes áreas de datos (inicializadas o no inicializadas), o necesitan asignar grandes cantidades de memoria con la subrutina malloc o sbrk . Los programas se pueden crear para utilizar el modelo de espacio de direcciones grande o muy grande, lo que les permite utilizar hasta 2 GB de datos.

Es posible utilizar el modelo de espacio de direcciones grande o muy grande con un programa existente, proporcionando un valor maxdatadistinto de cero. El valor maxdata se obtiene de la variable de entorno LDR_CNTRL o de un campo del archivo ejecutable. Algunos programas tienen dependencias en el modelo de espacio de direcciones predeterminado y se interrumpen si se ejecutan utilizando el modelo de espacio de direcciones grande.

Descripción del modelo de espacio de direcciones grande

El modelo de espacio de direcciones grande permite a los programas especificados utilizar más de 256 MB de datos. Otros programas siguen utilizando el modelo de espacio de direcciones predeterminado. Para permitir que un programa utilice el modelo de espacio de direcciones grande, especifique un valor maxdata distinto de cero. Puede especificar un valor maxdata distinto de cero utilizando el mandato ld al crear el programa o exportando la variable de entorno LDR_CNTRL antes de ejecutar el programa.

Cuando se ejecuta un programa que utiliza el modelo de espacio de direcciones grande, el sistema operativo reserva tantos segmentos de 256 MB como sea necesario para contener la cantidad de datos especificada por el valor maxdata . A continuación, a partir del segmento 3, los datos inicializados del programa se leen del archivo ejecutable en la memoria. Los datos leídos empiezan en el segmento 3, incluso si el valor de maxdata es menor que 256 MB. Con el modelo de espacio de direcciones grande, un programa puede tener un máximo de 8 segmentos o 2 GB o 3.25 GB de datos respectivamente.

En el modelo de espacio de direcciones predeterminado, hay 12 segmentos disponibles para que los utilicen las subrutinas shmat o mmap . Cuando se utiliza el modelo de espacio de direcciones grande, el número de segmentos reservados para los datos reduce el número de segmentos disponibles para las subrutinas shmat y mmap . Debido a que el tamaño máximo de los datos es de 2 GB, al menos dos segmentos están siempre disponibles para las subrutinas shmat y mmap .

La pila de usuarios permanece en el segmento 2 cuando se utiliza el modelo de espacio de direcciones grande. Como resultado, el tamaño de la pila está limitado a un poco menos de 256 MB. Sin embargo, una aplicación puede reubicar su pila de usuario en un segmento de memoria compartida o en memoria asignada.

Aunque el tamaño de los datos inicializados en un programa puede ser grande, todavía hay una restricción en el tamaño del texto. En el archivo ejecutable para un programa, el tamaño de la sección de texto más el tamaño de la sección de cargador debe ser inferior a 256 MB. Esto es necesario para que estas secciones quepan en un único segmento de sólo lectura (segmento 1, el segmento TEXT). Puede utilizar el mandato dump para examinar los tamaños de sección.

Descripción del modelo de espacio de direcciones muy grande

El modelo de espacio de direcciones muy grande permite programas de datos grandes de la misma forma que el modelo de espacio de direcciones grande, aunque hay varias diferencias entre ellos. Para permitir que un programa utilice el modelo de espacio de direcciones muy grande, debe especificar un valor maxdata y la propiedad de asignación dinámica de segmentos (dsa). Utilice el mandato ld o la variable de entorno LDR_CNTRL para especificar un valor maxdata y la opción DSA .

Si se especifica un valor maxdata , el modelo de espacio de direcciones muy grande sigue el modelo de espacio de direcciones grande en el que los datos de un programa se leen en la memoria empezando por el segmento 3 y ocupa tantos segmentos como sea necesario. Sin embargo, los segmentos de datos restantes no están reservados para el área de datos en tiempo de ejecución, sino que se obtienen dinámicamente. Hasta que se necesite un segmento para el área de datos de un programa, lo pueden utilizar las subrutinas shmat o mmap . Con el modelo de espacio de direcciones muy grande, un programa puede tener un máximo de 13 segmentos o 3.25 GB de datos. De estos 13 segmentos, 12 segmentos o 3 GB, están disponibles para fines de subrutina shmat y mmap .

Cuando un proceso intenta expandir su área de datos en un nuevo segmento, la operación se realiza correctamente siempre que el segmento no esté siendo utilizado por las subrutinas shmat o mmap . Un programa puede llamar a la subrutina shmdt o munmap para dejar de utilizar un segmento para que el segmento se pueda utilizar para el área de datos. Sin embargo, una vez que se ha utilizado un segmento para el área de datos, ya no se puede utilizar para ningún otro fin, incluso si se reduce el tamaño del área de datos.

Si no se especifica un valor maxdata (maxdata = 0) con la propiedad dsa, se consigue una ligera variación respecto al comportamiento anterior. El proceso tendrá sus datos y pila en el segmento 2, similar a un proceso regular. El proceso no tendrá acceso a las bibliotecas compartidas globales, por lo que todas las bibliotecas compartidas utilizadas por el proceso se cargarán de forma privada. La ventaja de ejecutar de esta forma es que un proceso tendrá los 13 segmentos (3.25 GB) disponibles para que los utilicen las subrutinas shmat y mmap .

Para reducir las posibilidades de que las subrutinas shmat o mmap utilicen un segmento que se pueda utilizar para el área de datos, el sistema operativo utiliza una regla diferente para elegir una dirección que se va a devolver (si no se solicita una dirección específica). Normalmente, las subrutinas shmat o mmap devuelven una dirección en el segmento más bajo disponible. Cuando se utiliza el modelo de espacio de direcciones muy grande, estas subrutinas devolverán una dirección en el segmento más alto disponible. Una solicitud de una dirección específica será satisfactoria, siempre que la dirección no esté en un segmento que ya se haya utilizado para el área de datos. Este comportamiento se sigue para todos los procesos que especifican la propiedad dsa.

Con el modelo de espacio de direcciones muy grande, se puede especificar un valor maxdata de cero o un valor de hasta 0xD0000000 . Si se especifica un valor de maxdata mayor que 0xAFFFFFFF , un programa no utilizará bibliotecas compartidas cargadas globalmente. En su lugar, todas las bibliotecas compartidas se cargarán de forma privada. Esto puede afectar al rendimiento del programa.

Habilitación de los modelos de espacio de direcciones grandes y muy grandes

El modelo de espacio de direcciones grande se utiliza si se especifica un valor distinto de cero para el valor maxdata y no se especifica la propiedad de asignación dinámica de segmentos (dsa). El modelo de espacio de direcciones muy grande se utiliza si se proporciona algún valor maxdata y se especifica la propiedad dsa. Utilice el mandato ld con el distintivo -bmaxdata para especificar un valor maxdata y para establecer la propiedad dsa.

Utilice el mandato siguiente para enlazar un programa que tendrá un máximo de 8 segmentos reservados para sus datos:
cc -bmaxdata:0x80000000 sample.o 
Para enlazar un programa con el modelo de espacio de direcciones muy grande activado en la plataforma basada en el procesador POWER®, utilice el siguiente comando:
cc -bmaxdata:0xD0000000/dsa sample.o 
Para enlazar un programa con el modelo de espacio de direcciones muy grande habilitado, utilice el mandato siguiente:
cc -bmaxdata:0xD0000000/dsa sample.o 
Puede hacer que los programas existentes utilicen los modelos de espacio de direcciones grandes o muy grandes especificando el valor maxdata con la variable de entorno LDR_CNTRL . Por ejemplo, utilice el mandato siguiente para ejecutar el programa a.out con 8 segmentos reservados para el área de datos:
LDR_CNTRL=MAXDATA=0x80000000 a.out
El mandato siguiente ejecuta el programa a.out utilizando el modelo de espacio de direcciones muy grande, lo que permite que el tamaño de datos del programa utilice hasta 8 segmentos para los datos:
LDR_CNTRL=MAXDATA=0x80000000@DSA a.out
También puede modificar un programa existente para que utilice el modelo de espacio de direcciones grande o muy grande. Para establecer el valor maxdata en un programa XCOFF de 32 bits existente, a.out, en 0x80000000, utilice el mandato siguiente:
/usr/ccs/bin/ldedit -bmaxdata:0x80000000 a.out
Si un programa XCOFF de 32 bits existente, a.out, con un valor maxdata de 0x80000000 todavía no tiene la propiedad DSA , puede añadir la propiedad con el mandato siguiente:
/usr/ccs/bin/ldedit -bmaxdata:0x80000000/dsa a.out

Puede utilizar el mandato dump para examinar el valor maxdata o para determinar si un programa tiene la propiedad dsa.

Algunos programas tienen dependencias en el modelo de espacio de direcciones predeterminado. Estos programas terminan si se ha especificado un valor maxdata distinto de cero, modificando el archivo ejecutable del programa o estableciendo la variable de entorno LDR_CNTRL .

Ejecución de programas con áreas de datos grandes

Cuando ejecuta un programa que utiliza el modelo de espacio de direcciones grande, el sistema operativo intenta modificar el límite flexible del tamaño de datos, si es necesario, para aumentarlo para que coincida con el valor maxdata . Si el valor de maxdata es mayor que el límite fijo actual en el tamaño de datos, el programa no se ejecutará si la variable de entorno XPG_SUS_ENV tiene el valor establecido en ON, o el límite flexible se establecerá en el límite fijo actual.

Si el valor de maxdata es menor que el tamaño de los datos estáticos del programa, el programa no se ejecutará.

Después de colocar los datos inicializados y no inicializados del programa en los segmentos 3 y posteriores, se calcula el valor de ruptura. El valor de interrupción define el final de los datos estáticos del proceso y el inicio de sus datos asignables dinámicamente. Utilizando la subrutina malloc, brk o sbrk , un proceso puede mover el valor de ruptura para aumentar el tamaño del área de datos.

Por ejemplo, si el valor de maxdata especificado por un programa es 0x68000000, el valor de interrupción máximo se encuentra en el medio del segmento 9 (0x98000000). La subrutina brk amplía el valor de ruptura entre límites de segmento, pero el tamaño del área de datos no puede sobrepasar el límite de datos flexible actual.

La subrutina setrlimit permite a un proceso establecer su límite de datos flexibles en cualquier valor que no supere el límite de datos fijos. Sin embargo, el tamaño máximo del área de datos está limitado al valor maxdata original, redondeado a un múltiplo de 256 MB.

La mayoría de las subrutinas no se ven afectadas por programas de datos grandes. Las subrutinas shmat y mmap son las más afectadas, porque tienen menos segmentos disponibles para su uso. Si un programa modelo de dirección de datos grande se bifurca, el proceso hijo hereda los límites de recursos de datos actuales.

Consideraciones especiales

Los programas con espacios de datos grandes requieren una gran cantidad de espacio de paginación. Por ejemplo, si un programa con un espacio de direcciones de 2 GB intenta acceder a cada página de su espacio de direcciones, el sistema debe tener 2 GB de espacio de paginación. El sistema operativo termina los procesos cuando el espacio de paginación se agota. Los programas con espacios de datos grandes se terminan primero porque normalmente consumen una gran cantidad de espacio de paginación.

La depuración de programas utilizando el modelo de datos grande no es diferente a la depuración de otros programas. El mandato dbx puede depurar estos programas grandes de forma activa o desde un volcado del núcleo. Un volcado de núcleo completo de un programa de datos de gran tamaño puede ser bastante grande. Para evitar archivos principales truncados, asegúrese de que el límite de recursos coredump sea lo suficientemente grande y asegúrese de que haya suficiente espacio libre en el sistema de archivos donde se ejecuta el programa.

Algunos programas de aplicación pueden escribirse de tal forma que se basen en las características del modelo de espacio de direcciones predeterminado. Es posible que estos programas no funcionen si se ejecutan utilizando el modelo de espacio de direcciones grande o muy grande. No establezca la variable de entorno LDR_CNTRL cuando ejecute estos programas.

Los procesos que utilizan el modelo de espacio de direcciones muy grande deben realizar cambios de código en sus programas para poder mover el valor de interrupción del espacio de direcciones en fragmentos de más de 2 GB. Se trata de una limitación de la llamada al sistema sbrk que toma un valor firmado como parámetro. Como método alternativo, un programa puede llamar a sbrk más de una vez para mover el valor de interrupción a la posición deseada.