2010-12-06 19 views
4

Ich arbeite gerade an einer ziemlich großen single-threaded, ereignisbasierten Anwendung, die unter Linux und vergleichbaren Technologien unter anderen Plattformen um epoll herum entwickelt wurde. Derzeit, wann immer wir möchten, dass zwei Instanzen kommunizieren, tun sie das typischerweise über Sockets, egal ob sie auf demselben Rechner laufen oder nicht. Aus Gründen der Leistung stelle ich mir die Verwendung einer Form von IPC vor, um dieselbe Maschinenkommunikation zu beschleunigen. Jetzt muss ich entscheiden, welcher IPC-Mechanismus verwendet werden soll.Auswahl einer IPC-Lösung für eine ereignisgesteuerte Anwendung

Folgende Faktoren sind wichtig für mich:

  • ereignisgesteuert, ohne komplettes Redesign - wenn der IPC-Mechanismus nicht gut mit epoll passt, das ist Monate Arbeit für mich verloren
  • schnell - wenn dieser Mechanismus nicht schneller als Steckdosen ist, es lohnt sich nicht die Zeit, die während der Ausführung
  • flexibel und (re) konfigurierbare Implementierung - ich glaube, das MPI & al
  • erforderlich kein Multi-Threading-Regeln aus.

Ich bin bereit, verschiedene Mechanismen für verschiedene Plattformen zu verwenden, solange sie alle das gleiche Paradigma verwenden. Ich bin auch bereit, so tief wie nötig in C/C++/Obj-C für plattformspezifische Bindungen zu bekommen.

Irgendwelche Vorschläge?

Danke.

+1

By the way, Steckdosen viel bessere Leistung haben, wenn sie auf der gleichen Maschine geöffnet sind: http://stackoverflow.com/questions/1644851/sockets-on-same -machine-for-windows-and-linux/1650906 # 1650906 –

+0

Nun, nach meiner Erfahrung, IP-Sockets nicht. – Yoric

Antwort

3

Unix-Sockets. Benannte Rohre. FIFOs.

Diese bieten alle die gleiche Grundfunktionalität - dieselbe Kommunikation über die Maschine hinweg. Die Implementierungen bieten jedoch ein etwas anderes Verhalten.

Sie alle verwenden Dateideskriptoren, so dass Sie sie buchstäblich einfach dort einstecken können, wo Ihre Steckdose war.

+0

IIRC, FIFOs sind auf Pipes implementiert, und Pipes haben den Ruf, nicht zu schnell zu sein (ich habe das seit Jahren nicht mehr überprüft, daher bin ich vielleicht nicht auf dem neuesten Stand). – Yoric

+1

* Nixes haben traditionell viel Zeit damit verbracht, ihre Pipeline-Implementierung zu optimieren. Sie sind nicht langsam, gehören aber zu den schnellsten IPC-Mechanismen. – nos

+0

Ok, gut zu wissen. – Yoric

2

in der Tat, wie skwllsp erwähnt, die AF_INET Sockets sind für die Datenübertragung auf lokalen Host optimiert und die Geschwindigkeit und Komplexität ist vergleichbar (fast das gleiche?) Mit Fifos, Pipes, Unix-Sockets (viele skbuff Verarbeitung wird übersprungen, wenn Das Ziel ist derselbe Host). mein 2 Cent ist es, Steckdosen zu benutzen. Auf diese Weise behalten Sie nicht nur die gleiche Schnittstelle für Ihren IPC-Mechanismus bei, sondern können Ihren Code sowohl für Remote- als auch für lokale Szenarien wiederverwenden.

0

Probieren Sie Unix SysV IPC aus. Es unterstützt: -

  • Message Queues
  • Semaphore
  • Shared Memory

, die Ihnen helfen könnten.

Dieser Link könnte mehr helfen: http://www.ibm.com/developerworks/aix/library/au-ipc/index.html

+0

Ist SysV IPC wirklich kompatibel mit dem epoll-Ansatz? Ich hatte den Eindruck, dass dies nicht der Fall war. – Yoric

+0

Ich konnte keinen Grund für Inkompatibilität finden, aber um ehrlich zu sein, bin ich mir nicht sicher! Nun, die Sache ist SysV IPC ist nur ein anderer Typ und solange Sie es schaffen, Socket zu verwenden (obwohl ich nicht weiß, welchen Socket Sie verwendet haben, ich denke TCP), dann sollte es kein Problem sein. – Omid

+0

Lassen Sie mich umformulieren: Epoll ist sehr viel fd-orientiert. SysV IPC verwendet ein komplettes Event-System, oder? Also müsste ich im Wesentlichen von zwei Quellen anstatt von einem abstimmen? – Yoric