Top Banner
Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa- tionsaufgaben POSIX Semaphore Beispiele Ressourcen- verwaltung Zusammen- fassung Beispiel 3 Shared Memory und Explizite Synchronisation Daniel Prokesch Institut für Technische Informatik Technische Universität Wien 02. Mai 2016 1
41

Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation...

Sep 06, 2019

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiel 3Shared Memory und Explizite Synchronisation

Daniel Prokesch

Institut für Technische InformatikTechnische Universität Wien

02. Mai 2016

1

Page 2: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Überblick

Bisher betrachtet. . .I Implizite Synchronisation

I Blockierende Lese- und SchreiboperationenI Nicht-verwandte Prozesse mittels SocketsI Verwandte Prozesse mittels Unnamed Pipes

Heute. . .I Datenaustasch über gemeinsamen Speicher

I Memory MappingsI POSIX Shared Memory

I Explizite Synchronisation von mehreren ProzessenI POSIX SemaphoreI Synchronisationsaufgaben

2

Page 3: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Motivation

I Gemeinsamer Speicher: mehrere (verwandte sowienicht-verwandte) Prozesse können auf selbe Regionphysikalischen Speichers zugreifen

I Gemeinsamer Speicher liegt im Adressraum der Prozesse,die den Speicher nutzen wollen

I Wird mit normalen Speicherzugriffsoperationenausgelesen und verändert

I Schnelle Interprozesskommunikation: keine Interventiondes Betriebssystemkernels1

I Explizite Synchronisation notwendig (gleichzeitigerZugriff)

1„zero-copy“, siehe http://www.linuxjournal.com/article/6345 3

Page 4: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Memory MappingsErinnerung: mmap(2)

I Mapped eine Datei (file descriptor) in den Adressraum desProgramms

I Mehrere Prozesse können auf den zugrunde liegendenSpeicher zugreifen

I Gemeinsamer Speicher basierend auf gemeinsamerRessource (einer Datei) → „shared file mapping“

4

Page 5: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Mapping erzeugen

I Erzeugen eines Mappings: mmap(2)

#include <sys/mman.h>

void *mmap(void *addr, size_t length, int prot,int flags, int fd, off_t offset);

addr Vorschlag für Startadresse, sollte NULL seinlength Größe des Mappings in Bytes, oft Dateigröße

(siehe fstat(2))prot Bitmaske für Speicherschutz: PROT_NONE (kein Zugriff

erlaubt), PROT_READ, PROT_WRITEflags Bitmaske, u.a. MAP_PRIVATE, MAP_SHARED,

MAP_ANONYMOUSfd Der zu mappende File Descriptor

offset Offset im File (Vielfaches der Page-Größe), 0

I Rückgabewert: Startadresse des Mappings (anSeitengrenze ausgerichtet), MAP_FAILED im Fehlerfall(→ errno)

5

Page 6: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Mappings im virtuellen Adressraum

I Mappings inunterschiedlichen Prozessenan verschiedenen Adressenerzeugt

I Vorsicht beim Speichern vonZeigern!(z.B. Verkettete Listen, . . . )

6

Page 7: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Mapping Hinweise

I Granularität sind Speicherseiten des Adressraums

I Nach Erzeugen des Mappings kann der File Descriptorgeschlossen werden

I Mappings sind in Linux unter /proc/PID/maps gelistet

I Nachteil von File Mappings für gemeinsamen Speicher:Persistent → Kosten für Disk I/O

I Für verwandte Prozesse: Gemeinsame, anonyme Mappings(MAP_SHARED | MAP_ANONYMOUS)

I Keine zugrunde liegende DateiI Mapping vor fork() erzeugt:

→ für Kindprozess(e) im selben Adressbereich verfügbar

7

Page 8: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Mapping entfernen

I Entfernen eines Mappings: munmap()

#include <sys/mman.h>

int munmap(void *addr, size_t length);

