C Tutorium – Shared Memory –
description
Transcript of C Tutorium – Shared Memory –
C TutoriumC Tutorium – Shared Memory – – Shared Memory –
Knut Stolze
2
Shared MemoryShared Memory
Ein Speicherbereich, auf den mehrere Prozesse Zugriff haben– Also kein privater Speicher– Schnellste Form der Inter-Prozess-
Kommunikation (IPC)
Shared Memory Segment wird in Adressbereich jedes einzelnen (verbundenen) Prozesses abgebildet
3
Shared MemoryShared Memory
Hauptspeicher
AddressraumProzess 1
AddressraumProzess 2
Shared MemorySegment
Prozess 1 Prozess 2
4
GotchasGotchas
Zeiger (Pointer) sind Werte, die Adressen zu anderen Daten beinhalten
Shared Memory Segmente können an den unterschiedlichen Adressen in die Adressräume der einzelnen Prozesse abgebildet werden
Im Shared Memory darf kein Zeiger hinterlegt werden!!
5
Erzeugen eines SHM Erzeugen eines SHM SegmentsSegments
Ein Prozess legt Segment anint shmget(key, size, flags)– key: Schlüssel für das Segment; üblicherweise mittels “ftok”
generiert– size: Größe des Segments in Bytes
Vergleichbar mit Größe bei “malloc”
– flags: IPC_CREAT – Segment erzeugen IPC_EXCL – zu erzeugendes Segment darf noch nicht existieren; sonst
Fehler Zugriffsrechte (wie bei Dateien)
– Ergebnis: ID des Segments (oder –1 bei Fehler) Nicht gleich dem “key”!
6
shmgetshmget
Es wird keine Verbindung zum SHM hergestellt, d.h. das Segment wird nicht in den aktuellen Prozessraum abgebildet
Windows:– SHM Segment existiert nur so lange, wie der
Prozess lebt, der das Segment erzeugt hat
7
ftokftok
Generiere Schlüssel für “shmget”, “msgget” oder “semget”key_t ftok(file, proj_id)– file: Existierende Datei (inode kann herangezogen
werden)– proj_id: Identifikator für aktuelles Projekt/Programm
Schlüssel ist immer identisch für ein (file, proj_id)-Tupel– Prozessübergreifend– Andere Datei/andere “proj_id” gibt i.A. anderen
Schlüssel
8
Verbinden zu einem Verbinden zu einem existierenden SHM Segmentexistierenden SHM Segment
Jeder Prozess, der auf SHM Segment zugreifen will, muss sich mit dem Segment verbindenvoid *shmat(id, addr, flags)– id: ID des Shared Memory Segments (von shmget)– addr: Zieladresse des abgebildeten Segments
Sollte immer NULL sein!
– flags: SHM_RDONLY – nur lesender Zugriff möglich SHM_RND – abrunden einer gegebenen Adresse in “addr”
zum nächsten Seitenanfang
9
shmatshmat
Segment wird in den eigenen Adressraum abgebildet– Ähnlich zu “malloc”
Nach “shmat” kann mit dem Segment wie mit jedem anderen Speicherblock gearbeitet werden
Bei Fehler wird Zeiger mit Wert –1 zurückgegebenptr = shmat(…);if ((char *)ptr == (char *)(-1)) { … /* Fehler */ … }
10
Verbindung zum SHM Verbindung zum SHM Segment trennenSegment trennen
Aktueller Prozess beendet Verbindung zum Shared Memory Segmentint shmdt(addr)– addr: Zeiger zum Beginn des Segments
Ergebnis von “shmat”
– Vergleichbar zu “free”
Zugriff auf Speicher des SHM Segments darf nach “shmdt” nicht mehr erfolgen!
Segment wird nicht zerstört
11
Segment zerstörenSegment zerstören
Segment wird zum Zerstören markiertint shmctl(id, cmd, buffer)– id: ID des Shared Memory Segments
Ergebnis von “shmget”
– cmd: Operation auf dem Segment IPC_RMID – Segment zerstören IPC_STAT – Informationen über das Segment in
“buffer” kopieren IPC_SET – Setze Zugriffsrechte für Segment
12
shmctlshmctl
Betriebssystem zestört Segment, wenn letzte Verbindung aller Prozesse getrennt wird
Aktueller Prozess kann immer noch Verbindung haben
– Beispiel: Start von X-Server1. id = shmget(…, IPC_CREAT | IPC_EXCL)2. segment = shmat(id, …)3. shmctl(id, IPC_RMID, NULL);4. …5. shmdt(segment, …)
13
Verwendung von SHMVerwendung von SHM
Segment ist ein zusammenhängender Speicherbereich– Muss von Anwendung(en) selbständig organisiert und
strukturiert werdenstruct Entry {
int x, y;};ptr = shmat(…);int *count = (int *)ptr;struct Entry *entries = (struct entry *)(count + 1);
count entry …entryentry entry
14
Verwendung von SHM (2)Verwendung von SHM (2)
Konkurrierender Zugriff auf Segment muss synchronisiert werdenSemaphoren
Nur bei Nutzung mehrerer Prozesse– Multi-Threading braucht keinen Shared
Memory
15
Kommandozeile (Unix)Kommandozeile (Unix)
Liste alle IPC-Resources (Message Queues, Semaphore, Shared Memors Segmente)$ ipcs
Lösche eine IPC-Resource$ ipcrm
Beispiel um alle Resources des aktuellen Nutzers zu löschen:$ ipcs | grep `user` | awk ‘{ print “ipcrm –”$1,$2 } | sh -e