2010-01-20 12 views

Respuesta

53

Es más una cuestión de diseño, que la velocidad (memoria compartida es más rápido), los sockets de dominio son definitivamente más de estilo UNIX, y hacen mucho menos problemas. En cuanto a la elección saber de antemano: Sockets

dominio ventajas

  • bloqueo y modo de no bloqueo y cambiar entre ellas
  • que no tienen que liberarlos cuando se completen las tareas

zócalos de dominio efectos negativos para

  • debe leer y escribir de una forma lineal

compartidas ventajas de memoria

  • no lineal de almacenamiento
  • nunca se bloqueará
  • múltiples programas pueden acceder a ella

Memoria compartida en desventaja

  • necesidad de bloqueo de aplicación
  • necesitan liberación manual, incluso si no se utiliza por cualquier programa

Eso es todo lo que puedo pensar ahora. Sin embargo, iría con sockets de dominio cualquier día, sin mencionar que es mucho más fácil que volver a implementarlos para hacer computación distribuida. La ganancia de velocidad de la memoria compartida se perderá debido a la necesidad de un diseño seguro. Sin embargo, si sabe exactamente lo que está haciendo y utiliza las llamadas al kernel adecuadas, puede lograr una mayor velocidad con la memoria compartida.

+0

+1 para la comparación. – jldupont

+0

¡Gracias por la respuesta detallada y la comparación! – SyBer

+2

'necesita la liberación manual, incluso si no se utiliza por ningún programa' se puede combatir con [' /dev/ashmem'](http://lwn.net/Articles/452035/) –

2

Ambos son mecanismos de comunicación entre procesos (IPC). Los sockets de dominio UNIX se utilizan para la comunicación entre procesos en un host similar a los Sockets TCP que se usan entre diferentes hosts. La memoria compartida (SHM) es una pieza de memoria en la que puede colocar datos y compartirlos entre procesos. SHM le proporciona acceso aleatorio mediante el uso de punteros. Los sockets se pueden escribir o leer, pero no se puede rebobinar ni posicionar.

7

En términos de velocidad, la memoria compartida es definitivamente el ganador. Con los sockets, tendrá al menos dos copias de los datos, desde el proceso de envío al buffer del núcleo, luego desde el kernel al proceso de recepción. Con la memoria compartida, la latencia solo estará limitada por el algoritmo de coherencia entre los núcleos del cuadro.

Sin embargo, como señala Kornel, lidiar con la memoria compartida es más complicado ya que tiene que idear su propio esquema de sincronización/señalización, lo que puede agregar un retraso según la ruta que vaya. Definitivamente, use semáforos en la memoria compartida (implementado con futex en Linux) para evitar llamadas al sistema en casos no contendidos.

+0

Creo que lo que separa los sockets de dominio de Unix de los zócalos normales es que una escritura en un extremo va directamente a los búferes de recepción en el otro extremo. Entonces no hay necesariamente copias adicionales. Esto puede ser más copias de las necesarias si puede encontrar la manera de que las aplicaciones realmente usen el mismo objeto en la memoria compartida en lugar de copiarlo. –

+0

Hay al menos dos copias adicionales: de usuario a kernel, y luego de vuelta. –

0

En este caso, los enchufes son más rápidos. Escribir en la memoria compartida es más rápido que cualquier IPC, pero escribir en un archivo mapeado en memoria y escribir en la memoria compartida son dos cosas completamente diferentes.

al escribir en un archivo mapeado de memoria que necesita "vaciar" lo que estaba escrito en la memoria compartida a un archivo real encuadernado (no exactamente, se realiza el lavado), para copiar primero sus datos al memoria compartida, y luego la copias de nuevo (al ras) al archivo real y eso es súper expansivo: más que nada, incluso más que escribir en el socket, no obtienes nada haciendo eso.

+2

Esto no es verdad. Es relativamente simple configurar la memoria compartida, a través de un archivo mapeado en memoria (que es el mecanismo normal), y para que el intercambio de datos ocurra de la manera más rápida. –

Cuestiones relacionadas