I Entfernt ganze Speicherseiten aus angegebenen Bereich,Startadresse muss page-aligned sein

I Rückgabewert: 0 bei Erfolg, sonst -1 (→ errno)

8

Page 9: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Mapping Beispiel

...char *addr = mmap(NULL, length,

PROT_READ | PROT_WRITE,MAP_SHARED, fd, 0);

if (addr == MAP_FAILED)error_exit("mmap");

if (close(fd) == -1)error_exit("close");

/* Code for working with mapped region */...

if (munmap(addr, length) == -1)error_exit("munmap");

9

Page 10: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

POSIX Shared Memory

I Ermöglicht gemeinsamen Speicher zwischennicht-verwandten Prozessen, ohne Datei auf Festplatte zuerzeugen

I Shared memory objects über Namen identifizierbar

I Auf dediziertem Filesystem für flüchtigen Speichererzeugt: tmpfs

I Wird wie gewöhnliches File ge-mmap-ed

I Vorteil: Es verhält sich wie ein richtiges Filesystem (z.B.swapping, Zugriffsrechte)

I Lebensdauer auf Systemlaufzeit beschränkt

I Teil der POSIX.1b realtime extensions

I Linken mit -lrt

I man 7 shm_overview

10

Page 11: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Shared Memory APIÖffnen/Erzeugen

I Erzeugen und Öffnen eines neuen Objekts oder Öffneneines existierenden Objekts: shm_open(3)

#include <sys/mman.h>#include <fcntl.h> /* For O_* constants */

int shm_open(const char *name, int oflag,mode_t mode);

name Name der Form "/somename"oflag Bitmaske: O_RDONLY oder O_RDWR und eventuell. . .

I O_CREAT: legt Objekt an falls es nicht existiertI zusätzlich O_EXCL: Fehler falls schon existiert

mode Zugriffsrechte beim Erzeugen, sonst 0

I Rückgabewert: File descriptor bei Erfolg,-1 im Fehlerfall (→ errno)

I Linux: Objekt unter /dev/shm/somename erzeugt

11

Page 12: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Shared Memory APIGröße festlegen

I Der erzeugende Prozess legt üblicherweise die Größe (inBytes) anhand des File Descriptors fest: ftruncate(2)

#include <unistd.h>#include <sys/types.h>

int ftruncate(int fd, off_t length);

I Rückgabewert: 0 bei Erfolg, -1 im Fehlerfall (→ errno)

I Danach kann über den File Descriptor ein gemeinsamesMapping erzeugt (mmap(2)) und der File Descriptorgeschlossen (close(2)) werden

12

Page 13: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Shared Memory APIEntfernen

I Einen Shared Memory Objektnamen entfernen:shm_unlink(3)

int shm_unlink(const char *name);

I Name, der beim Erzeugen angegeben wurde

I Rückgabewert: 0 bei Erfolg, -1 im Fehlerfall (→ errno)

I Darauffolgende shm_open() mit diesem Namen schlagenfehl (oder erzeugen neues Objekt)

I Der Speicher wird freigegeben, sobald der letzte Prozessdas Mapping mit munmap() entfernt hat

I Übliche Befehle (ls, rm) zum Auflisten und Aufräumenin /dev/shm/ (z.B. bei Programmabsturz)

13

Page 14: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiel

#include <fcntl.h>#include <stdio.h>#include <sys/mman.h>#include <sys/types.h>#include <unistd.h>

#define SHM_NAME "/myshm"#define MAX_DATA (50)#define PERMISSION (0600)

struct myshm {unsigned int state;unsigned int data[MAX_DATA];

};

14

Page 15: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiel

