Wir befinden uns noch in der Entwurfsphase unseres Projekts, denken jedoch an drei separate Prozesse auf einem eingebetteten Linux-Kernel. Einer der Prozesse ist ein Kommunikationsmodul, das die gesamte Kommunikation zum und vom Gerät über verschiedene Medien abwickelt.
Die beiden anderen Prozesse müssen in der Lage sein, Nachrichten über den Kommunikationsprozess zu senden / empfangen. Ich versuche, die von Linux bereitgestellten IPC-Techniken zu bewerten. Die Nachricht, die die anderen Prozesse senden, ist unterschiedlich groß, von Debug-Protokollen bis hin zu Streaming-Medien mit einer Rate von ~ 5 Mbit. Außerdem können die Medien gleichzeitig ein- und ausgehen.
Welche IPC-Technik würden Sie für diese Anwendung vorschlagen? http://en.wikipedia.org/wiki/Inter-process_communication
Der Prozessor läuft zwischen 400 und 500 MHz, wenn sich dadurch etwas ändert. Muss nicht plattformübergreifend sein, nur Linux ist in Ordnung. Die Implementierung in C oder C ++ ist erforderlich.
Antworten:
Ich würde mich für Unix Domain Sockets entscheiden: weniger Overhead als IP-Sockets (dh keine Kommunikation zwischen Maschinen), aber ansonsten der gleiche Komfort.
quelle
select()
(oderpoll()
) Funktionen, um dies zu erreichen. Diese können mehrere Dateideskriptoren (z. B. Ihre Client-Sockets) überwachen und blockieren, bis Daten zum Lesen verfügbar sind. Eine gute Übersicht finden Sie unter notes.shichao.io/unp/ch6 .Bei der Auswahl Ihres IPC sollten Sie Ursachen für Leistungsunterschiede berücksichtigen, einschließlich Übertragungspuffergrößen, Datenübertragungsmechanismen, Speicherzuweisungsschemata, Implementierungen von Sperrmechanismen und sogar Codekomplexität.
Von den verfügbaren IPC-Mechanismen hängt die Wahl der Leistung häufig von Unix-Domain-Sockets oder Named Pipes (FIFOs) ab . Ich habe einen Artikel über die Leistungsanalyse verschiedener Mechanismen für die Kommunikation zwischen Prozessen gelesen , in dem angegeben wird, dass Unix-Domain-Sockets für IPC möglicherweise die beste Leistung bieten. Ich habe an anderer Stelle widersprüchliche Ergebnisse gesehen , die darauf hinweisen, dass Rohre möglicherweise besser sind.
Beim Senden kleiner Datenmengen bevorzuge ich aufgrund ihrer Einfachheit Named Pipes (FIFOs). Dies erfordert ein Paar benannter Pipes für die bidirektionale Kommunikation. Unix-Domain-Sockets benötigen etwas mehr Aufwand für die Einrichtung (Socket-Erstellung, Initialisierung und Verbindung), sind jedoch flexibler und bieten möglicherweise eine bessere Leistung (höherer Durchsatz).
Möglicherweise müssen Sie einige Benchmarks für Ihre spezifische Anwendung / Umgebung ausführen, um festzustellen, welche für Sie am besten geeignet sind. Aus der bereitgestellten Beschreibung geht hervor, dass Unix-Domain-Sockets möglicherweise am besten passen.
Beejs Handbuch zu Unix IPC ist gut für den Einstieg in Linux / Unix IPC.
quelle
Ich kann nicht glauben, dass niemand dbus erwähnt hat.
http://www.freedesktop.org/wiki/Software/dbus
http://en.wikipedia.org/wiki/D-Bus
Wenn Ihre Anwendung architektonisch einfach ist, ist dies möglicherweise etwas übertrieben. In diesem Fall können Sie in einer kontrollierten eingebetteten Umgebung, in der die Leistung von entscheidender Bedeutung ist, den gemeinsam genutzten Speicher nicht übertreffen.
quelle
Wenn die Leistung wirklich zu einem Problem wird, können Sie gemeinsam genutzten Speicher verwenden - dies ist jedoch viel komplizierter als die anderen Methoden. Sie benötigen einen Signalisierungsmechanismus, um zu signalisieren, dass Daten bereit sind (Semaphor usw.), sowie Sperren, um den gleichzeitigen Zugriff auf Strukturen zu verhindern während sie geändert werden.
Der Vorteil ist, dass Sie viele Daten übertragen können, ohne sie in den Speicher kopieren zu müssen, was in einigen Fällen die Leistung definitiv verbessert.
Möglicherweise gibt es verwendbare Bibliotheken, die über den gemeinsamen Speicher übergeordnete Grundelemente bereitstellen.
Der gemeinsam genutzte Speicher wird im Allgemeinen durch mmaping derselben Datei mit MAP_SHARED (die sich auf einem tmpfs befinden kann, wenn Sie nicht möchten, dass sie beibehalten wird) erhalten. Viele Apps verwenden auch gemeinsam genutzten System V-Speicher (IMHO aus dummen historischen Gründen; es ist eine viel weniger schöne Schnittstelle zu derselben Sache).
quelle
Zum Zeitpunkt dieses Schreibens (November 2014) haben Kdbus und Binder den Staging-Zweig des Linux-Kernels verlassen. Derzeit gibt es keine Garantie dafür, dass einer von beiden es schafft, aber die Aussichten sind für beide etwas positiv. Binder ist ein leichter IPC-Mechanismus in Android, Kdbus ist ein dbus-ähnlicher IPC-Mechanismus im Kernel, der den Kontextwechsel reduziert und so das Messaging erheblich beschleunigt.
Es gibt auch "Transparent Inter-Process Communication" oder TIPC, das robust ist, sich für Clustering und die Einrichtung mehrerer Knoten eignet. http://tipc.sourceforge.net/
quelle
Unix-Domain-Sockets erfüllen die meisten Ihrer IPC-Anforderungen. In diesem Fall benötigen Sie keinen dedizierten Kommunikationsprozess, da der Kernel diese IPC-Funktion bereitstellt. Schauen Sie sich auch die POSIX-Nachrichtenwarteschlangen an, die meiner Meinung nach eine der am wenigsten genutzten IPC unter Linux sind, aber in vielen Fällen sehr nützlich sind, in denen n: 1-Kommunikation erforderlich ist.
quelle