2010-02-25 8 views
7

Ich brauche 2 verschiedene Programme, um an einem einzigen Datensatz zu arbeiten. Ich kann eine Netzwerk (UDP) Verbindung zwischen ihnen einrichten, aber ich möchte die Übertragung der gesamten Daten mit allen Mitteln vermeiden.Ist es möglich, einen gemeinsamen Zeiger zwischen 2 verschiedenen Programmen auf dem gleichen Computer zu haben

Es klingt ein wenig absurd, aber ist es möglich, eine Art Zeiger zwischen diesen beiden Programmen zu teilen, so dass, wenn man es aktualisiert, der andere einfach den Zeiger bekommen und damit anfangen kann?

ich Ubuntu bin mit 9.10

+1

Es ist möglich, aber Lösungen sind OS-spezifisch, für welches Betriebssystem möchten Sie dies? –

+1

Jede spezifische Plattform? Viele Systeme können speicherdefinierte Dateien unterstützen. – kenny

+2

kurze Antwort: Shared Memory. Etwas länger: Wenn Sie bereits serialisieren, sollten Sie einen lokalen Socket oder eine Pipe in Betracht ziehen: ähnliche semantische, keine IP/(gefälschten) Netzwerk-Overhead. – Javier

Antwort

12

Sie sprechen über IPC - Interprocess Communication. Es gibt viele Möglichkeiten.

Eine davon ist eine Memory-Mapped-Datei. Es kommt dem nahe, was du beschrieben hast. Es ist aber möglicherweise nicht der optimale Ansatz für Ihre Anforderungen. Informieren Sie sich auf IPC, um etwas Tiefe zu bekommen.

+2

Hier ist ein Link, der helfen könnte. Es verwendet die Boost-Bibliotheken. http://www.boost.org/doc/libs/1_37_0/doc/html/interprocess/quick_guide.html#interprocess.quick_guide.qg_interprocess_map – Dan

+0

Das stimmt, aber Linux IPC ist überhaupt nicht benutzerfreundlich ... –

+1

IPC ist im Allgemeinen nicht einfach. Dinge wie Dateien (einschließlich Memory-Mapped-Dateien) und Sockets werden vom Betriebssystem beim Beenden des Prozesses bereinigt. Shared Memory tut dies normalerweise nicht. Daher wissen Sie im Allgemeinen nicht, ob ein bestimmter gemeinsamer Speicherblock verwendet wird, und Ihr Programm muss irgendwie feststellen, ob der benötigte gemeinsame Speicherblock erstellt werden muss oder nicht. –

0

Nein, leider nicht. Ich habe vor langer Zeit von einem experimentellen Betriebssystem gehört, das einen sehr großen Adressraum hatte, wo Teile davon auf einer Maschine und andere Teile auf anderen Maschinen waren. Es hätte genau das erlaubt was du fragst ...

Hinweis: Ich gehe davon aus, dass die 2 Programme auf unterschiedlichen Rechnern laufen. Wenn es sich einfach um verschiedene Prozesse handelt, können Sie benannte Abschnitte verwenden, um Daten gemeinsam zu nutzen.

1

POSIX Shared Memory-Funktionen für Unix-Aromen. IBM Mainframes (370/xa/esa/Zos) können cross-memory Dienste auf niedriger Ebene nutzen. Sie müssen auch darüber nachdenken, ob Ihre App über einen einzelnen Prozessor skaliert wird oder nicht.

9

Was Sie suchen, wird normalerweise "Shared Memory-Segment" genannt, und wie Sie darauf zugreifen, ist plattformspezifisch.

Auf POSIX-Systemen (die meisten Unix/Linux) verwenden Sie die shm _ *() - APIs in sys/shm.h.

Auf Win32, ist es mit Memory-Mapped-Dateien durchgeführt, werden Sie so verwenden Create()/MapViewOfFile() usw.

Nicht sicher Macs aber wahrscheinlich shm _ *() auch dort nutzen können.

+1

shm_ * wird auch auf Macs funktionieren, obwohl Mach-Ports der bevorzugte Weg sind. – zneak

0

die Tatsache Läßt man einmal beiseite, dass es kann erfolgen, Interprozess-Kommunikation wird nie durch den Austausch von Ressourcen getan - nicht Speicherplatz zu erwähnen. Das ist ein richtiges Rezept für eine Katastrophe.

Korrekte IPC wird mit geeigneten Kommunikationsmitteln wie Sockets durchgeführt. Sharing Memory ist nie der richtige Weg.

+0

Warum nie? Es hängt von der Anwendung ab, und sogar ein Apache-Webserver verwendet ein "Scoreboard" mit gemeinsamem Speicher für die Kommunikation zwischen seinen Prozessen. – Frunsi

+0

Im Allgemeinen ist es besser zu versuchen, zwei Programme/Threads zu vermeiden, die in denselben Speicher schreiben (obwohl es manchmal der beste Weg ist). Wenn jedoch einer der Prozesse/Threads nur den Speicher liest, ist dies weitgehend OK mit allen Einschränkungen, die für die Verwendung von gemeinsam genutztem Speicher gelten. –

2

Shared Memory kann über die höchste verfügbare Bandbreite von IPCs verfügen, aber es ist auch sehr mühsam zu verwalten - Sie müssen den Zugriff auf den Shared Memory synchronisieren, genau wie bei Threads. Wenn Sie wirklich brauchen diese rohe Bandbreite, es ist über die beste gibt es - aber ein Design, das diese Art von Bandbreite benötigt oft eine mit einer schlecht gewählten Trennlinie zwischen den Prozessen, in diesem Fall kann es unnötig schwierig zu bekommen es funktioniert gut.

Beachten Sie auch, dass Pipes (für ein Beispiel) sind viel einfacher zu bedienen, und immer noch ziemlich ernsthafte Bandbreite - sie immer noch (normalerweise) einen Kernel-reservierten Puffer im Speicher verwenden, aber sie automatisieren den Zugriff darauf synchronisieren. Der Verlust der Bandbreite ist darauf zurückzuführen, dass die automatische Synchronisation einen sehr pessimistischen Sperralgorithmus erfordert. Das kostet aber immer noch nicht viel Overhead ...

+0

Die Leistung des IPC-Mechanismus ändert sich je nach Betriebssystem. Keine Garantie für die Leistung von Shared Any. Auf einigen Systemen ist Shared Memory sogar langsamer als andere Methoden, wie die Verwendung von Pipes, wie Sie es vorgeschlagen haben. – kriss

1

Vielleicht könnte die Verwendung von "memcached" als Broker zwischen Ihren beiden Prozessen besser sein, dann kann jeder Prozess die Schlüssel untereinander austauschen.

Ihre Einschränkung durch Ich glaube 1024Kb pro Schlüssel/Wert-Paar oder weniger, aber unmittelbare Vorteile sind Interoperabilität, Stabilität und die zukünftige Fähigkeit, mehrere Prozesse auf mehreren Maschinen miteinander zu verbinden.

1

Wenn Sie wirklich, wirklich tun müssen, ist es ein Hinweis, dass Ihre beiden Programme wirklich zu einem mit zwei Threads geändert werden können ... (Wenn Sie Programmquellen haben, ist es ein Kinderspiel, es zu tun).

Verwandte Themen