int main(int argc, char **argv){

struct myshm *shared;

/* create and/or open shared memory object */int shmfd = shm_open(SHM_NAME, O_RDWR | O_CREAT,

PERMISSION);if (shmfd == -1) ... /* error */

/* extend (set size) */if (ftrunctate(shmfd, sizeof *shared) == -1)

... /* error */

/* map shared memory object */shared = mmap(NULL, sizeof *shared,

PROT_READ | PROT_WRITE, MAP_SHARED,shmfd, 0);

if (shared == MAP_FAILED) ... /* error */

if (close(shmfd)) == -1) ... /* error */

15

Page 16: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiel

/* critical section entry ... */shared->data[0] = 23;printf("%d\n", shared->data[0]);/* critical section exit ... */

/* unmap shared memory */if (munmap(shared, sizeof *shared) == -1)... /* error */

/* remove shared memory object */if (shm_unlink(SHM_NAME) == -1)... /* error */

return 0;} /* end of main */

16

Page 17: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

SynchronisationMotivation

I Sicherstellung von Einschränkungen nebenläufigerProzesse

I In welcher Reihenfolge wird ein kritischer Abschnittbetreten: A vor B? B vor A? (Bedingungssynchronisation)

I Sicherstellen, dass nur genau ein Prozess auf verteilteRessource zugreift (Wechselseitiger Ausschluss, mutualexclusion).Nicht notwendigerweise fair/abwechselnd.

17

Page 18: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiele (1)

Thread A:

a1: print "yes"

Thread B:

b1: print "no"

I Keine deterministische Abfolge von „yes“ und „no“.Abhängig z.B. vom Scheduler.

I Mehrere Aufrufe produzieren möglicherweiseUnterschiedliche Ausgaben. Weitere Ausgaben möglich?

18

Page 19: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiele (2)

Thread A:

a1: x = 5a2: print x

Thread B:

b1: x = 7

I Pfad zu Ausgabe „5“ und am Ende x = 5?

I Pfad zu Ausgabe „7“ und am Ende x = 7?

I Pfad zu Ausgabe „5“ und am Ende x = 7?

I Pfad zu Ausgabe „7“ und am Ende x = 5?

19

Page 20: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiele (3)

Thread A:

a1: x = x + 1

Thread B:

b1: x = x + 1

I Annahme: x ist mit 1 initialisiert. Mögliche Werte für xnach der Ausführung?

I Ist x++ atomic (atomar)?

20

Page 21: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

SemaphoreGrundidee

I „Gemeinsame Variable“ zur Synchronisation

I 3 grundlegende Operationen:

I S = Init(N)Semaphor S mit Wert N erzeugen

I P(S), Wait(S), Down(S)S dekrementieren und blockieren wenn S negativ wird

I V(S), Post(S), Signal(S), Up(S)S inkrementieren und eventuell wartenden Prozessaufwecken

21

Page 22: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiele - Serialisierung

Thread A:

statement a1

Thread B:

statement b1

Wie garantiert man a1 < b1 (a1 vor b1)?

22

Page 23: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiele - Serialisierung

Initialisierung:

S = Init(0)

Thread A:

statement a1V(S)

Thread B:

P(S)statement b1

23

Page 24: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiele - Mutex

Thread A:

x = x + 1

Thread B:

x = x + 1

Wie garantiert man, dass nur ein Thread in denkritischen Abschnitt eintritt?

24

Page 25: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiele - Mutex

Initialisierung:

mutex = Init(1)

Thread A:

P(mutex)x = x + 1V(mutex)

Thread B:

P(mutex)x = x + 1V(mutex)

⇒ Kritischer Abschnitt erscheint atomar

25

Page 26: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiele - Abwechselndes Arbeiten

Thread A:

for(;;) {x = x + 1

}

Thread B:

for(;;) {x = x + 1

}

Wie erreicht man, dass A und B abwechselndarbeiten?

26

Page 27: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Beispiele - Abwechselndes Arbeiten

Initialisierung:

S1 = Init(1)S2 = Init(0)

Thread A:

for(;;) {P(S1)x = x + 1V(S2)

}

Thread B:

for(;;) {P(S2)x = x + 1V(S1)

}

