La memoria compartida es el medio más rápido de intercambio de datos entre procesos [1] .
En otras herramientas de comunicación entre procesos ( IPC ), la comunicación entre procesos pasa por el kernel , lo que resulta en un cambio de contexto entre el proceso y el kernel, es decir a las pérdidas de rendimiento [2] .
La técnica de memoria compartida permite el intercambio de información a través de un segmento de memoria compartida para procesos sin usar llamadas al sistema del kernel. El segmento de memoria compartida está conectado a la parte libre del espacio de direcciones virtuales del proceso [3] . Por lo tanto, dos procesos diferentes pueden tener diferentes direcciones de la misma ubicación de memoria compartida.
Después de crear un segmento de memoria compartida, cualquiera de los procesos de usuario puede adjuntarlo a su propio espacio virtual y trabajar con él como con un segmento de memoria normal. La desventaja de tal intercambio de información es la ausencia de cualquier medio de sincronización, sin embargo, para superar esta desventaja, se puede utilizar la técnica del semáforo .
En el esquema de intercambio de datos entre dos procesos ( cliente y servidor ) usando memoria compartida, debe funcionar un grupo de dos semáforos. El primer semáforo se usa para bloquear el acceso a la memoria compartida, su señal de habilitación es 1 y su señal de denegación es 0. El segundo semáforo se usa para señalar al servidor que el cliente ha comenzado a trabajar, mientras que el acceso a la memoria compartida está bloqueado y el cliente lee los datos de la memoria. Ahora, cuando el servidor llame a la operación, su trabajo se suspenderá hasta que el cliente libere la memoria.
En software, la memoria compartida se llama:
Debido a que ambos procesos pueden acceder al área de memoria compartida como memoria normal, es una forma muy rápida de comunicarse (a diferencia de otros mecanismos IPC, como canalizaciones con nombre , sockets UNIX o CORBA ). Por otro lado, este método es menos flexible, por ejemplo, los procesos de comunicación deben ejecutarse en la misma máquina (de los métodos IPC enumerados, solo los sockets de red, que no deben confundirse con los sockets de dominio UNIX, pueden comunicarse a través de la red) y se debe tener cuidado para evitar problemas al usar memoria compartida en diferentes núcleos de procesador y arquitectura de hardware sin un caché coherente .
La comunicación de memoria compartida se usa, por ejemplo, para transferir imágenes entre una aplicación y un servidor X en sistemas Unix, o dentro del objeto IStream devuelto por CoMarshalInterThreadInterfaceInStream en la biblioteca COM de Windows.
Las bibliotecas compartidas generalmente se cargan en la memoria una vez y se asignan a varios procesos, y solo las páginas que son específicas de un solo proceso (porque algunas ID difieren) se duplican, generalmente mediante un mecanismo conocido como copy-on-write , que cuando intenta escribir a la memoria compartida, silenciosamente al proceso que llama a la escritura, copia las páginas de la memoria y luego escribe los datos en esa copia.
En sistemas operativos tipo UNIXPOSIX proporciona una API estandarizada para trabajar con memoria compartida, POSIX Shared Memory . Una de las características clave de la familia de sistemas operativos UNIX es el mecanismo de copia de procesos (llamada al sistema fork()), que le permite crear áreas anónimas de memoria compartida antes de copiar el proceso y heredarlas por procesos descendientes. Una vez copiado el proceso, la memoria compartida estará disponible tanto para el proceso principal como para el secundario. [3] [4]
Hay dos enfoques diferentes para conectar y usar la memoria compartida:
UNIX System V proporciona un conjunto de funciones de lenguaje C que le permiten trabajar con memoria compartida [7] :
La memoria compartida con nombre significa que cada ubicación de la memoria está asociada con una clave numérica única dentro del sistema operativo, que luego se puede usar para conectar la memoria compartida en otro proceso. [ocho]
Memoria compartida POSIXPOSIX le permite asociar un descriptor de archivo con un objeto de memoria compartida , que es un mecanismo más unificado que UNIX System V. Las siguientes funciones del lenguaje C se pueden usar para manipular la memoria:
En el sistema operativo WindowsCreateFileMapping , las funciones y MapViewOfFile[13] de MSDN se utilizan para crear memoria compartida .
Soporte en lenguajes de programaciónAlgunas bibliotecas de C++ ofrecen acceso multiplataforma a la memoria compartida . Por ejemplo, la biblioteca Boost proporciona una clase boost::interprocess::shared_memory_object[14] para sistemas operativos compatibles con POSIX , y la biblioteca Qt proporciona una clase QSharedMemoryque unifica el acceso a la memoria compartida entre sistemas operativos con algunas restricciones [15] .
En Java 7 bajo el sistema operativo GNU/Linux , la memoria compartida se puede implementar mapeando un archivo de un directorio /dev/shm/(o /run/shm/, dependiendo de la distribución) a la memoria [16] usando un método de mapclase java.nio.MappedByteBuffer[17] .
El soporte de memoria compartida se ha implementado en muchos otros lenguajes de programación . Así, PHP proporciona una API [18] para la creación de memoria compartida, cuyas funciones son similares a las de POSIX .
Comunicación entre procesos | |
---|---|
Métodos | |
Protocolos y estándares seleccionados |