RE: shared libraries - gemeinsamer Datenbereich
Hi, ausser shared memory faellt mir nix ein. Die Administrierung ist m. E. gar nicht so schlimm, bzw. laesst ich gut kapseln. Bye -----Original Message----- From: Raimund Hölle [mailto:mailings@hoelle-online.de] Sent: Mittwoch, 22. Januar 2003 14:35 To: SuSE Programmierung Subject: shared libraries - gemeinsamer Datenbereich Hallo, kennt jemand einen Weg, wie mehrere Prozesse auf gemeinsame Daten in einer shared library zugreifen können? Der Hintergrund ist folgender: Mehrere Prozesse sollen alle auf den Inhalt einer Ressource-Datei Zugriff haben. Da der Zugriff auf die Ressourcen sehr häufig passiert, kommt das Durchsuchen der Datei bei jedem Ressourcenzugriff nicht in Frage, irgendwie muß die Datei gepuffert werden (ist ausßerdem XML, also ziemlich aufwendig zu parsen). Da diese Datei sehr groß werden kann (> 1MB) und es u. U. mehrere hundert Prozesse gleichzeitig gibt, ist das Laden der Datei beim Programmstart in den Heap nicht möglich. Um die Verwendung von Shared Memory möchte ich mich rumdrücken, da die Verwaltung doch recht kompliziert ist - die gesamte Speicherzuteilung muß manuell gestrickt werden, ich kann nicht auf existierende C++-Listen- und Stringbibliotheken zurückgreifen. Aus meiner OS/2-Zeit kenne ich das Prinzip der DLL's, bei denen es möglich war, einen Speicherbereich zu definieren, der für alle gelinkten Prozesse gemeinsam war; hier konnte z. B. ein Zeiger auf eine Heap-Struktur hinterlegt werden. Weiß jemand, ob das mit Shared Libraries unter Linux auch möglich ist? Oder kennt jemand einen anderen Weg, um das Problem zu lösen? Bin für jede Hilfe dankbar! Viele Grüße Raimund -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-programming-unsubscribe@suse.com Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-programming-help@suse.com
On Mittwoch, 22. Januar 2003 15:54, Rinke, Reiner wrote:
kennt jemand einen Weg, wie mehrere Prozesse auf gemeinsame Daten in einer shared library zugreifen können? ... Um die Verwendung von Shared Memory möchte ich mich rumdrücken, da die Verwaltung doch recht kompliziert ist - die gesamte Speicherzuteilung muß manuell gestrickt werden, ich kann nicht auf existierende C++-Listen- und Stringbibliotheken zurückgreifen.
Ganz weit hinten im Hinterkopf habe ich, daß man bei C++ und STL Allokatoren angeben kann, die eben dieses bewirken - daß ein Objekt in einer bestimmten Art Speicher angelegt wird. Schau' doch mal im Stroustrup-Buch nach!
Aus meiner OS/2-Zeit kenne ich das Prinzip der DLL's, bei denen es möglich war, einen Speicherbereich zu definieren, der für alle gelinkten Prozesse gemeinsam war; hier konnte z. B. ein Zeiger auf eine Heap-Struktur hinterlegt werden.
Weiß jemand, ob das mit Shared Libraries unter Linux auch möglich ist?
Klar, wenn Du dort Shared Memory verwendest...
;-)
CU
--
Stefan Hundhammer
Hallo, erst mal vielen Dank für eure Antworten. Stefan Hundhammer schrieb:
On Mittwoch, 22. Januar 2003 15:54, Rinke, Reiner wrote:
kennt jemand einen Weg, wie mehrere Prozesse auf gemeinsame Daten in einer shared library zugreifen können?
...
Um die Verwendung von Shared Memory möchte ich mich rumdrücken, da die Verwaltung doch recht kompliziert ist - die gesamte Speicherzuteilung muß manuell gestrickt werden, ich kann nicht auf existierende C++-Listen- und Stringbibliotheken zurückgreifen.
Ganz weit hinten im Hinterkopf habe ich, daß man bei C++ und STL Allokatoren angeben kann, die eben dieses bewirken - daß ein Objekt in einer bestimmten Art Speicher angelegt wird. Schau' doch mal im Stroustrup-Buch nach!
Leider gibt es keine Möglichkeit, dies im Shared Memory anzulegen. Das Problem ist, daß C++-Objekte virtuelle Methodentabellen besitzen, die mit Zeigern auf Speicheraadressen arbeiten. Auch die gesamten STL-Container verwalten ihre Objekt mit Hilfe von Zeigern. Legt nun ein Programm ein Objekt im Shared Memory an, steht im Shared Memory also ein Zeiger mit fester Speicheradresse. Dockt ein weiterer Prozess an das Shared Memory an (attach), bekommt er (zumindest unter Linux) mit hoher Wahrscheinlichkeit eine neue Adresse zugeteilt, damit sind alle im Shared Memory enthaltenen Zeiger falsch. [...] Ich werde nun wohl in den sauren Apfel beißen und die Shared-Memory-Strukturen und -Zugriffsfunktionen zu Fuß programmieren :-( Viele Grüße Raimund
Hallo Reiner, danke für deine Antwort. Rinke, Reiner schrieb:
-----Original Message----- Raimund Hölle [mailto:mailings@hoelle-online.de]
kennt jemand einen Weg, wie mehrere Prozesse auf gemeinsame Daten in einer shared library zugreifen können? [...]
Hi, ausser shared memory faellt mir nix ein. Die Administrierung ist m. E. gar nicht so schlimm, bzw. laesst ich gut kapseln.
Es geht mir nicht um den bischen Code zum Anlegen und Andocken des Shared Memory, sondern darum, komplexe Strukturen (Listen mit mehreren Hierarchieebenen) in das Shared Memory zu legen - im Adressraum des Programmes verwende ich eine C++-Listenklasse, die die gesamten Operationen, incl. Verwaltung, Suche usw. bereits vorgibt, der Code den ich selber schreiben muß, wird dadurch stark minimiert. Dies funktioniert im Shared Memory leider nicht.
[...]
Gruß Raimund
Raimund Hölle wrote:
Hallo Reiner,
danke für deine Antwort.
Rinke, Reiner schrieb:
-----Original Message----- Raimund Hölle [mailto:mailings@hoelle-online.de]
kennt jemand einen Weg, wie mehrere Prozesse auf gemeinsame Daten in einer shared library zugreifen können? [...]
Hi, ausser shared memory faellt mir nix ein. Die Administrierung ist m. E. gar nicht so schlimm, bzw. laesst ich gut kapseln.
Es geht mir nicht um den bischen Code zum Anlegen und Andocken des Shared Memory, sondern darum, komplexe Strukturen (Listen mit mehreren Hierarchieebenen) in das Shared Memory zu legen - im Adressraum des Programmes verwende ich eine C++-Listenklasse, die die gesamten Operationen, incl. Verwaltung, Suche usw. bereits vorgibt, der Code den ich selber schreiben muß, wird dadurch stark minimiert.
Dies funktioniert im Shared Memory leider nicht.
Du kannst dem Linux aber befehlen, an welche Adresse es ein shared memory segment in den Adressraum Deines Prozesses einblenden soll. Wenn jeder Prozess das segment an die gleiche Adresse blendet, können die Prozesse sogar untereinander Zeiger austauschen! Ciao Tobi
Tobias Barth schrieb:
Raimund Hölle wrote:
Rinke, Reiner schrieb:
Raimund Hölle [mailto:mailings@hoelle-online.de]
kennt jemand einen Weg, wie mehrere Prozesse auf gemeinsame Daten in einer shared library zugreifen können?
[...]
Hi, ausser shared memory faellt mir nix ein. Die Administrierung ist m. E. gar nicht so schlimm, bzw. laesst ich gut kapseln.
Es geht mir nicht um den bischen Code zum Anlegen und Andocken des Shared Memory, sondern darum, komplexe Strukturen (Listen mit mehreren Hierarchieebenen) in das Shared Memory zu legen - im Adressraum des Programmes verwende ich eine C++-Listenklasse, die die gesamten Operationen, incl. Verwaltung, Suche usw. bereits vorgibt, der Code den ich selber schreiben muß, wird dadurch stark minimiert.
Dies funktioniert im Shared Memory leider nicht.
Du kannst dem Linux aber befehlen, an welche Adresse es ein shared memory segment in den Adressraum Deines Prozesses einblenden soll. Wenn jeder Prozess das segment an die gleiche Adresse blendet, können die Prozesse sogar untereinander Zeiger austauschen!
Ja, allerdings hat dies mehrere Nachteile, für die ich momentan keine Lösung kenne: 1. Ein shmat()-Aufruf mit angegebener Adresse ist nicht portabel, das Programm muß leider auch unter HPUX arbeiten (wobei es bei der derzeitigen HPUX-Version so ist, daß das Speichersegment sowieso immer unter der gleichen Adresse sichtbar wird). 2. Da unterschiedliche Programme (Binaries) das Shared Memory Segment einbinden müssen, ist es problematisch, immer die gleiche Adresse zu verwenden (ist aber lösbar). 3. (Und das ist mein Hauptproblem!) Wie überrede ich C++, die Objekte in dem Shared Memory zu verwalten, anstatt auf dem Heap? Leider bringt es nichts, nur neue new() und delete() Funktionen anzulegen, da ja bestehende Bibliotheken (u. a. STL) auch diese Funktionen dann benutzen müssen. Mit Punkt 1. und 2. könnte ich leben, wenn ich eine Lösung für 3. finden würde. Viele Grüße Raimund
On Freitag, 24. Januar 2003 11:16, Raimund Hölle wrote:
3. (Und das ist mein Hauptproblem!) Wie überrede ich C++, die Objekte in dem Shared Memory zu verwalten, anstatt auf dem Heap? Leider bringt es nichts, nur neue new() und delete() Funktionen anzulegen, da ja bestehende Bibliotheken (u. a. STL) auch diese Funktionen dann benutzen müssen.
Mit Punkt 1. und 2. könnte ich leben, wenn ich eine Lösung für 3. finden würde.
Das sollten die Allokatoren der STL bieten. Ich habe neulich daraufhin mal im
Stroustrup-Buch nachgesehen; es ist sicherlich mit Aufwand verbunden, aber es
sollte gehen.
Im Prinzip mußt Du Allokator-Klassen schreiben, die dann eben ein überladenes
new() benutzen, das dann Shared Memory verwendet.
CU
--
Stefan Hundhammer
participants (4)
-
Raimund Hölle
-
Rinke, Reiner
-
Stefan Hundhammer
-
Tobias Barth