⇒ 2 Semaphore notwendig!

Wie sieht die Synchronisation aus, wenn sich3 Threads abwechseln sollen? N Threads?

27

Page 28: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

POSIX Semaphore

I Synchronisation von ProzessenI Nicht-verwandte Prozesse: Named SemaphoresI (Verwandte Prozesse oder Threads innerhalb eines

Prozesses: Unnamed Semaphores)

I Ähnlich wie POSIX Shared Memory. . .I Über Namen identifizierbarI Auf dediziertem Filesystem für flüchtigen Speicher

erzeugt: tmpfsI Lebensdauer auf Systemlaufzeit beschränktI Teil der POSIX.1b realtime extensions

I Linken mit -pthread

I man 7 sem_overview

I Linux: Objekt unter /dev/shm/sem.somename erzeugt

28

Page 29: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Semaphore APIÖffnen/Erzeugen

I Erzeugen und Öffnen eines neuen Semaphors oder Öffneneines existierenden Semaphors: sem_open(3)

#include <semaphore.h>#include <fcntl.h> /* For O_* constants */

/* create a new named semaphore */sem_t *sem_open(const char *name, int oflag,

mode_t mode, unsigned int value);

/* open an existing named semaphore */sem_t *sem_open(const char *name, int oflag);

name Name der Form "/somename"oflag Bitmaske: O_CREAT, O_EXCLmode Zugriffsrechte (nur beim Erzeugen)value Initialwert (nur beim Erzeugen)

I Rückgabewert: Semaphoradresse bei Erfolg, im FehlerfallSEM_FAILED (→ errno)

29

Page 30: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Semaphore APISchließen/Entfernen

I Schließen eines Semaphors: sem_close(3)

int sem_close(sem_t *sem);

I Entfernen eines Semaphors: sem_unlink(3)

int sem_unlink(const char *name);

Wird freigegeben, sobald ihn alle Prozesse geschlossenhaben.

I Rückgabewert: 0 bei Erfolg, -1 im Fehlerfall (→ errno)

30

Page 31: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Semaphore APIWarten, P()

I Dekrementieren eines Semaphors: sem_wait(3)

int sem_wait(sem_t *sem);

I Bei Semaphorwert > 0 kehrt die Funktion sofort zurück

I Sonst blockiert die Funktion bis der Wert positiv wird

I Rückgabewert: 0 bei Erfolg, -1 im Fehlerfall (→ errno) undder Wert des Semaphors wird nicht verändert

Wichtig

Funktion sem_wait() kann durch ein Signalunterbrochen werden (errno == EINTR)!

→ siehe Signalbehandlung

31

Page 32: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Semaphore APISignalisieren, V()

I Inkrementieren eines Semaphors: sem_post(3)

int sem_post(sem_t *sem);

I Wenn Semaphorwert positiv wird, wird ein blockierterProzess fortgesetzt

I Falls mehrere Prozesse warten: Reihenfolge istunbestimmt (= weak semaphore)

I Rückgabewert: 0 bei Erfolg, -1 im Fehlerfall (→ errno) undder Wert des Semaphors wird nicht verändert

32

Page 33: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

BeispielProzess A (Code ohne Error-Handling)

#include <stdio.h>#include <unistd.h>#include <semaphore.h>#include <fcntl.h>

#define SEM_1 "/sem_1"#define SEM_2 "/sem_2"

int main(int argc, char **argv) {sem_t *s1 = sem_open(SEM_1, O_CREAT | O_EXCL, 0600, 1);sem_t *s2 = sem_open(SEM_2, O_CREAT | O_EXCL, 0600, 0);

for(int i = 0; i < 3; ++i) {sem_wait(s1);printf("critical: %s: i = %d\n", argv[0], i);sleep(1);sem_post(s2);

}sem_close(s1); sem_close(s2);

return 0;}

33

Page 34: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

BeispielProzess B (Code ohne Error-Handling)

