2012-02-16 201 views

Respuesta

6

En comparación con las tuberías, las tomas IPC difieren por ser bidireccionales, es decir, las lecturas y escrituras se pueden realizar en el mismo descriptor. Las tuberías, a diferencia de las tomas, son unidireccionales. Debe conservar un par de descriptores si desea hacer tanto lecturas como escrituras.

Las tuberías, por otro lado, garantizan la atomicidad al leer o escribir en una cierta cantidad de bytes. Escribir algo menos que PIPE_BUF bytes a la vez garantiza que se entregará en un solo fragmento y nunca se observará parcial. Los zócalos requieren más atención del programador a ese respecto.

La memoria compartida, cuando se usa para IPC, requiere una sincronización explícita del programador. Puede ser el mecanismo más eficiente y más flexible, pero eso implica un mayor costo de complejidad.

+0

podría ser el caso de alguna ventaja de desbloqueo de enchufes IPC? – jasonkim

0

El uso de una cola de mensajes verdadera tiende a dejarlo con mensajes de tamaño fijo. Si tiene una gran cantidad de mensajes de tamaños increíblemente variables, esto puede convertirse en un problema de rendimiento. Usar un socket puede ser una forma de evitar esto, aunque luego te quedes tratando de ajustar esta funcionalidad para que sea idéntica a una cola, lo cual es complicado para obtener los detalles correctamente, particularmente aspectos como el bloqueo/no bloqueo y la atomicidad.

La memoria compartida es rápida pero requiere administración (termina escribiendo una versión de malloc para administrar el SHM) además tiene que sincronizarla y bloquearla de alguna manera. Aunque puede utilizar bibliotecas para ayudar con esto, la disponibilidad depende de su entorno e idioma.

Las colas son fáciles pero tienen las desventajas enumeradas como pros en mi discusión de socket.

Las tuberías han sido cubiertas por Blagovests a esta pregunta.

Como siempre sucede con este tipo de cosas, sugiero leer los libros de W. Richard Stevens sobre IPC y tomas de corriente. ¡No hay mejor explicación que la suya! :-)

1

Quizás esta es una respuesta demasiado simplificada, pero es un detalle importante. Los sockets no son compatibles con todos los sistemas operativos. Recientemente, tuve conocimiento de un proyecto que utilizaba sockets para IPC en todas partes solo para descubrir que se vieron obligados a cambiar de Linux a un sistema operativo propietario que era POSIX, pero que no soportaba sockets de la misma manera que Linux.

1

Otro punto a favor de los sockets: una aplicación que use sockets se puede distribuir fácilmente, es decir. se puede ejecutar en un host o distribuir en varios hosts con poco esfuerzo. Esto depende, por supuesto, de la naturaleza de la aplicación.

1

sockets que permiten unos beneficios ...

  • Se puede conectar un cliente sencillo para ellos para pruebas (introducir manualmente los datos, ver la respuesta). Esto es muy útil para las pruebas de depuración, simulación y blackbox.

  • Puede ejecutar los procesos en diferentes máquinas. Esto puede ser útil para la escalabilidad y es muy útil en la depuración/prueba si trabaja en un software integrado.

  • se hace muy fácil para exponer su proceso como un servicio

Pero también hay desventajas, así

  • de arriba es mayor que el IPC optimizado para una sola máquina. La memoria compartida, en particular, es mejor si necesita el rendimiento y sabe que todos sus procesos están en la misma máquina.

  • Seguridad: si sus aplicaciones cliente se pueden conectar, puede hacerlo cualquier otra persona, si no tiene cuidado con la autenticación. Los datos también pueden detectarse si no está encriptando, y modificarse si al menos no está firmando datos enviados a través del cable.

Cuestiones relacionadas