2012-03-05 44 views
12

Estoy trabajando en una cola de mensajes utilizada para la comunicación entre procesos en Linux incorporado. Me pregunto por qué no estoy utilizando las colas de mensajes proporcionadas por Linux de la siguiente manera:¿Cuáles son las desventajas de las colas de mensajes de Linux?

msgctl, msgget msgrcv, msgsnd.

en lugar de crear memoria compartida y sincronizar con semáforo?

¿Cuál es la desventaja de utilizar este conjunto de funciones directamente en un producto incorporado empresarial?

+2

transmisión de mensajes y memoria compartida son diferentes paradigmas de programación. De hecho, el paso de mensajes es probablemente más simple de codificar. –

Respuesta

9

Esas son las funciones de cola de mensajes 'System V IPC'. Trabajarán para usted, pero son bastante pesados. Están estandarizados por POSIX. POSIX también proporciona un conjunto de funciones más moderno, mq_close, mq_getattr, mq_notify, mq_open, mq_receive, mq_send, mq_setattr, mq_unlink que podría ser mejor para usted (por ejemplo una vergüenza de la riqueza). Sin embargo, deberá verificar cuál, si es que lo está, está instalado en sus plataformas de destino de forma predeterminada. Especialmente en un sistema integrado, podría ser que tenga que configurarlos o incluso instalarlos porque no están allí por defecto (y lo mismo podría decirse de la memoria compartida y los semáforos).

La principal ventaja de cualquiera de los conjuntos de servicios de mensajes es que son previamente depurados (probablemente) y por lo tanto tienen problemas de concurrencia ya resueltos, mientras que si lo van a hacer con memoria compartida y semáforos, ' Tengo mucho trabajo por hacer para llegar al mismo nivel de funcionalidad.

Por lo tanto, (re) use cuando pueda. Si es una opción, use uno de los dos sistemas de cola de mensajes en lugar de reinventar el suyo. Si finalmente encuentra que hay un cuello de botella de rendimiento o algo similar, entonces puede investigar cómo escribir sus propias alternativas, pero hasta entonces — ¡reutilícelo!

+0

¿Pero por qué no usar enchufes? Esos también están depurados previamente, etc. etc. Claro, tal vez quieras la semántica de tipo AF_UNIX y SOCK_SEQPACKET, pero los enchufes seguro me parecen mucho mejores. – tchrist

+0

@tchrist: ¿te importa explicar por qué los enchufes te parecen mejores? – Gauthier

2

La transmisión de mensajes es ideal para pequeños fragmentos de datos y en los que se necesita mantener la inmutabilidad, ya que las colas de mensajes copian datos.

Un área de memoria compartida no copia datos en envío/recepción y puede ser más eficiente para conjuntos de datos más grandes a cambio de un modelo de programación menos limpio.

+1

En realidad, incluso para fragmentos grandes de datos, la memoria compartida sola no puede ser una buena idea. Almacenar los datos en una memoria común y en lugar de usar semáforo o mutex para acceder a esa memoria, usar ipc será una buena idea para una programación menos propensa a errores. – theB

+0

@theB: solo para estar seguro de que entiendo, para datos grandes, ¿todavía usaría 'shm', pero no lo bloquearía con' sem'? ¿Escribirías en 'shm', luego pasarías un mensaje ipc para anunciar que los datos están listos? – Gauthier

5

Las colas de mensajes del Sistema V (las manipuladas por las llamadas al sistema msg *) tienen muchos caprichos y errores extraños. Para el código nuevo, recomiendo usar conectores de dominio UNIX.

Dicho esto, también recomendaría encarecidamente IPC de paso de mensajes sobre esquemas de memoria compartida. La memoria compartida es mucho más fácil equivocarse, y tiende a salir mal mucho más catastróficamente.

0

La cola de mensajes y la memoria compartida son diferentes. Y depende del programador y su requisito seleccionar qué usar. En la memoria compartida debe ser un poco cuidadoso al leer y escribir. Y los procesos deberían estar sincronizados. Entonces, el orden de ejecución es muy importante en la memoria compartida. En la memoria compartida, no hay forma de determinar si el valor de lectura es un valor recién escrito o el valor anterior. Y no hay un mecanismo explícito para esperar.

La cola de mensajes y la memoria compartida son diferentes. Y depende del programador y su requisito seleccionar qué usar. Hay funciones predefinidas para facilitarle la vida en la cola de mensajes.

1

Las cola de mensajes de desventajas son minúsculas, algunas llamadas al sistema y gastos generales de copiado, que no equivalen a nada para la mayoría de las aplicaciones. Los beneficios superan con creces a los gastos generales.La sincronización es automática y se pueden usar de varias formas: bloqueo, no bloqueo y, dado que en Linux, los tipos de colas de mensajes se implementan como descriptores de archivos, incluso se pueden usar en las llamadas select() para multiplexación. En la variedad POSIX, que debe usar a menos que tenga una necesidad realmente apremiante de usar colas SYSV, incluso puede generar subprocesos o señales automáticamente para procesar los elementos de la cola. Y lo mejor de todo es que están completamente depurados.

Cuestiones relacionadas