Wie man Shared Objekt im Shared Memory
Unserer app hängt auf einem externen, 3rd-party-gelieferten Konfiguration (einschließlich der benutzerdefinierten Fahr - /Entscheidungsfindung-Funktionen) ladbare .damit die Datei.
Unabhängig, kooperiert es mit externen CGI-Module über einen Teil des shared memory, wo fast alle seiner flüchtigen Zustand gehalten wird, so dass die externen Module können Lesen Sie es und ändern Sie es gegebenenfalls.
Das problem ist die CGI-Module benötigen eine Menge der ständigen config-Daten aus der .so, und die Haupt-app führt eine ganze Menge von völlig unnötige kopieren zwischen den zwei Speicherkarten Bereiche, um die Daten zur Verfügung. Die Idee ist, den ganzen Shared-Object-laden in Shared Memory, und stellen Sie es direkt an die CGI. Das problem ist: wie?
- dlopen und dlsym bieten keine Einrichtungen für die Zuweisung von wo laden Sie die SO-Datei.
- wir haben versucht, shmat(). Es scheint zu funktionieren nur bis einige externe CGI tatsächlich versucht, auf das shared memory zugreifen. Dann wird die Fläche wies auf angezeigt, genauso wie die privaten, als ob es nie geteilt. Vielleicht machen wir etwas falsch?
- laden .also in jedem script, die es braucht, steht außer Frage. Die schiere Größe, die Struktur, verbunden mit der Häufigkeit der Anrufe (einige Skripte werden aufgerufen, wenn eine zweite zu generieren, live-updates), und das ist eine embedded app machen es no-go.
- einfach memcpy()'ing der .so in shm ist entweder nicht gut - einige Strukturen und alle Funktionen sind miteinander durch Zeiger.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, die einfachste Möglichkeit wäre die Verwendung von memory-mapped-Datei, was Neil vorgeschlagen hat, schon. Wenn diese option nicht füllen gut, alternative ist, könnte sein, zu definieren, dedizierte Zuweisung. Hier ist eine gute Abhandlung darüber: Erstellen von STL-Containern im Shared Memory
Es eignet sich auch hervorragend Ionen Gaztañaga ist Boost.Interprozesskommunikation Bibliothek mit
shared_memory_object
und damit verbundene Funktionen. Ion hat vorgeschlagen, die Lösung der C++ - Standardisierung-Komitees für die zukünftige TR: Memory-Mapped-Dateien Und Gemeinsam Genutzten Speicher Für C++was kann darauf hindeuten, lohnt es sich, die Lösung zu prüfen.
Das erste, was zu beachten bei der Verwendung von shared memory ist, dass die gleichen physischen Speicher kann gut zugeordnet werden, in der zwei Prozesse virtuellen Adressraum wie verschiedene Adressen. Dies bedeutet, dass, wenn Zeiger verwendet werden, überall in Ihrem Daten-Strukturen, Sie gehen, um Probleme zu verursachen. Alles arbeiten muss, die aus einem index oder mit einem Versatz um korrekt zu arbeiten. Shared memory, Sie haben zu bereinigen, alle Hinweise aus dem code.
Beim laden ein .also die Datei, nur eine Kopie der .also Datei-code geladen wird (daher auch der Begriff " shared object).
fork
kann auch Ihr Freund hier. Die meisten modernen Betriebssysteme implementieren copy-on-write-Semantik. Dies bedeutet, dass, wenn Siefork
Ihre Daten-Segmente werden nur dann kopiert und in separaten physischen Speicher wenn ein Prozess schreibt die angegebenen Daten segment.Platzierung tatsächlichen C++ - Objekte im shared memory ist sehr, sehr schwierig, da Sie gefunden haben. Ich würde empfehlen Ihnen dringend, gehen Sie nicht Weg - setzen von Daten, gemeinsame Nutzung von shared memory oder ein memory-mapped-Datei ist viel einfacher und wahrscheinlich viel robuster.
Müssen Sie implementieren Objekts Serialisierung
Serialisierung Funktion umwandeln des Objekts in bytes, dann kann man bytes schreiben in SharedMemory und Ihre CGI-Modul zu Deserialisieren bytes-Objekt.