Entiendo que dos de las muchas opciones más para la comunicación entre procesos pueden ser:
- Memoria compartida
- 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.
Respuestas:
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.
fuente
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.
fuente