Descripción de la correlación de memoria
La velocidad a la que se procesan las instrucciones de aplicación en un sistema es proporcional al número de operaciones de acceso requeridas para obtener datos fuera de la memoria direccionable por programa.
El sistema proporciona dos métodos para reducir la sobrecarga transaccional asociada con estas operaciones de lectura y escritura externas. Puede correlacionar datos de archivo en el espacio de direcciones de proceso. También puede correlacionar procesos con regiones de memoria anónimas que pueden ser compartidas por procesos cooperantes.
Los archivos correlacionados de memoria proporcionan un mecanismo para que un proceso acceda a los archivos incorporando directamente los datos de archivo en el espacio de direcciones del proceso. El uso de archivos correlacionados puede reducir significativamente el movimiento de datos de E/S, ya que los datos de archivo no se tienen que copiar en almacenamientos intermedios de datos de proceso, como hacen las subrutinas read y write . Cuando más de un proceso correlaciona el mismo archivo, su contenido se comparte entre ellos, proporcionando un mecanismo de baja sobrecarga mediante el cual los procesos pueden sincronizarse y comunicarse.
Las regiones de memoria correlacionadas, también denominadas áreas de memoria compartida, pueden servir como una agrupación grande para intercambiar datos entre procesos. Las subrutinas disponibles no proporcionan bloqueos ni control de acceso entre los procesos. Por lo tanto, los procesos que utilizan áreas de memoria compartida deben configurar un método de control de señal o semáforo para evitar conflictos de acceso y evitar que un proceso cambie los datos que otro está utilizando. Las áreas de memoria compartida pueden ser más beneficiosas cuando la cantidad de datos que deben intercambiarse entre procesos es demasiado grande para transferirse con mensajes, o cuando muchos procesos mantienen una base de datos común de gran tamaño.
El sistema proporciona dos métodos para correlacionar archivos y regiones de memoria anónimas. Las subrutinas siguientes, conocidas colectivamente como los servicios shmat , se utilizan normalmente para crear y utilizar segmentos de memoria compartida de un programa:
| Subrutina | Definición |
|---|---|
| shmctl | Controla las operaciones de memoria compartida |
| shmget | Obtiene o crea un segmento de memoria compartida |
| shmat | Conecta un segmento de memoria compartida desde un proceso. No le permite correlacionar dispositivos de bloque. |
| dt | Desconecta un segmento de memoria compartida de un proceso |
| mprotect | Modifica las protecciones de acceso de un rango de direcciones especificado dentro de un segmento de memoria compartida. |
| no reclamar | Elimina una correlación de un rango de direcciones especificado dentro de un segmento de memoria compartida |
La subrutina ftok proporciona la clave que la subrutina shmget utiliza para crear el segmento compartido
El segundo conjunto de servicios, conocido colectivamente como los servicios mmap , se utiliza normalmente para correlacionar archivos, aunque también se puede utilizar para crear segmentos de memoria compartida.
Todas las operaciones validas en la memoria resultante de mmap () de un archivo son validas en la memoria resultante de mmap () de un dispositivo de bloque. Un dispositivo de bloque es un archivo especial que proporciona acceso a un controlador de dispositivo que presenta una interfaz de bloque. Una interfaz de bloque para un controlador de dispositivo requiere acceso a datos en bloques de un tamaño fijo. La interfaz se utiliza normalmente para dispositivos de almacenamiento de datos.
Los servicios mmap incluyen las siguientes subrutinas:
| Subrutina | Definición |
|---|---|
| madvise | Aconseja al sistema el comportamiento de paginación esperado de un proceso |
| mincore | Determina la residencia de las páginas de memoria |
| mmap | Correlaciona un archivo de objeto en memoria virtual. Le permite correlacionar dispositivos de bloque de un proceso a la vez. |
| mprotect | Modifica las protecciones de acceso de la correlación de memoria |
| msync | Sincroniza un archivo correlacionado con su dispositivo de almacenamiento subyacente |
| munmap | Anular correlación de una región de memoria correlacionada |
msem_init, msem_lock, msem_unlock, msem_remove, msleep, y las subrutinas mwakeup proporcionan control de acceso para los procesos correlacionados utilizando los servicios mmap .
Consulte las secciones siguientes para obtener más información sobre la correlación de memoria:
Comparación de mmap con shmat
Al igual que con los servicios shmat, la parte del espacio de direcciones de proceso disponible para correlacionar archivos con los servicios mmap depende de si un proceso es un proceso de 32 bits o un proceso de 64 bits. Para procesos de 32 bits, la parte del espacio de direcciones disponible para la correlación consta de direcciones en el rango de0x30000000-0xCFFFFFFF, para un total de 2.5G bytes de espacio de direcciones. La parte del espacio de direcciones disponible para los archivos de correlación consta de direcciones en los rangos de0x30000000-0xCFFFFFFFy0xE0000000-0xEFFFFFFFpara un total de 2.75G bytes de espacio de direcciones. En AIX® 5.2 y posteriores, un proceso de 32 bits ejecutado con el modelo de espacio de direcciones muy grande tiene el rango 0x30000000-0xFFFFFFFF disponible para mapeos, con un total de hasta 3.25GB de espacio de direcciones.
Todos los rangos disponibles dentro del espacio de direcciones de proceso de 32 bits están disponibles para las correlaciones de ubicación fija y de ubicación variable. Las correlaciones de ubicación fija se producen cuando las aplicaciones especifican que una correlación se coloque en una ubicación fija dentro del espacio de direcciones. Las correlaciones de ubicación variable se producen cuando las aplicaciones especifican que el sistema debe decidir la ubicación en la que se debe colocar una correlación.
Para procesos de 64 bits, hay disponibles dos conjuntos de rangos de direcciones con el espacio de direcciones de proceso para correlaciones mmap o shmat . El primero, que consta del rango único0x07000000_00000000-0x07FFFFFF_FFFFFFFF, está disponible tanto para correlaciones de ubicación fija como de ubicación variable. El segundo conjunto de rangos de direcciones sólo está disponible para correlaciones de ubicación fija y consta de los rangos0x30000000-0xCFFFFFFF,0xE0000000-0xEFFFFFFF, y0x10_00000000-0x06FFFFFF_FFFFFFFF. El último rango de este conjunto, que consta de0x10_00000000-0x06FFFFFF_FFFFFFFF, también se pone a disposición del cargador del sistema para contener el texto del programa, los datos y el almacenamiento dinámico, por lo que sólo las partes no utilizadas del rango están disponibles para las correlaciones de ubicación fija.
Los servicios mmap y shmat proporcionan la posibilidad de que varios procesos correlacionen la misma región de un objeto de forma que compartan la direccionabilidad a ese objeto. Sin embargo, la subrutina mmap amplía esta posibilidad más allá de la proporcionada por la subrutina shmat al permitir que se establezca un número relativamente ilimitado de dichas correlaciones. Aunque esta función aumenta el número de correlaciones soportadas por objeto de archivo o segmento de memoria, puede resultar ineficaz para las aplicaciones en las que muchos procesos correlacionan los mismos datos de archivo en su espacio de direcciones.
La subrutina mmap proporciona una dirección de objeto exclusiva para cada proceso que se correlaciona con un objeto. El software lo consigue proporcionando a cada proceso una dirección virtual exclusiva, conocida como alias. La subrutina shmat permite a los procesos compartir las direcciones de los objetos correlacionados.
Puesto que sólo uno de los alias existentes para una página determinada de un objeto tiene una conversión de dirección real en un momento determinado, sólo una de las correlaciones de mmap puede hacer una referencia a dicha página sin incurrir en un error de página. Cualquier referencia a la página mediante una correlación diferente (y por lo tanto un alias diferente) da como resultado un error de página que hace que se invalide la conversión de dirección real existente para la página. Como resultado, se debe establecer una nueva traducción para el mismo bajo un alias diferente. Los procesos comparten páginas moviéndolas entre estas diferentes traducciones.
Para las aplicaciones en las que muchos procesos correlacionan los mismos datos de archivo en su espacio de direcciones, este proceso de conmutación puede afectar negativamente al rendimiento. En estos casos, la subrutina shmat puede proporcionar prestaciones de correlación de archivos más eficientes.
Utilice los servicios shmat en las circunstancias siguientes:
- Para la aplicación de 32 bits, once o menos archivos se correlacionan simultáneamente y cada uno es menor que 256MB.
- Al correlacionar archivos de más de 256MB.
- Cuando se correlacionan regiones de memoria compartida que deben compartirse entre procesos no relacionados (sin relación padre-hijo).
- Al correlacionar archivos completos.
Utilice mmap en las circunstancias siguientes:
- La portabilidad de la aplicación es una preocupación.
- Muchos archivos se correlacionan simultáneamente.
- Sólo es necesario correlacionar una parte de un archivo.
- Es necesario establecer la protección a nivel de página en la correlación.
- La correlación privada es necesaria.
Hay disponible una prestación "ampliada shmat" para aplicaciones de 32 bits con sus espacios de direcciones limitados. Si define la variable de entorno EXTSHM=ON, los procesos que se ejecutan en ese entorno pueden crear y adjuntar más de once segmentos de memoria compartida. El proceso puede adjuntar estos segmentos en el espacio de direcciones para el tamaño del segmento. Se puede adjuntar otro segmento al final del primero en la misma región de bytes 256M . La dirección a la que se puede adjuntar un proceso está en los límites de página, que es un múltiplo de SHMLBA_EXTSHM bytes.
Existen algunas restricciones sobre el uso de la característica shmat ampliada. Estas regiones de memoria compartida no se pueden utilizar como almacenamientos intermedios de E/S, donde el desanclaje del almacenamiento intermedio se produce en un manejador de interrupciones. Las restricciones sobre el uso de almacenamientos intermedios de E/S shmat ampliados son las mismas que las de los almacenamientos intermedios mmap .
La variable de entorno proporciona la opción de ejecutar una aplicación con la funcionalidad adicional de adjuntar más de 11 segmentos cuando EXTSHM=ON, o el acceso de rendimiento superior a 11 o menos segmentos cuando la variable de entorno no está establecida. De nuevo, la prestación "extended shmat" sólo se aplica a procesos de 32 bits.
Consideraciones sobre compatibilidad de mmap
Los servicios mmap se especifican mediante varios estándares y se utilizan comúnmente como la interfaz de correlación de archivos de elección en otras implementaciones del sistema operativo. Sin embargo, la implementación del sistema de la subrutina mmap puede diferir de otras implementaciones. La subrutina mmap incorpora las modificaciones siguientes:
- La correlación con el área privada de proceso no está soportada.
- Las correlaciones no se descorrelacionan implícitamente. Una operación mmap que especifica MAP_FIXED fallará si ya existe una correlación dentro del rango especificado.
- Para correlaciones privadas, la semántica de copia al escribir hace una copia de una página en la primera referencia de escritura.
- La correlación de E/S o memoria de dispositivo no está soportada.
- No se admite la correlación de dispositivos de caracteres o el uso de una región mmap como almacenamiento intermedio para una operación de lectura-escritura con un dispositivo de caracteres.
- La subrutina madvise se proporciona sólo para la compatibilidad. El sistema no realiza ninguna acción sobre el consejo especificado.
- La subrutina mprotect permite que la región especificada contenga páginas no correlacionadas. En funcionamiento, las páginas no correlacionadas simplemente se omiten.
- Las opciones específicas de OSF/AES para la correlación exacta predeterminada y para los distintivos MAP_INHERIT, MAP_HASSEMAPHOREy MAP_UNALINEADO no están soportadas.
Utilización de las subrutinas de semáforo
msem_init, msem_lock, msem_unlock, msem_remove, Las subrutinas msleep y mwakeup se ajustan a la especificación del entorno de aplicación OSF. Proporcionan una alternativa a las interfaces IPC como, por ejemplo, las subrutinas semget y semop . Las ventajas de utilizar los semáforos incluyen un método de serialización eficiente y la sobrecarga reducida de no tener que hacer una llamada al sistema en casos en los que no hay contención para el semáforo.
Los semáforos deben estar ubicados en una región de memoria compartida. Los semáforos se especifican mediante estructuras msemaphore . Todos los valores de una estructura msemaphore deben ser el resultado de una llamada de subrutina msem_init . Esta llamada puede ir seguida o no de una secuencia de llamadas a la subrutina msem_lock o a la subrutina msem_unlock . Si los valores de la estructura msemaphore se han originado de otra forma, los resultados de las subrutinas de semáforo no están definidos.
La dirección de la estructura msemaphore es significativa. Debe tener cuidado de no modificar la dirección de la estructura. Si la estructura contiene valores copiados de una estructura msemaphore en otra dirección, los resultados de las subrutinas de semáforo no están definidos.
Las subrutinas de semáforo pueden ser menos eficaces cuando las estructuras de semáforo existen en regiones de memoria anónimas creadas con la subrutina mmap , especialmente en los casos en los que muchos procesos hacen referencia a los mismos semáforos. En estos casos, las estructuras de semáforo deben asignarse fuera de las regiones de memoria compartida creadas con las subrutinas shmget y shmat .
Archivos de correlación con la subrutina shmat
La correlación se puede utilizar para reducir la sobrecarga que implica escribir y leer el contenido de los archivos. Una vez que el contenido de un archivo es mapeado a un area de memoria de usuario, el archivo puede ser manipulado como si fuera datos en memoria, usando punteros a esos datos en lugar de llamadas de entrada/salida. La copia del archivo en disco también sirve como área de paginación para ese archivo, ahorrando espacio de paginación.
Un programa puede utilizar cualquier archivo normal como archivo de datos correlacionados. También puede ampliar las características de los archivos de datos correlacionados a archivos que contienen código de objeto compilado y ejecutable. Debido a que se puede acceder a los archivos correlacionados más rápidamente que a los archivos regulares, el sistema puede cargar un programa más rápidamente si su archivo de objeto ejecutable se correlaciona con un archivo.
Para crear un programa como un archivo ejecutable correlacionado, compile y enlace el programa utilizando el distintivo -K con el mandato cc o ld . El distintivo -K indica al enlazador que cree un archivo de objeto con un formato alineado de página. Es decir, cada parte del archivo de objeto se inicia en un límite de página (una dirección que se puede dividir por 2K bytes sin resto). Esta opción da como resultado algún espacio vacío en el archivo de objeto, pero permite que el archivo ejecutable se correlacione con la memoria. Cuando el sistema correlaciona un archivo de objeto en memoria, las partes de texto y datos se manejan de forma diferente.
Copiar al grabar archivos correlacionados
Para evitar que los cambios realizados en los archivos correlacionados aparezcan inmediatamente en el archivo en el disco, correlacione el archivo como un archivo de copia al grabar. Esta opción crea un archivo correlacionado con cambios que se guardan en el espacio de paginación del sistema, en lugar de en la copia del archivo en disco. Debe elegir escribir estos cambios en la copia en disco para guardar los cambios. De lo contrario, perderá los cambios al cerrar el archivo.
Puesto que los cambios no se reflejan inmediatamente en la copia del archivo a la que otros usuarios pueden acceder, utilice los archivos correlacionados de copia al grabar sólo entre los procesos que cooperen entre sí.
El sistema no detecta el final de los archivos correlacionados con la subrutina shmat . Por lo tanto, si un programa escribe más allá del final actual del archivo en un archivo correlacionado de copia al grabar almacenando en el segmento de memoria correspondiente (donde se correlaciona el archivo), el archivo real en el disco se amplía con bloques de ceros en preparación para los nuevos datos. Si el programa no utiliza la subrutina fsync antes de cerrar el archivo, los datos grabados más allá del final anterior del archivo no se graban en el disco. El archivo aparece más grande, pero contiene sólo los ceros añadidos. Por lo tanto, utilice siempre la subrutina fsync antes de cerrar un archivo correlacionado de copia al grabar para conservar los datos añadidos o modificados.
Correlación de segmentos de memoria compartida con la subrutina shmat
El sistema utiliza segmentos de memoria compartida de forma similar a la forma en que crea y utiliza archivos. La definición de los términos utilizados para la memoria compartida con respecto a los términos más familiares del sistema de archivos es fundamental para comprender la memoria compartida. A continuación se muestra una lista de definiciones de términos de memoria compartida:
| Plazo | Definición |
|---|---|
| key | Identificador exclusivo de un segmento compartido determinado. Se asocia con el segmento compartido siempre que exista el segmento compartido. En este sentido, es similar al nombre de archivo de un archivo. |
| shmid | Identificador asignado al segmento compartido para su uso dentro de un proceso determinado. Es similar en uso a un descriptor de archivo para un archivo. |
| adjuntar | Especifica que un proceso debe adjuntar un segmento compartido para poder utilizarlo. Adjuntar un segmento compartido es similar a abrir un archivo. |
| detach | Especifica que un proceso debe desconectar un segmento compartido una vez que haya terminado de utilizarlo. La desconexión de un segmento compartido es similar a cerrar un archivo. |