#include <stdio.h>#include <unistd.h>#include <semaphore.h>#include <fcntl.h>

#define SEM_1 "/sem_1"#define SEM_2 "/sem_2"

int main(int argc, char **argv) {sem_t *s1 = sem_open(SEM_1, 0);sem_t *s2 = sem_open(SEM_2, 0);

for(int i = 0; i < 3; ++i) {sem_wait(s2);printf("critical: %s: i = %d\n", argv[0], i);sleep(1);sem_post(s1);

}sem_close(s1); sem_close(s2);sem_unlink(SEM_1); sem_unlink(SEM_2);return 0;

}

34

Page 35: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

BeispielUnterbrechung durch Signale

volatile sig_atomic_t want_quit = 0;

int main(void){

sem_t *sem;// signal handler setup (no transparent restart),// semaphore setup...while (!want_quit) {

if (sem_wait(sem) == -1) {// interrupted by system call?if (errno == EINTR) continue;error_exit();

}...if (sem_post(sem) == -1)

error_exit();

}...

}

35

Page 36: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Ressourcenverwaltung

Wer legt Ressourcen an?I Aufrufreihenfolge der Prozesse:

I fixe Reihenfolge (z.B.: Client-Server Systeme)I beliebig

Wer löscht Ressourcen?

I Fehlerfreier ProgrammverlaufI Fehlerfall

I Unsynchronisiertes Aufräumen:Fehlerhafter Prozess löscht Ressourcen

I Synchronisiertes Aufräumen:Eigener Kommunikationskanal nötig (aufwändig)

36

Page 37: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Ressourcenallokation. . . bei beliebiger Aufrufreihenfolge

I Anlegen, falls noch nicht existiert

I O_CREAT Flag ohne O_EXCL Flag

I z.B. Shared Memory:

shmfd = shm_open(SHM_NAME,O_CREAT | O_RDWR, PERM);

if (shmfd == -1) ... /* error */

37

Page 38: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Ressourcenfreigabe. . . bei fixer Zugriffsabfolge

Beim Löschen soll die Synchronisation zwischen den Prozessensicherstellen, dass kein anderer Prozess als der Löschendemehr auf gemeinsame Ressourcen zugreift!

I Freigabe der selbst angelegten Ressourcen

I Freigabe insb. Kernel-persistenter Ressourcen beinormaler Prozessbeendigung (auch im Fehlerfall)

I Hilfreich: atexit(3)I Registriert eine Funktion, die bei normaler

Prozessbeendigung aufgerufen wirdI Mehrere Funktionen: in umgekehrter Reihenfolge der

RegistrierungI Nicht bei _exit()

38

Page 39: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

RessourcenfreigabeBeispiel

static int shmfd = -1;

void allocate_resources(void) {shmfd = shm_open(SHM_NAME, O_CREAT ...);...

}

void free_resources(void) {...if (shmfd != -1) {

if (shm_unlink(SHM_NAME) == -1)/* print error message, DON’T CALL EXIT */;

}}

void main(void) {if (atexit(free_resources) != 0)

/* error */

allocate_resources();...

}

39

Page 40: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Zusammenfassung

I Shared Memory als schnelle Methode der IPC

I Explizite Synchronisation mit Semaphoren

I Synchronisationsaufgaben

I Strategien zur Ressourcenallokation und -freigabe

40

Page 41: Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation Synchronisa-tionsaufgaben

Beispiel 3

D. Prokesch

Überblick

SharedMemoryMotivation

MemoryMappings

POSIX SharedMemory

Beispiel

SemaphoreMotivation

Synchronisa-tionsaufgaben

POSIXSemaphore

Beispiele

Ressourcen-verwaltung

Zusammen-fassung

Material

I Linux Implementierung von Shared Memory/tmpfs:http://www.technovelty.org/linux/shared-memory.html

I Richard W. Stevens, UNIX Network Programming,Vol. 2: Interprocess Communications

41