next up previous contents
Next: ipcs und ipcrm Up: System V IPC Previous: Message queues   Contents

Shared Memory

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 up previous contents
Next: ipcs und ipcrm Up: System V IPC Previous: Message queues   Contents
2002-02-17