¿Alguien puede decir qué lentos son los zócalos de dominio UNIX en comparación con la memoria compartida (o el archivo alternativo mapeado en memoria)?Sockets de dominio UNIX frente a memoria compartida (archivo asignado)
Gracias.
¿Alguien puede decir qué lentos son los zócalos de dominio UNIX en comparación con la memoria compartida (o el archivo alternativo mapeado en memoria)?Sockets de dominio UNIX frente a memoria compartida (archivo asignado)
Gracias.
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
zócalos de dominio efectos negativos para
compartidas ventajas de memoria
Memoria compartida en desventaja
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.
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.
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.
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. –
Hay al menos dos copias adicionales: de usuario a kernel, y luego de vuelta. –
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.
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. –
+1 para la comparación. – jldupont
¡Gracias por la respuesta detallada y la comparación! – SyBer
'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/) –