Articulo de referencia

Memoria compartida

Ilustración de un sistema de memoria compartida de tres procesadores. En informática , la memoria compartida es aquella a la que pueden acceder simultáneamente varios programas ...

Ilustración de un sistema de memoria compartida de tres procesadores.

En informática , la memoria compartida es aquella a la que pueden acceder simultáneamente varios programas con el fin de facilitar la comunicación entre ellos o evitar copias redundantes. La memoria compartida es un método eficiente para transferir datos entre programas. Dependiendo del contexto, los programas pueden ejecutarse en un único procesador o en varios procesadores independientes.

El uso de la memoria para la comunicación dentro de un mismo programa, por ejemplo entre sus múltiples hilos , también se conoce como memoria compartida.

En hardware

HSA define un caso especial de compartición de memoria, donde la MMU de la CPU y la IOMMU de la GPU tienen un espacio de direcciones virtuales paginable idéntico.

En el ámbito del hardware informático, la memoria compartida se refiere a un bloque (normalmente grande) de memoria de acceso aleatorio (RAM) al que pueden acceder varias unidades centrales de procesamiento (CPU) diferentes en un sistema informático multiprocesador .

Los sistemas de memoria compartida pueden utilizar: [ 1 ]

Un sistema de memoria compartida es relativamente fácil de programar, ya que todos los procesadores comparten una única vista de los datos y la comunicación entre ellos puede ser tan rápida como los accesos a la misma ubicación de memoria. El problema con los sistemas de memoria compartida es que muchas CPU necesitan un acceso rápido a la memoria y probablemente la almacenarán en caché , lo que tiene dos complicaciones:

  • Degradación del tiempo de acceso: cuando varios procesadores intentan acceder a la misma ubicación de memoria, se produce una contención . Intentar acceder a ubicaciones de memoria cercanas puede provocar un falso compartimiento . Los ordenadores con memoria compartida no pueden escalar muy bien. La mayoría de ellos tienen diez o menos procesadores;
  • Falta de coherencia de datos: cuando una caché se actualiza con información que pueden usar otros procesadores, el cambio debe reflejarse en los demás, de lo contrario, trabajarán con datos incoherentes. Estos protocolos de coherencia de caché , cuando funcionan correctamente, pueden proporcionar un acceso de altísimo rendimiento a la información compartida entre múltiples procesadores. Sin embargo, en ocasiones pueden sobrecargarse y convertirse en un cuello de botella para el rendimiento.

Se pueden utilizar tecnologías como conmutadores de barra cruzada , redes Omega , HyperTransport o bus frontal para mitigar los efectos de cuello de botella.

En el caso de una arquitectura de sistema heterogénea (arquitectura de procesador que integra diferentes tipos de procesadores, como CPU y GPU , con memoria compartida), la unidad de gestión de memoria (MMU) de la CPU y la unidad de gestión de memoria de entrada/salida (IOMMU) de la GPU deben compartir ciertas características, como un espacio de direcciones común.

Las alternativas a la memoria compartida son la memoria distribuida y la memoria compartida distribuida , cada una con un conjunto similar de problemas.

En software

En el software informático, la memoria compartida es o

  • un método de comunicación entre procesos (IPC), es decir, una forma de intercambiar datos entre programas que se ejecutan al mismo tiempo. Un proceso creará un área en la RAM a la que otros procesos pueden acceder;
  • Método para ahorrar espacio de memoria: redirigir los accesos a lo que normalmente serían copias de un dato a una única instancia, mediante el uso de asignaciones de memoria virtual o con soporte explícito del programa en cuestión. Este método se utiliza con mayor frecuencia para bibliotecas compartidas y para la ejecución en el mismo lugar (XIP).

Dado que ambos procesos pueden acceder al área de memoria compartida como si fuera memoria de trabajo normal, esta es una forma de comunicación muy rápida (a diferencia de otros mecanismos de IPC como tuberías con nombre , sockets de dominio Unix o CORBA ). Por otro lado, es menos escalable, ya que, por ejemplo, los procesos que se comunican deben ejecutarse en la misma máquina (de otros métodos de IPC, solo los sockets de dominio de Internet, no los de dominio Unix, pueden usar una red informática ), y se debe tener cuidado para evitar problemas si los procesos que comparten memoria se ejecutan en CPU separadas y la arquitectura subyacente no es coherente con la caché .

La comunicación entre procesos (IPC) mediante memoria compartida se utiliza, por ejemplo, para transferir imágenes entre la aplicación y el servidor X en sistemas Unix, o dentro del objeto IStream devuelto por CoMarshalInterThreadInterfaceInStream en las bibliotecas COM de Windows .

Las bibliotecas dinámicas generalmente se almacenan una sola vez en la memoria y se asignan a múltiples procesos, y solo se duplican las páginas que tuvieron que personalizarse para el proceso individual (porque un símbolo se resolvía de manera diferente allí), generalmente con un mecanismo conocido como copia en escritura que copia la página de forma transparente cuando se intenta escribir y luego permite que la escritura tenga éxito en la copia privada.

