Je comprends que deux des nombreuses autres options de communication inter-processus peuvent être:
- La memoire partagée
- Douilles
En fait, j'ai vu ces deux options exposées par Intellij Idea pour le débogage d'une application Java. Je veux savoir quels sont les avantages et les inconvénients de chaque approche.
Réponses:
Quelques avantages pour chacun du haut de ma tête. Notez que certains de ces éléments peuvent ne pas s'appliquer dans tous les cas; ce ne sont que des observations générales.
Douilles
Simple et contrôlé. Peut être étendu aux sockets réseau si nécessaire avec peu ou pas de modification. Le modèle de programmation nécessite la sérialisation, qui à son tour vous oblige à réfléchir aux données qui sont réellement transférées de A à B. La synchronisation est nécessairement intégrée au mécanisme de communication; aucune autre synchronisation n'est nécessaire.
La memoire partagée
Ne nécessite pas nécessairement un appel système (donc potentiellement plus rapide). Le partage ne nécessite pas explicitement le transfert de données - des données peuvent être mises à disposition que le destinataire ne récupère pas (la bande passante n'a pas à être gaspillée lors du transfert de données que le destinataire n'utilisera pas). Aucune étape de sérialisation / désérialisation signifie pas de temps passé sur les frais généraux de communication.
la source
Les prises sont un à un. Vous avez besoin de plusieurs sockets si vous souhaitez envoyer la même chose à plusieurs processus. Avec la mémoire partagée, vous pouvez avoir plusieurs lecteurs et également plusieurs écrivains.
Les sockets sont gourmandes en ressources. Chaque message passe par le système d'exploitation. Avec la mémoire partagée, vous mappez la mémoire partagée, mais une fois dans la mémoire de votre application et à partir de là, c'est à vous de l'utiliser. Cependant, vous devez toujours passer par le système d'exploitation lorsque vous avez utilisé la mémoire partagée; voir ci-dessous.
Les sockets sont synchronisés (tant que vous n'utilisez pas UDP). Avec la mémoire partagée, vous avez presque inévitablement besoin d'un mécanisme supplémentaire pour indiquer aux autres processus qu'il est OK / non OK de lire ou d'écrire dans la mémoire partagée. Ne faites pas cela et vous rencontrerez des problèmes avec la mémoire corrompue. Exemple: Supposons que le processus A commence à lire une partie de la mémoire partagée, mais soit échangé à mi-chemin de la lecture. Le processus B écrit dans ce même bloc de mémoire partagée. Lorsque le processus A redémarre et continue de lire la mémoire partagée, ce qu'il a lu est un méli-mélo de données anciennes et nouvelles. Pour éviter cela, vous passez toujours par le système d'exploitation lorsque vous utilisez la mémoire partagée.
Il est assez facile de convertir un ensemble d'applications basées sur des sockets en une application qui utilise des sockets réseau. Vous pouvez étendre le traitement à toutes les machines de votre laboratoire, ou même plus loin. ne peut tout simplement pas faire cela avec la mémoire partagée. Vous êtes verrouillé sur une machine avec une solution basée sur la mémoire partagée.
Les sockets sont destinés aux faibles volumes de données, la mémoire partagée pour les gros volumes de données. Les différents mécanismes existent pour résoudre différents problèmes.
la source