Christian Kruse: Shared Memory / Semaphoren - Verständnisproblem

Beitrag lesen

Hallo,

angenommen, ich hab eine datenbank...sagen wir telefonbuch. es gibt da verschiedene
namen, zu jedem namen noch telefonnummer usw.
insgesamt 2 millionen. die zahl ist nicht fest, sondern steigend.

Mir ist nicht klar, warum du hier shared memory verwenden willst.

abfragen will ich mit semaphoren ermöglichen.

Semaphoren koennen keine Abfragen ermoeglichen :) Semaphoren synchronisieren nur Zugriffe.

da ja shared memory segmente bzw. semaphoren (hab den unterschied nicht ganz verstanden)

Shared Memory ist Speicher, der gemeinsam genutzt werden kann. Semaphoren sind Mechanismen
(etwa Speicher-Blockaden oder spezielle Dateien), die den Zugriff auf Ressourcen
synchronisieren. Beispiel: du hast zwei Programme, die schreibend und lesend auf dieselbe
Datei zugreifen. Lesen duerfen mehrere Programme gleichzeitig, aber schreiben sollte immer
nur ein Programm. Ueblicherweise wird das ueber flock() geloest; wie flock() jedoch
implementiert ist, ist natuerlich frei. Eine Moeglichkeit hierzu waere es, einen Semaphor
zu locken. Ist der Semaphor gelockt, so wird das Programm, das den Lock anfordert, solange
in den Sleep-Modus geschickt, bis es an der Reihe ist und den ungelockten Semaphor kriegt.
Den lockt es dann, um seinerseits den exklusiven Zugriff zu garantieren.

da ja die ersten dinger (shared memory segmente?) an MB-Zahlen zwischen 1 - 128 MB bei
Linux gebunden sind, verwende ich demnach 24 segmente + 10 segmente für zahlen.

Du meinst sicher 26 Buchstaben (das Alphabet hat 26 Zeichen) + Sonderzeichen + Zahlen. Was
wuerdest du sonst mit einem Namen wie Ímir machen? :)

so ein segment scheint aus semaphoren zu bestehen, die ich mittels
sem_get() bzw. shm_get_var() aufrufe.

Nein. Du beziehst dich sicher auf das Beispiel im Manual; da wird ein Semaphor benutzt, um
den exklusiven Zugriff zu garantieren. Aber man *muss* keinen Semaphor benutzen. Und
shm_get_var() ist etwas komplett anderes als sem_get() -- mit dem einen holst du dir eine
Variable aus dem Shared-Memory-Bereich, mit dem anderen host du dir ein Semaphor.

das ganze funktionierte auch, bis ich dann auf irgendwelche restriktionen seitens der
standardinstallation von linux/apache gestossen bin. ich wollte dann verschiedene werte
ändern, um es zu ermöglichen, dabei fiel mir allerdings auf, dass ich gar nicht weiss, ob
ich nun semaphore, segment oder sonstwas erweitern soll

Das kommt auf die Fehlermeldung an. Semaphoren, wenn du nicht genuegend Semaphoren bekommst,
Shared-Memory, wenn du nicht genuegend Shared-Memory alloziieren kannst :) Eine
funktionierende Glaskugel habe ich leider nicht.

bzw. wo ich meine "ach-so-tolle"
alphabetische unterteilung nun wirklich anbringen soll und wo ich meine arrays mit den
ganzen werten reinschreiben soll.

Die Arrays legst du in das Shared-Memory-Segment.

SEGMENTE: gesamt 24 fürs alphabet + 10 für zahlen

26, und Sonderzeichen hast du noch immer nicht drin :)

WIE UNTERTEILE ICH DAS GANZE ALSO AM BESTEN?

Warum willst du hier shared memory benutzen? Shared memory ist fuer geringe Datenmengen, auf
die extrem schnell zugegriffen werden muss. Dazu gehoert ganz sicher *keine* Adress-DB mit
insgesamt 2 Mio Eintraegen.

kann übrigens sein, dass ich gänzlich einen grundlegenden fehler beim aufbau begangen
habe....

IMHO ja. Warum benutzt du nicht ein ganz normales DBS?

Gruesse,
 CK