Next: ipcs und ipcrm
Up: System V IPC
Previous: Message queues
  Contents
Die dritte Variante der System V IPC ist das shared memory. Verschiedene
Prozesse können einen gemeinsamen Speicherbereich nutzen und durch
normale Maschinenbefehle zum Lesen und Schreiben Daten austauschen.
Es ist die schnellste Form von IPC, da es keinerlei weitere Synchronisationsmechanismen
gibt. Dies muss bei Bedarf ''von Hand'' implementiert werden (z.B.
mit den schon erwähnten Semaphoren). Die Grundlage der Implementierung
von shared memory unter Linux bildet die Struktur shmid_kernel
[ipc/shm.c]:
-
- struct shmid_kernel /* private to the kernel */
{
struct kern_ipc_perm shm_perm;
struct file * shm_file;
int id;
unsigned long shm_nattch;
unsigned long shm_segsz;
time_t shm_atim;
time_t shm_dtim;
time_t shm_ctim;
pid_t shm_cprid;
pid_t shm_lprid;
};
Wie schon bei den anderen System V IPC Varianten werden zuerst in
shm_perm die Zugriffsrechte verwaltet. shm_file
ist ein Eintrag zu einer ''unlinked'' Datei im shmfs (welches meist
unter /dev/shm gemountet ist). ''unlinked'' bedeutet, sie
ist zwar angelegt, belegt aber keinen inode und ist daher
auch nicht im Filesystem sichtbar. shm_nattach gibt die
Anzahl der zugreifenden (''attached'') Prozesse und shm_segsz
die Segmentgrösse des Speicherbereichs aus. Danach folgen Timestamps
der letzten Attach-, Detach- und Änderungsoperation sowie die PID
des erzeugenden Prozesses und des Prozesses der zuletzt eine Operation
auf den Speicherbereich ausgeführt hat.
Analog zu den anderen System V IPC Varianten kann ein Prozess mit
der Funktion
-
- int shmget(key_t key, int size, int shmflg)
ein neues shared memory Segment erzeugen oder sich die zu einem schon
existierenden Segment mit dem Schlüssel key die passende
shmid zurückgeben lassen.
Mit der Funktion
-
- void *shmat ( int shmid, const void *shmaddr, int shmflg )
kann ein Prozess ein shared memory Segment mit der angegebenen shmid
seinem eigenen Datensegment zuordnen. Entweder shmaddr ist
0, dann wird ein beliebiger freier Speicherbereich benutzt, oder die
in shmaddr angegebene Adresse wird benutzt. In shmflg
kann man über spezielle Flags die Wahl der Speicheradresse beeinflussen
(z.B. Alignment auf eine bestimmte Blockgrösse).
Der Prozess kann nun durch Zugriff auf diesen ''virtuellen'' Speicherbereich
in seinem Datensegment auf den shared memory Bereich zugreifen. Mit
der Funktion
-
- int shmdt ( const void *shmaddr)
kann man den Zugriff wieder aufheben.
Shared memory kann von mehreren Prozessen gleichzeitig genutzt werden
und bietet daher eine n:m Kommunikationsbeziehung.
Next: ipcs und ipcrm
Up: System V IPC
Previous: Message queues
  Contents
2002-02-17