2012-03-14 22 views
15

Estoy leyendo acerca de varios mecanismos de IPC. Estoy tratando de descubrir los escenarios, donde usamos la memoria compartida y donde usamos canalizaciones con nombre (FIFO).Cuándo utilizar Tuberías vs Cuándo usar Memoria compartida

Tubos: El proceso múltiple puede Escribir, sin embargo, solo un proceso puede leer. La operación de escritura es atómica.

Memoria compartida: Múltiple proceso puede leer y escribir. Y también el usuario necesita proporcionar exclusión mutua para leer & escribir.

¿Es esta la única diferencia de aplicación de memoria compartida y tubería?

+1

Tenga en cuenta que las escrituras son solo atómicas, si no superiores a PIPE_BUF en tamaño. –

Respuesta

35

Esencialmente, las tuberías, ya sean nominadas o anónimas, se utilizan como mensajes. Alguien envía una información al destinatario y el destinatario puede recibirla. La memoria compartida se parece más a la publicación de datos: alguien coloca los datos en la memoria compartida y los lectores (potencialmente muchos) deben usar la sincronización, p. a través de semáforos para aprender sobre el hecho de que hay datos nuevos y debe saber cómo leer la región de memoria para encontrar la información.

Con los tubos, la sincronización es simple y está integrada en el propio mecanismo de la tubería: sus lecturas y escrituras se congelarán y descongelarán la aplicación cuando ocurra algo interesante. Con la memoria compartida, es más fácil trabajar de forma asíncrona y buscar nuevos datos solo de vez en cuando, pero a costa de un código mucho más complejo. Además, puede obtener comunicación de muchos a muchos, pero requiere más trabajo nuevamente. Además, debido a lo anterior, la depuración de la comunicación basada en tuberías es más fácil que la depuración de la memoria compartida.

Una pequeña diferencia es que los fifos son visibles directamente en el sistema de archivos, mientras que las regiones de memoria compartida necesitan herramientas especiales como ipcs para su gestión en caso de que, por ejemplo, crea un segmento de memoria compartida, pero tu aplicación muere y no se limpia después de ella (lo mismo ocurre con los semáforos y muchos otros mecanismos de sincronización que podrías necesitar junto con la memoria compartida).

La memoria compartida también le brinda más control sobre el almacenamiento en búfer y el uso de recursos: dentro de los límites permitidos por el sistema operativo, es usted quien decide cuánta memoria asignar y cómo usarla. Con las tuberías, el sistema operativo controla las cosas automáticamente, por lo que una vez más se pierde cierta flexibilidad, pero se alivian de mucho trabajo.

Resumen de los puntos más importantes: tubos para la comunicación uno a uno, menos codificación y para que el SO maneje cosas, memoria compartida para muchos a muchos, más control manual sobre las cosas pero a costa de más trabajo y depuración más difícil.

+1

Alguna corrección menor. Las tuberías también se pueden crear anónimamente a través de la llamada de teléfono 'pipe'. La memoria compartida también puede residir en el sistema de archivos no de forma privada 'nmap'ing un archivo. – johannes

+1

Los FIFO también admiten la comunicación uno a uno (el "resumen" solo implica uno a uno). –

+0

@MarkRajcok Aunque es posible, en la práctica, tener muchos escritores con tuberías no es muy útil ya que no hay un mecanismo incorporado para gestionar la sincronización a nivel de mensaje: lo que todos los escritores envíen se entrelazará de forma impredecible. Incluso si se implementa la sincronización externa, lo mejor que se podría hacer sería un bloqueo exclusivo entre los escritores mientras se envía cada mensaje, lo que no es efectivo ya que solo uno puede estar escribiendo al mismo tiempo. –

Cuestiones relacionadas