De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda
Una ilustración de un sistema de memoria compartida de tres procesadores.

En informática , la memoria compartida es una memoria a la que pueden acceder simultáneamente varios programas con la intención de proporcionar comunicación entre ellos o evitar copias redundantes. La memoria compartida es un medio eficaz para pasar datos entre programas. Dependiendo del contexto, los programas pueden ejecutarse en un solo procesador o en varios procesadores separados.

El uso de la memoria para la comunicación dentro de un solo programa, por ejemplo, entre sus múltiples subprocesos , también se denomina memoria compartida.

En hardware [ editar ]

HSA define un caso especial de uso compartido de memoria, donde la MMU de la CPU y la IOMMU de la GPU tienen un espacio de direcciones virtual paginable idéntico.

En el hardware de la computadora, la memoria compartida se refiere a un bloque (generalmente 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 sola vista de datos y la comunicación entre procesadores puede ser tan rápida como los accesos a la memoria a una misma ubicación. El problema con los sistemas de memoria compartida es que muchas CPU necesitan un acceso rápido a la memoria y probablemente tendrán memoria 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 genera contención. Intentar acceder a ubicaciones de memoria cercanas puede provocar un intercambio falso . Las computadoras con memoria compartida no pueden escalar muy bien. La mayoría de ellos tienen diez procesadores o menos;
  • Falta de coherencia de datos: siempre que una caché se actualiza con información que puede ser utilizada por otros procesadores, el cambio debe reflejarse en los otros procesadores, de lo contrario, los diferentes procesadores trabajarán con datos incoherentes. Dichos protocolos de coherencia de caché pueden, cuando funcionan bien, proporcionar acceso de muy alto rendimiento a información compartida entre múltiples procesadores. Por otro lado, a veces 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 amortiguar los efectos de los cuellos 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 debe 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 [ editar ]

En el software de computadora, la memoria compartida es

  • 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 pueden acceder otros procesos;
  • un método para conservar espacio en la memoria al dirigir los accesos a lo que normalmente serían copias de un dato a una sola instancia en su lugar, mediante el uso de asignaciones de memoria virtual o con el apoyo explícito del programa en cuestión. Esto se usa con mayor frecuencia para bibliotecas compartidas y para Ejecutar en el lugar (XIP).

Dado que ambos procesos pueden acceder al área de memoria compartida como la memoria de trabajo normal, esta es una forma de comunicación muy rápida (a diferencia de otros mecanismos de IPC como canalizaciones con nombre , sockets de dominio Unix o CORBA ). Por otro lado, es menos escalable, ya que, por ejemplo, los procesos de comunicación deben ejecutarse en la misma máquina (de otros métodos IPC, solo los sockets de dominio de Internet, no los sockets 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 independientes y la arquitectura subyacente no es coherente con la caché .

IPC por 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 en Windows .

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

Soporte en sistemas similares a Unix [ editar ]

POSIX proporciona una API estandarizada para usar memoria compartida, POSIX Shared Memory . Esto usa la función shm_opende sys / mman.h. [2] la comunicación entre procesos POSIX (parte de la POSIX: XSI Extension) incluye las funciones de memoria compartida shmat, shmctl, shmdty shmget. [3] [4] Unix System V también proporciona una API para memoria compartida. Esto 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 lo elimina explícitamente. Esto tiene el inconveniente de que si el proceso falla y no puede limpiar la memoria compartida, permanecerá hasta que se apague el sistema.

POSIX también proporciona la mmapAPI para mapear archivos en la memoria; se puede compartir un mapeo, 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 de escritura mundial (un directorio en el que cada usuario del sistema puede crear archivos) que se almacena en memoria. Tanto las distribuciones basadas en RedHat como en Debian lo incluyen de forma predeterminada. El soporte para este tipo de disco RAM es completamente opcional dentro del archivo de configuración del kernel . [5]

Soporte en Windows [ editar ]

En Windows, se pueden usar las funciones CreateFileMappingy MapViewOfFilepara mapear una región de un archivo en la memoria en múltiples procesos. [6]

Soporte multiplataforma [ editar ]

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

Soporte de lenguaje de programación [ editar ]

Existe soporte nativo para memoria compartida también en lenguajes de programación además de C / C ++. Por ejemplo, PHP proporciona una API para crear memoria compartida, similar a las funciones POSIX . [9]

Ver también [ editar ]

  • Memoria distribuida
  • Memoria compartida distribuida
  • Memoria gráfica compartida
  • Arquitectura de sistema heterogénea
  • Variable global
  • Nano-hilos
  • Ejecutar en el lugar
  • Registro compartido
  • Objetos de instantánea compartidos
  • Cuello de botella de la arquitectura de Von Neumann

Referencias [ editar ]

  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. ^ Documentación de shm_open de la Especificación Única de Unix
  3. ^ Robbins, Kay A .; Robbins, Steven (2003). Programación de sistemas Unix: comunicación, concurrencia y subprocesos (2 ed.). Prentice Hall PTR. pag. 512 . ISBN 978-0-13-042411-2. Consultado el 13 de mayo de 2011 . La comunicación entre procesos POSIX (IPC) es parte de la extensión POSIX: XSI y tiene su origen en la comunicación entre procesos Unix System V.
  4. ^ Función de memoria compartida de la Especificación Única de Unix.
  5. ^ Christoph Rohland; Hugh Dickins; KOSAKI Motohiro. "tmpfs.txt" . kernel.org . Consultado el 16 de marzo de 2010 .
  6. ^ Creación de memoria compartida con nombre desde MSDN.
  7. ^ Boost.Interprocess C ++ Library
  8. ^ "Referencia de clase QSharedMemory" .
  9. ^ Funciones de memoria compartida en PHP-API

Enlaces externos [ editar ]

  • 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.