que - Sockets de dominio UNIX frente a memoria compartida(archivo asignado)
socket wikipedia (4)
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 o posicionar.
¿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)?
Gracias.
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.
cuando escribe en un archivo mapeado en memoria, necesita "vaciar" lo que estaba escrito en la memoria compartida en un archivo real con encuadernación (no exactamente, se realiza el lavado por usted), por lo que debe copiar sus datos primero en la memoria compartida, y luego lo copias de nuevo (enrasado) en el archivo real y eso es superdimensionado: más que nada, incluso más que escribir en socket, no ganas nada al hacer eso.
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 tome. Definitivamente use semáforos en la memoria compartida (implementado con futex en Linux) para evitar llamadas al sistema en casos no contendidos.
Se trata más de una cuestión de diseño que de velocidad (la memoria compartida es más rápida), los sockets de dominio son definitivamente más de estilo UNIX y hacen mucho menos problemas. En términos de elección, saber de antemano:
Ventajas de Dominio Sockets
- modo de bloqueo y no bloqueo y cambio entre ellos
- no tiene que liberarlos cuando se completan las tareas
Desventajas de los sockets de dominio
- debe leer y escribir de forma lineal
Ventajas de memoria compartida
- almacenamiento no lineal
- nunca bloqueará
- múltiples programas pueden acceder a ella
Desventajas de memoria compartida
- necesita implementación de bloqueo
- necesita la liberación manual, incluso si no se utiliza por ningún 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.