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
On Wed, 2003-01-22 at 14:34, Raimund Hölle wrote:
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. Müssen es Prozesse sein? Mit Threads wäre so etwas möglich.
Weiß jemand, ob das mit Shared Libraries unter Linux auch möglich ist? Nie probiert, dürfte aber nicht möglich sein.
Oder kennt jemand einen anderen Weg, um das Problem zu lösen? Client/Server-Konzepte, Kommunikation über ein dediziertes Low-Level Protokol (TCP/UDP), rpc, CORBA, SVSV-SHM o.ä.
Persistente Objekte (werden meist über SYSV-SHM realisiert) Ralf
Hi all, Am Mittwoch, 22. Januar 2003 17:06 schrieb Ralf Corsepius:
On Wed, 2003-01-22 at 14:34, Raimund Hölle wrote:
kennt jemand einen Weg, wie mehrere Prozesse auf gemeinsame Daten in einer shared library zugreifen können?
[...] Ich habe Raimund Frage jetzt so verstanden: "Es dauert einfach zulange, wenn jeder Prozess diese Datei einliest"
Müssen es Prozesse sein? Mit Threads wäre so etwas möglich.
Weiß jemand, ob das mit Shared Libraries unter Linux auch möglich ist?
Nie probiert, dürfte aber nicht möglich sein.
Ich hab's auch noch nicht probiert, aber warum sollte eine shared library nicht auch diese Möglickeit bieten? Ich habe keine Ahnung was genau eine "shared library" macht. IMHO wird sie dynamisch von einem Programm dazu "gelinkt". Einmal nehme ich an... Es gibt eine Methode init(), die lädt die Konfiguration und erzeugt mit den Daten neues Objekt und gibt dieses an Deine Applikation weiter. Das Objekt stellt Methoden breit, die die Werte lesen, aber keinerlei Veränderungen zuläßt. Im Programm mußt Du die "init()" aufrufen bevor die Prozesse erzeugt werden und den Speicher dafür besorgen. Anschliessen sollte doch jeder Prozess "lesen" dürfen? Ist nur so 'ne leichtsinnige Idee ;) Ciao Andre
Hi, On Wed, 22 Jan 2003, Andre Heine wrote:
Ich hab's auch noch nicht probiert, aber warum sollte eine shared library nicht auch diese Möglickeit bieten?
shared libs und shared mem haben auf diesem Level nichts miteinander zu tun. Unter ELF ist es _nicht_ moeglich eine Art gemeinsamen Speicher in einem DSO zu deklarieren, der dann von allen Prozessen benutzt wird. Jeder Prozess hat seinen eigenen Datenbereich (es sei dann man legt von Hand was anderes an). Allerdings will Raimund auch das unmoegliche: er will shared mem nicht benutzen, beschreibt aber doch das Konzept von shared mem ;-) Raimund: SysV shared mem ist wirklich nicht allzu schwer. Erst recht nicht, wenns dir im wesentlichen nur um einen Block geht. Eine andere Alternative ist, ueber mmap() ein (read-only) shared mapping einer Datei zu erzeugen, die vorher anzulegen ist, und den "geparsten" Inhalt deiner Eingabe enthaelt. Eine ganz andere Moeglichkeit sind thread, die sich den Addressraum von Haus aus teilen. Ciao, Micha.
Hallo, erst mal vielen Dank für eure Antworten. Michael Matz schrieb:
Hi,
On Wed, 22 Jan 2003, Andre Heine wrote:
Ich hab's auch noch nicht probiert, aber warum sollte eine shared library nicht auch diese Möglickeit bieten?
shared libs und shared mem haben auf diesem Level nichts miteinander zu tun. Unter ELF ist es _nicht_ moeglich eine Art gemeinsamen Speicher in einem DSO zu deklarieren, der dann von allen Prozessen benutzt wird. Jeder Prozess hat seinen eigenen Datenbereich (es sei dann man legt von Hand was anderes an). Allerdings will Raimund auch das unmoegliche: er will shared mem nicht benutzen, beschreibt aber doch das Konzept von shared mem ;-)
Tja, man muß halt träumen können ... wie schon gesagt, unter OS/2 war's möglich ...
Raimund: SysV shared mem ist wirklich nicht allzu schwer. Erst recht nicht, wenns dir im wesentlichen nur um einen Block geht. Eine andere Alternative ist, ueber mmap() ein (read-only) shared mapping einer Datei zu erzeugen, die vorher anzulegen ist, und den "geparsten" Inhalt deiner Eingabe enthaelt.
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.
Eine ganz andere Moeglichkeit sind thread, die sich den Addressraum von Haus aus teilen.
Leider nicht anwendbar, da es um unterschiedlichste Prozesse (Binaries) geht. Ich werde nun wohl in den sauren Apfel beißen und die Shared-Memory-Strukturen und -Zugriffsfunktionen zu Fuß programmieren :-( Viele Grüße Raimund
participants (4)
-
Andre Heine
-
Michael Matz
-
Raimund Hölle
-
Ralf Corsepius