¿Cuáles son los pros y los contras de la comunicación entre procesos realizada a través de sockets versus memoria compartida?

9

Entiendo que dos de las muchas opciones más para la comunicación entre procesos pueden ser:

  1. Memoria compartida
  2. Enchufes

En realidad, vi estas dos opciones expuestas por Intellij Idea para depurar una aplicación Java. Quiero saber cuáles son los pros y los contras de cada enfoque.

Friki
fuente
Un método más nuevo es D-Bus.
ott--
@ ott: ¿D-Bus no utiliza los sockets de dominio Unix?
@BrianMarshall De hecho, dominio y zócalos tcp / ip.
ott--
Aquí también hay respuestas: stackoverflow.com/a/1844919/632951
Pacerier

Respuestas:

11

Algunas ventajas para cada uno fuera de mi cabeza. Tenga en cuenta que algunos de estos elementos pueden no aplicarse en todos los casos; Estas son solo observaciones generales.

Enchufes

Simple y controlado. Se puede extender a los sockets de red según sea necesario con poca o ninguna modificación. El modelo de programación requiere la serialización, lo que a su vez requiere que piense qué datos se transfieren realmente de A a B. La sincronización está necesariamente integrada en el mecanismo de comunicación; No es necesaria otra sincronización.

Memoria compartida

No necesariamente requiere una llamada al sistema (por lo tanto, potencialmente más rápido). El uso compartido no requiere explícitamente la transferencia de datos: los datos pueden estar disponibles para que el destinatario no los recupere (el ancho de banda no tiene que desperdiciarse transfiriendo datos que el destinatario no usará). Ningún paso de serialización / deserialización significa que no se dedica tiempo a la sobrecarga de la comunicación.

tylerl
fuente
44
+1: los sockets se escalan a sistemas distribuidos mientras que la memoria compartida es mucho más rápida.
Mouviciel
@tylerl ¿Por qué la memoria compartida no requiere una llamada al sistema?
Geek
@ Geek: Lea sobre cómo se implementa la administración de memoria virtual en los sistemas operativos modernos. Básicamente, bajo el capó, la memoria compartida se implementa casi idéntica a la memoria de proceso normal. Sucede que la misma página física está asignada a propósito en 2 (o N) procesos diferentes. Pero una vez que se establece esa asignación, * px = 5 produce el mismo conjunto de instrucciones independientemente de si px apunta a una variable regular o si apunta dentro de un segmento de memoria compartida.
DXM
técnicamente no necesita serializar datos a través de un socket si el destino puede aceptar una secuencia de bytes sin formato en el formato que envía. La mayoría de las personas obviamente serializan para poder enviar a cualquiera.
gbjbaanb
1
@gbjbaanb Creo que técnicamente estás serializando datos si se transmiten como una secuencia secuencial de bits, sin importar la estructura de codificación.
tylerl
6

Los enchufes son uno a uno. Necesita múltiples sockets si desea enviar lo mismo a múltiples procesos. Con memoria compartida, puede tener múltiples lectores y también múltiples escritores.

Los zócalos requieren muchos recursos. Todos y cada uno de los mensajes pasan por el sistema operativo. Con la memoria compartida, mapea la memoria compartida pero una vez en la memoria de su aplicación y de ahí en adelante es suya. Sin embargo, aún necesita pasar por el sistema operativo cuando usó la memoria compartida; vea abajo.

Los sockets están sincronizados (siempre que no use UDP). Con la memoria compartida, casi inevitablemente necesitará algún mecanismo adicional para decirle a otros procesos que está bien / no está bien leer o escribir en la memoria compartida. No hagas esto y tendrás problemas con la memoria dañada. Ejemplo: suponga que el proceso A comienza a leer un fragmento de memoria compartida, pero se intercambia a mitad de la lectura. El proceso B escribe en ese mismo fragmento de memoria compartida. Cuando el proceso A se reinicia y continúa leyendo la memoria compartida, lo que ha leído es una mezcla de datos antiguos y nuevos. Para evitar esto, aún debe pasar por el sistema operativo cuando usa la memoria compartida.

Es bastante fácil convertir un conjunto de aplicaciones basadas en sockets a uno que use sockets de red. Puede extender el procesamiento a todas las máquinas de su laboratorio, o incluso más allá. simplemente no puedo hacer esto con la memoria compartida. Está bloqueado en una máquina con una solución basada en memoria compartida.

Los sockets están destinados a bajos volúmenes de datos, memoria compartida para grandes volúmenes de datos. Existen diferentes mecanismos para resolver diferentes problemas.

David Hammen
fuente