En comparación con los sistemas operativos de espacio de direcciones múltiples, el uso compartido de memoria, especialmente de procedimientos compartidos o estructuras basadas en punteros, es más sencillo en los sistemas operativos de espacio de direcciones único . [ 2 ]

Compatibilidad con sistemas tipo Unix

POSIX proporciona una API estandarizada para usar memoria compartida, POSIX Shared Memory . Esta usa la función shm_opende sys/mman.h. [ 3 ] La comunicación entre procesos de POSIX (parte de la extensión POSIX:XSI) incluye las funciones de memoria compartida shmat, shmctl, shmdty shmget. [ 4 ] [ 5 ] Unix System V también proporciona una API para memoria compartida. Esta usa shmget de sys/shm.h. Los sistemas BSD proporcionan "memoria mapeada anónima" que puede ser utilizada por varios procesos.

La memoria compartida creada por shm_openes persistente. Permanece en el sistema hasta que un proceso la elimina explícitamente. Esto tiene la desventaja de que si el proceso falla y no logra liberar la memoria compartida, esta permanecerá hasta el apagado del sistema; esta limitación no está presente en una implementación específica de Android denominada ashmem. [ 6 ]

POSIX también proporciona la mmapAPI para asignar archivos a la memoria; una asignación puede ser compartida, lo que permite que el contenido del archivo se utilice como memoria compartida.

Las distribuciones de Linux basadas en el kernel 2.6 y posteriores ofrecen /dev/shm como memoria compartida en forma de disco RAM , más específicamente como un directorio con permisos de escritura para todos los usuarios (un directorio en el que cualquier usuario del sistema puede crear archivos) que se almacena en memoria. Tanto las distribuciones basadas en Red Hat como en Debian lo incluyen por defecto. La compatibilidad con este tipo de disco RAM es completamente opcional dentro del archivo de configuración del kernel . [ 7 ]

Compatibilidad con Windows

En Windows, se pueden usar CreateFileMappingfunciones MapViewOfFilepara asignar una región de un archivo a la memoria en múltiples procesos. [ 8 ]

Compatibilidad multiplataforma

Algunas bibliotecas de C++ proporcionan acceso portátil y orientado a objetos a la funcionalidad de memoria compartida. Por ejemplo, Boost contiene la biblioteca Boost.Interprocess de C++ [ 9 ] y Qt proporciona la clase QSharedMemory. [ 10 ]

Compatibilidad con lenguajes de programación

En lenguajes de programación con enlaces POSIX (por ejemplo, C/C++), las regiones de memoria compartida se pueden crear y acceder mediante las funciones que proporciona el sistema operativo. Otros lenguajes de programación pueden tener sus propias maneras de utilizar estas funcionalidades del sistema operativo para lograr un efecto similar. Por ejemplo, PHP proporciona una API para crear memoria compartida, similar a las funciones POSIX . [ 11 ]

Véase también

Referencias

  1. El-Rewini, Hesham; Abd-El-Barr, Mostafa (2005). Arquitectura informática avanzada y procesamiento paralelo . Wiley-Interscience. págs. 77–80 . ISBN  978-0-471-46740-3.
  2. Jeffrey S. Chase; Henry M. Levy; Michael J. Feeley; y Edward D. Lazowska. "Compartición y protección en un sistema operativo con un único espacio de direcciones" . doi : 10.1145/195792.195795 1993. pág. 3
  3. Documentación de shm_open de la Especificación Única de Unix
  4. ↑ Robbins, Kay A.; Robbins , Steven (2003). Programación de sistemas Unix: comunicación, concurrencia e hilos (2.ª ed.). Prentice Hall PTR. pág. 512. ISBN   978-0-13-042411-2. Consultado el 13 de mayo de 2011. La comunicación entre procesos (IPC) de POSIX forma parte de la extensión POSIX:XSI y tiene su origen en la comunicación entre procesos de Unix System V.
  5. Funcionalidad de memoria compartida de la Especificación Única de Unix.
  6. "Características del kernel de Android" . elinux.org . Consultado el 12 de diciembre de 2022 .
  7. Christoph Rohland; Hugh Dickins; KOSAKI Motohiro. "tmpfs.txt" . kernel.org . Consultado el 16 de marzo de 2010 .
  8. Creación de memoria compartida con nombre ( de MSDN).
  9. Biblioteca Boost.Interprocess para C++
  10. "Referencia a la clase QSharedMemory" .
  11. Funciones de memoria compartida en la API de PHP
  • IPC: Memoria compartida por Dave Marshall
  • Introducción a la memoria compartida , Cap. 12 del libro de Richard Stevens "Programación de redes UNIX, Volumen 2, Segunda edición: Comunicaciones entre procesos".
  • SharedHashFile , una tabla hash de memoria compartida de código abierto.