¿Las colas de mensajes son obsoletas en linux?


He estado jugando con colas de mensajes (System V, pero POSIX también debería estar bien) en Linux recientemente y parecen perfectas para mi aplicación, pero después de leer El Arte de la Programación Unix no estoy seguro de si son realmente una buena opción.

Http://www.faqs.org/docs/artu/ch07s02.html#id2922148

La capa superior de transmisión de mensajes de System V IPC ha caído en gran medida fuera de uso. La capa inferior, que consiste en memoria compartida y semáforos, todavía tiene aplicaciones en circunstancias en las que uno necesita hacer bloqueo de exclusión mutua y compartir algunos datos globales entre procesos que se ejecutan en la misma máquina. Estas instalaciones de memoria compartida de System V evolucionaron en la API de memoria compartida POSIX, compatible con Linux, BSDs, macOS X y Windows, pero no con macOS clásicos.

Http://www.faqs.org/docs/artu/ch07s03.html#id2923376

Las instalaciones de System V IPC están presentes en Linux y otros Unixes modernos. Obstante, como son una característica heredada, no se ejercen muy a menudo. La versión de Linux todavía se sabe que tiene errores a mediados de 2003. Nadie parece preocuparse lo suficiente para arreglarlos.

¿Las colas de mensajes de System V todavía tienen errores en las versiones más recientes de Linux? No estoy seguro de si el autor quiere decir que las colas de mensajes POSIX deberían estar bien?

Parece que los sockets son el IPC preferido para casi cualquier cosa(?), pero no veo cómo sería muy sencillo implementar colas de mensajes con sockets o algo más. O estoy pensando demasiado compleja?

¿No se si es relevante que esté trabajando con Linux embebido?

Author: ValenceElectron, 2009-06-09

4 answers

Personalmente soy bastante aficionado a las colas de mensajes y creo que son posiblemente el IPC más infrautilizado en el mundo unix. Son rápidos y fáciles de usar.

Un par de pensamientos:

  • Algo de esto es solo moda. Las cosas viejas se vuelven nuevas de nuevo. Agregue un brillante do-dad en las colas de mensajes y pueden ser la cosa más nueva y más caliente del próximo año. Mira Chrome de Google utilizando procesos separados en lugar de hilos para sus pestañas. De repente la gente está encantada de que cuando una ficha bloquea no derriba todo el navegador.

  • La memoria compartida tiene algo de un halo He-man. No eres un programador "real" si no estás exprimiendo ese último ciclo de la máquina y los MQs son marginalmente menos eficientes. Para muchas, si no la mayoría de las aplicaciones, es una tontería absoluta, pero a veces es difícil romper una mentalidad una vez que se afianza.

  • MQs realmente no son apropiados para aplicaciones con datos ilimitados. Mecanismos orientados a la corriente como tuberías o los enchufes son más fáciles de usar para eso.

  • Las variantes del Sistema V realmente han caído en desgracia. Como regla general, vaya con las versiones POSIX de IPC cuando pueda.

 61
Author: Duck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-09 00:02:33

Sí, creo que las colas de mensajes son apropiadas para algunas aplicaciones. Las colas de mensajes POSIX proporcionan una interfaz más agradable, en particular, puedes dar nombres a tus colas en lugar de IDs, lo que es muy útil para el diagnóstico de fallas (hace que sea más fácil ver cuál es cuál).

Linux le permite montar las colas de mensajes posix como un sistema de archivos y verlos con "ls", eliminarlos con "rm", lo cual también es muy útil (System V depende de los torpes comandos "ipcs" e "ipcrm")

 12
Author: MarkR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-09 07:02:22

En realidad no he usado colas de mensajes POSIX porque siempre quiero dejar abierta la opción de distribuir mis mensajes a través de una red. Con eso en mente, podrías mirar una interfaz de paso de mensajes más robusta como zeromq o algo que implemente AMQP .

Una de las cosas buenas de 0mq es que cuando se usa desde el mismo espacio de proceso en una aplicación multiproceso, utiliza un mecanismo de copia cero sin bloqueo que es bastante rápido. Aún así, puedes usar lo mismo interfaz para pasar mensajes a través de una red también.

 11
Author: bmdhacks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-06 20:18:30

Mayores desventajas de la cola de mensajes POSIX:

  • La cola de mensajes POSIX no hace que sea un requisito para ser compatible con select().(Funciona con select() en Linux pero no en el sistema Qnx)
  • tiene sorpresas.

El socket de datagramas Unix hace la misma tarea que la cola de mensajes POSIX. Y Unix Datagram Socket funciona en socket layer. Es posible usarlo con select()/poll() u otros métodos IO-wait. Usando select()/poll() tiene la ventaja al diseñar sistema basado en eventos. Es posible evitar el bucle ocupado de esa manera.

Hay sorpresa en la cola de mensajes. Piensa en mq_notify(). Se utiliza para obtener recibir-evento. Parece que podemos notificar algo sobre la cola de mensajes. Pero en realidad se está registrando para la notificación en lugar de notificar nada.

Más sorpresa sobre mq_notify() es que tiene que ser llamado después de cada mq_receive(), lo que puede causar una condición de carrera (cuando algún otro proceso / hilo llama mq_send() entre la llamada de mq_receive() y mq_notify()).

Y tiene un conjunto completo de mq_open, mq_send(), mq_receive() and mq_close() con su propia definición que es redundante y en algunos casos inconsistente con la especificación del método socket open(),send(),recv() and close().

No creo que la cola de mensajes deba usarse para la sincronización. eventfd y signalfd son adecuados para eso.

Pero it(POSIX message queue) tiene cierto soporte en tiempo real. Tiene características prioritarias.

Messages are placed on the queue in decreasing order of priority, with newer messages of the same priority being placed after older messages with the same priority.

Pero esta prioridad también está disponible para socket como datos fuera de banda !

Finalmente, para mí , POSIX message queue es una API heredada. Siempre prefiero Unix Datagram socket en lugar de POSIX message queue siempre y cuando las características en tiempo real no sean necesarias.

 3
Author: shuva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-14 12:28:20