J'ai joué avec des files d'attente de messages (System V, mais POSIX devrait être ok aussi) sous Linux récemment et elles semblent parfaites pour mon application, mais après avoir lu The Art of Unix Programming, je ne sais pas si elles sont vraiment un bon choix .
http://www.faqs.org/docs/artu/ch07s02.html#id2922148
La couche supérieure transmettant les messages du système V IPC est en grande partie tombée en désuétude. La couche inférieure, qui se compose de mémoire partagée et de sémaphores, a encore des applications importantes dans les circonstances où il faut effectuer un verrouillage d'exclusion mutuelle et un certain partage de données globales entre les processus exécutés sur la même machine. Ces installations de mémoire partagée System V sont devenues l'API de mémoire partagée POSIX, prise en charge sous Linux, les BSD, MacOS X et Windows, mais pas MacOS classique.
http://www.faqs.org/docs/artu/ch07s03.html#id2923376
Les fonctionnalités de System V IPC sont présentes dans Linux et d'autres Unix modernes. Cependant, comme il s'agit d'une fonction héritée, elles ne sont pas utilisées très souvent. La version Linux est encore connue pour avoir des bogues en date du mi-2003. Personne ne semble se soucier suffisamment de les réparer.
Les files d'attente de messages System V sont-elles toujours boguées dans les versions Linux plus récentes? Je ne sais pas si l'auteur signifie que les files d'attente de messages POSIX devraient être correctes?
Il semble que les sockets soient les préférés IPC pour presque n'importe quoi (?), Mais je ne vois pas comment il serait très simple d'implémenter des files d'attente de messages avec des sockets ou autre chose. Ou est-ce que je pense trop complexe ?
Je ne sais pas s'il est pertinent que je travaille avec Linux embarqué?
Personnellement, j'aime beaucoup les files d'attente de messages et je pense qu'elles sont sans doute les plus sous-utilisées IPC dans le monde Unix. Elles sont rapides et faciles à utiliser.
Quelques réflexions:
C'est juste de la mode. Les vieilles choses redeviennent nouvelles. Ajoutez un papa brillant dans les files d'attente de messages et ils pourraient être la chose la plus récente et la plus chaude de l'année prochaine. Regardez Google Chrome en utilisant des processus séparés au lieu de threads pour ses onglets. Soudain, les gens sont ravis que lorsqu'un onglet se verrouille, il ne fasse pas tomber tout le navigateur.
La mémoire partagée a quelque chose d'un halo He-man à ce sujet. Vous n'êtes pas un "vrai" programmeur si vous ne retirez pas le dernier cycle de la machine et que les MQ sont légèrement moins efficaces. Pour beaucoup, sinon la plupart des applications, c'est un non-sens absolu, mais il est parfois difficile de briser un état d'esprit une fois qu'il a pris racine.
Les MQ ne sont vraiment pas appropriés pour les applications avec des données illimitées. Les mécanismes orientés flux tels que les tuyaux ou les prises sont simplement plus faciles à utiliser pour cela.
Les variantes du System V sont vraiment tombées en disgrâce. En règle générale, utilisez les versions POSIX de IPC lorsque vous le pouvez.
Oui, je pense que les files d'attente de messages conviennent à certaines applications. Les files d'attente de messages POSIX fournissent une interface plus agréable, en particulier, vous pouvez donner à vos files d'attente des noms plutôt que des identifiants, ce qui est très utile pour le diagnostic des erreurs (permet de voir plus facilement lequel est lequel).
Linux vous permet de monter les files d'attente de messages posix en tant que système de fichiers et de les voir avec "ls", de les supprimer avec "rm" qui est également très pratique (le système V dépend des commandes maladroites "ipcs" et "ipcrm")
Je n'ai pas réellement utilisé les files d'attente de messages POSIX parce que je veux toujours laisser ouverte l'option de distribuer mes messages sur un réseau. Dans cet esprit, vous pourriez envisager une interface de transmission de messages plus robuste comme zeromq ou quelque chose qui implémente AMQP .
Une des bonnes choses à propos de 0mq est que lorsqu'il est utilisé à partir du même espace de processus dans une application multithread, il utilise un mécanisme de copie zéro sans verrou qui est assez rapide. Néanmoins, vous pouvez également utiliser la même interface pour transmettre des messages sur un réseau.
Les plus gros inconvénients de la file d'attente de messages POSIX:
select()
. (Il fonctionne avec select()
sous Linux mais pas dans le système Qnx)Le socket Unix Datagram effectue la même tâche que la file d'attente de messages POSIX. Et le socket Unix Datagram fonctionne dans la couche socket. Il est possible de l'utiliser avec select()
/poll()
ou d'autres méthodes d'attente d'E/S. L'utilisation de select()
/poll()
présente l'avantage lors de la conception d'un système basé sur les événements. Il est possible d'éviter ainsi la boucle occupée.
Il y a une surprise dans la file d'attente des messages. Pensez à mq_notify()
. Il est utilisé pour obtenir un événement de réception. Il semble que nous pouvons notifier quelque chose au sujet de la file d'attente de messages. Mais il s'inscrit en fait pour notification au lieu de notifier quoi que ce soit.
Plus surprenant à propos de mq_notify()
est qu'il doit être appelé après chaque mq_receive()
, ce qui peut provoquer une condition de concurrence critique (lorsqu'un autre processus/thread appelle mq_send()
entre l'appel de mq_receive()
et mq_notify()
).
Et il a tout un ensemble de mq_open, mq_send(), mq_receive() and mq_close()
avec leur propre définition qui est redondante et dans certains cas incohérente avec la spécification de la méthode socket open(),send(),recv() and close()
.
Je ne pense pas que la file d'attente de messages devrait être utilisée pour la synchronisation. eventfd
et signalfd
conviennent à cela.
Mais il (file d'attente de messages POSIX) a un support en temps réel. Il a des fonctionnalités prioritaires.
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.
Mais cette priorité est également disponible pour le socket en tant que données hors bande!
Enfin, pour moi, la file d'attente de messages POSIX est une API héritée. Je préfère toujours le socket Unix Datagram au lieu de la file d'attente de messages POSIX tant que les fonctionnalités en temps réel ne sont pas nécessaires.