Was sind die Vor- und Nachteile der Kommunikation zwischen Prozessen über Sockets im Vergleich zum gemeinsam genutzten Speicher?

9

Ich verstehe, dass zwei der vielen weiteren Optionen für die Kommunikation zwischen Prozessen sein können:

  1. Geteilte Erinnerung
  2. Steckdosen

Eigentlich habe ich gesehen, dass diese beiden Optionen von Intellij Idea zum Debuggen einer Java-Anwendung verfügbar gemacht wurden. Ich möchte wissen, was die Vor- und Nachteile jedes Ansatzes sind.

Geek
quelle
Eine neuere Methode ist D-Bus.
ott--
@ ott-- Verwendet D-Bus nicht selbst Unix-Domain-Sockets?
@BrianMarshall In der Tat Domain- und TCP / IP-Sockets.
ott--
Auch hier gibt es Antworten: stackoverflow.com/a/1844919/632951
Pacerier

Antworten:

11

Ein paar Vorteile für jeden auf meinem Kopf. Beachten Sie, dass einige dieser Elemente möglicherweise nicht in allen Fällen zutreffen. Dies sind nur allgemeine Beobachtungen.

Steckdosen

Einfach und kontrolliert. Kann bei Bedarf ohne oder mit nur geringen Änderungen auf Netzwerk-Sockets erweitert werden. Das Programmiermodell erfordert eine Serialisierung, bei der Sie überlegen müssen, welche Daten tatsächlich von A nach B übertragen werden. Die Synchronisierung ist notwendigerweise in den Kommunikationsmechanismus integriert. Keine weitere Synchronisation erforderlich.

Geteilte Erinnerung

Erfordert nicht unbedingt einen Systemaufruf (daher möglicherweise schneller). Für die Freigabe müssen keine Daten explizit übertragen werden. Es können Daten zur Verfügung gestellt werden, die der Empfänger nicht abruft (Bandbreite muss nicht verschwendet werden, um Daten zu übertragen, die der Empfänger nicht verwendet). Kein Serialisierungs- / Deserialisierungsschritt bedeutet, dass keine Zeit für den Kommunikationsaufwand aufgewendet wird.

tylerl
quelle
4
+1: Sockets lassen sich auf verteilte Systeme skalieren, während Shared Memory viel schneller ist.
Mouviciel
@tylerl Warum erfordert Shared Memory keinen Syscall?
Geek
@Geek: Informieren Sie sich darüber, wie die Verwaltung des virtuellen Speichers in modernen Betriebssystemen implementiert ist. Grundsätzlich ist unter der Haube Shared Memory nahezu identisch mit normalem Prozessspeicher implementiert. Es kommt einfach so vor, dass dieselbe physische Seite absichtlich zwei (oder N) verschiedenen Prozessen zugeordnet wird. Sobald diese Zuordnung hergestellt ist, erzeugt * px = 5 denselben Befehlssatz, unabhängig davon, ob px auf eine reguläre Variable zeigt oder ob es auf ein gemeinsam genutztes Speichersegment zeigt.
DXM
Technisch gesehen müssen Sie keine Daten über einen Socket serialisieren, wenn das Ziel einen Rohbyte-Stream in dem von Ihnen gesendeten Format akzeptieren kann. Die meisten Leute serialisieren offensichtlich, damit sie an jeden senden können.
Gbjbaanb
1
@gbjbaanb Ich denke, technisch gesehen serialisieren Sie Daten, wenn sie als sequentielle Bitfolge übertragen werden, unabhängig von der Codierungsstruktur.
Tylerl
6

Steckdosen sind eins zu eins. Sie benötigen mehrere Sockets, wenn Sie dasselbe an mehrere Prozesse senden möchten. Mit Shared Memory können Sie mehrere Leser und auch mehrere Schreiber haben.

Steckdosen sind ressourcenintensiv. Jede Nachricht geht durch das Betriebssystem. Mit Shared Memory ordnen Sie den Shared Memory nur einmal dem Speicher Ihrer Anwendung zu und von da an können Sie ihn verwenden. Sie müssen jedoch immer noch das Betriebssystem durchlaufen, wenn Sie gemeinsam genutzten Speicher verwendet haben. siehe unten.

Sockets werden synchronisiert (solange Sie kein UDP verwenden). Bei gemeinsam genutztem Speicher benötigen Sie fast zwangsläufig einen zusätzlichen Mechanismus, um anderen Prozessen mitzuteilen, dass das Lesen oder Schreiben in den gemeinsam genutzten Speicher in Ordnung / nicht in Ordnung ist. Tun Sie dies nicht und Sie werden auf Probleme mit beschädigtem Speicher stoßen. Beispiel: Angenommen, Prozess A beginnt mit dem Lesen eines gemeinsam genutzten Blockspeichers, wird jedoch während des Lesevorgangs ausgelagert. Prozess B schreibt in denselben Teil des gemeinsam genutzten Speichers. Wenn Prozess A neu gestartet wird und den gemeinsam genutzten Speicher weiter liest, wird ein Mischmasch aus alten und neuen Daten eingelesen. Um dies zu verhindern, gehen Sie immer noch durch das Betriebssystem, wenn Sie gemeinsam genutzten Speicher verwenden.

Es ist ziemlich einfach, einen Socket-basierten Satz von Anwendungen in einen zu konvertieren, der Netzwerk-Sockets verwendet. Sie können die Verarbeitung auf alle Maschinen in Ihrem Labor oder sogar darüber hinaus verteilen. Mit Shared Memory geht das einfach nicht. Sie sind mit einer gemeinsam genutzten speicherbasierten Lösung an einen Computer gebunden.

Sockets sind für kleine Datenmengen vorgesehen, Shared Memory für große Datenmengen. Die verschiedenen Mechanismen existieren, um verschiedene Probleme zu lösen.

David Hammen
quelle