C Tutorium – Shared Memory –

15
C Tutorium C Tutorium – Shared Memory – – Shared Memory – Knut Stolze

description

C Tutorium – Shared Memory –. Knut Stolze. Shared Memory. Ein Speicherbereich, auf den mehrere Prozesse Zugriff haben Also kein privater Speicher Schnellste Form der Inter-Prozess-Kommunikation (IPC) - PowerPoint PPT Presentation

Transcript of C Tutorium – Shared Memory –

Page 1: C Tutorium  – Shared Memory –

C TutoriumC Tutorium – Shared Memory – – Shared Memory –

Knut Stolze

Page 2: C Tutorium  – Shared Memory –

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

Page 3: C Tutorium  – Shared Memory –

3

Shared MemoryShared Memory

Hauptspeicher

AddressraumProzess 1

AddressraumProzess 2

Shared MemorySegment

Prozess 1 Prozess 2

Page 4: C Tutorium  – Shared Memory –

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!!

Page 5: C Tutorium  – Shared Memory –

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”!

Page 6: C Tutorium  – Shared Memory –

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

Page 7: C Tutorium  – Shared Memory –

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

Page 8: C Tutorium  – Shared Memory –

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

Page 9: C Tutorium  – Shared Memory –

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 */ … }

Page 10: C Tutorium  – Shared Memory –

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

Page 11: C Tutorium  – Shared Memory –

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

Page 12: C Tutorium  – Shared Memory –

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, …)

Page 13: C Tutorium  – Shared Memory –

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

Page 14: C Tutorium  – Shared Memory –

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

Page 15: C Tutorium  – 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