Quels sont les avantages et les inconvénients de la communication inter-processus via les sockets par rapport à la mémoire partagée?

9

Je comprends que deux des nombreuses autres options de communication inter-processus peuvent être:

  1. La memoire partagée
  2. 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.

Geek
la source
Une nouvelle méthode est D-Bus.
ott--
@ ott-- D-Bus n'utilise-t-il pas lui-même les sockets de domaine Unix?
@BrianMarshall En effet, les sockets domaine et tcp / ip.
ott--
Il y a des réponses ici aussi: stackoverflow.com/a/1844919/632951
Pacerier

Réponses:

11

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.

tylerl
la source
4
+1: les sockets évoluent vers des systèmes distribués tandis que la mémoire partagée est beaucoup plus rapide.
mouviciel
@tylerl Pourquoi la mémoire partagée ne nécessite-t-elle pas un appel système?
Geek
@Geek: découvrez comment la gestion de la mémoire virtuelle est implémentée dans les systèmes d'exploitation modernes. Fondamentalement, la mémoire partagée sous le capot est implémentée presque identique à la mémoire de processus normale. Il se trouve que la même page physique est volontairement mappée en 2 (ou N) processus différents. Mais une fois ce mappage établi, * px = 5 produit le même ensemble d'instructions, que px pointe sur une variable régulière ou qu'il pointe à l'intérieur d'un segment de mémoire partagée.
DXM
techniquement, vous n'avez pas besoin de sérialiser les données sur un socket si la destination peut accepter un flux d'octets bruts au format que vous envoyez. La plupart des gens sérialisent évidemment afin qu'ils puissent envoyer à n'importe qui.
gbjbaanb
1
@gbjbaanb Je pense que techniquement, vous sérialisez des données si elles sont transmises sous la forme d'une chaîne de bits séquentielle, quelle que soit la structure de codage.
tylerl
6

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.

David Hammen
la source