Maximale Größe Shared-Memory



  • Hallo.

    Ich arbeite momentan mit den Systemcalls für Shared-Memory (shmget, shmctl, shmat, shdt, ...).

    Da ich eine Große Menge Daten zwischen zwei Prozessen austauschen will, möchte ich natürlich auch die maximal mögliche Größe des Shared-Memory ausnutzen.

    Durch die manual-Pages zu den oben genannten Systemcalls bin ich auf den Parameter SHMMAX aufmerksam geworden. Dieser gibt wohl die maximale Größe eines Speichersegments an.

    Auf der Suche nach einer Möglichkeit, diesen Parameter (SHMMAX) auszulesen fand ich nun auch heraus, dass es sich wohl um einen Kernel-Parameter handelt. Theoretisch könnte ich diesen Parameter also per sysctl(), wenn auch umständlich, auslesen.

    Und hier fängt das eigentliche Problem an:

    Mein Programm soll nicht auf Linux beschränkt sein, sondern auch auf BSD-Systemen laufen. Leider scheidet damit die Möglichkeit, den Parameter per sysctl() auszulesen aus (Linux: kernel.shmmax, BSD: kern.ipc.shmmax). Außerdem unterscheiden sich die sysctl()-Funktionen zwischen den Systemen gewaltig.

    Gibt es eine Möglichkeit diesen Parameter Betriebssystemunabhängig (UNIX) auszulesen?

    Oder gibt es vielleicht sogar eine bessere Möglichkeit die maximale Größe eines Speichersegments herauszufinden?

    Danke
    -jalapeno-



  • Wie waers wenn du mit Makros arbeitest und jeweilt nur den Code benutzt, der jeweils gebraucht wird?
    Eine betriebssystemunabhaengige Variante waere mir jedenfalls nicht bekannt, lasse mich aber gerne korrigieren.



  • Mir ist auch keine Betriebssystem-unabhängige Version bekannt, würde mich ggf. aber auch brennend interessieren.

    Eine Idee ist z.B. auch: Mittels Ausprobieren durch Aufruf von shmget() mit sukzessiver Verdopplung der Größe. Igendwann wird dann wohl ein Fehler auftreten, wenn die Grenze erreicht ist. Das Vorgehen kann man direkt zur Laufzeit machen oder, falls es ein größeres Programmpaket mit Installations-Script ist, mittels eines separaten Programms, das man in einem Makefile anwirft und dann das Ergebnis in eine include-Datei überträgt, die dann anschließend beim Compile-Lauf des eigentlichen Programms benutzt wird. Dann natürlich daran denken, dass die vielen angelegten Test-shm's mittels shmctl(..,ICP_RMID,..) schön wieder gelöscht werden.

    Ich habe selbst ein großes Programmpaket entwickelt, was auf diversen Unix-Systemen läuft (z.B. Linux FC3, RedHat8, Solaris 9, NetBSD, Reliant Unix) und intensiv mit Shared Memories arbeitet, insgesamt je nach Konfiguration zwischen 200-1000 Bereichen. Allerdings nicht mit immens großen. Deswegen der Tipp, falls Du den shm-Bereich über Semaphoren absichern willst (und das Betriebssystem-unabhängig): Bei Sun/Solaris wird beim semctl() Aufruf eine Union "semun" benutzt, während bei anderen Betriebssystemen nur ein integer-Wert benutzt wird...

    Mich würde aber schon mal so grob interessieren, was in das shm eigentlich rein soll. So richtig kann ich mir keine Anwendung vorstellen, die einen so riesigen shm-Bereich nutzen sollte (es sei denn, man will eine ganze Datenbank darin unterbringen).


Anmelden zum Antworten