2010-01-20 5 views

Antwort

53

Es ist mehr eine Frage des Designs, als Geschwindigkeit (Shared Memory ist schneller), Domain-Sockets sind definitiv mehr UNIX-Stil, und tun viel weniger Probleme. In Bezug auf die Wahl vorher wissen:

Domain Sockets Vorteile

  • Blockierung und Modus nicht blockierende und das Umschalten zwischen ihnen
  • Sie müssen sie nicht freigeben, wenn Aufgaben abgeschlossen sind

Domain Sockets Nachteile

  • müssen in linearer Weise

Shared Memory Vorteile

  • nichtlinearen Speicher
  • wird niemals blockieren
  • mehrere Programme lesen und schreiben kann darauf zugreifen

Shared Memory Nachteile

  • Notwendigkeit Verriegelungs Implementierung
  • manuelle Freigabe benötigen, selbst wenn sie nicht benutzt von jedem Programm

Das ist alles, was ich jetzt denken kann. Allerdings würde ich jeden Tag mit Domain-Sockets gehen - ganz zu schweigen davon, dass es dann viel einfacher ist, sie für verteiltes Computing neu zu implementieren. Der Geschwindigkeitsgewinn von Shared Memory wird wegen der Notwendigkeit eines sicheren Designs verloren gehen. Wenn Sie jedoch genau wissen, was Sie tun, und die richtigen Kernel-Aufrufe verwenden, können Sie erreichen größere Geschwindigkeit mit Shared Memory.

+0

+1 für den Vergleich. – jldupont

+0

Danke für die ausführliche Antwort und den Vergleich! – SyBer

+2

'müssen manuelle Freigabe, auch wenn von keinem Programm unbenutzt 'kann mit [' /dev/ashmem'](http://lwn.net/Articles/452035/) –

2

Beide sind Interprozesskommunikation (IPC) Mechanismen. UNIX-Domain-Sockets werden für die Kommunikation zwischen Prozessen auf einem Host verwendet, ähnlich wie TCP-Sockets zwischen verschiedenen Hosts verwendet werden. Shared Memory (SHM) ist ein Stück Speicher, in dem Sie Daten zwischen Prozessen austauschen können. SHM bietet Ihnen wahlfreien Zugriff mit Hilfe von Zeigern, Sockel können geschrieben oder gelesen werden, aber Sie können nicht zurückspulen oder positionieren.

7

In Bezug auf die Geschwindigkeit Shared Memory ist definitiv der Gewinner. Bei Sockets haben Sie mindestens zwei Kopien der Daten - vom Sendeprozess zum Kernel-Puffer, dann vom Kernel zum Empfangsprozess. Bei gemeinsam genutztem Speicher wird die Latenz nur durch den Cache-Konsistenz-Algorithmus zwischen den Kernen auf der Box gebunden.

Wie Kornel bemerkt, ist der Umgang mit Shared Memory komplizierter, da Sie Ihr eigenes Synchronisations-/Signalisierungsschema entwickeln müssen, das je nach Route eine Verzögerung mit sich bringt. Verwenden Sie Semaphore unbedingt im Shared Memory (implementiert mit futex unter Linux), um Systemaufrufe im nicht-konkurierten Fall zu vermeiden.

+0

Ich glaube, dass was unterscheidet Unix Domain-Sockets aus normale Sockets ist, dass ein Schreiben an einem Ende direkt in den/die Empfangspuffer am anderen Ende geht. Es gibt also nicht unbedingt zusätzliche Kopien. Dies kann immer noch mehr Kopien als erforderlich sein, wenn Sie herausfinden können, wie Apps dasselbe Objekt im Shared Memory verwenden können, anstatt es zu kopieren. –

+0

Es gibt mindestens zwei zusätzliche Kopien - vom Benutzer zum Kernel und dann zurück. –

0

In diesem Fall - Steckdosen sind schneller. Schreiben in Shared Memory ist schneller als jede IPC, aber das Schreiben in eine Memory-Mapped-Datei und das Schreiben in Shared Memory sind zwei völlig verschiedene Dinge.

Wenn Sie in eine Speicherabbilddatei schreiben, müssen Sie das, was in den gemeinsamen Speicher geschrieben wurde, in eine tatsächlich gebundene Datei "putzen" (nicht genau, die Spülung wird für Sie erledigt), also kopieren Sie Ihre Daten zuerst in die shared memory, und dann kopierst du es wieder (flush) in die eigentliche Datei und das ist super duper expansive - mehr als alles, sogar mehr als Schreiben in Socket, du gewinnst nichts, indem du das tust.

+2

Das ist nicht wahr. Es ist relativ einfach, Shared Memory über eine Memory-Mapped-Datei (was der normale Mechanismus ist) einzurichten, und die gemeinsame Nutzung von Daten erfolgt auf schnelle Weise. –