Überblick shared beispiel 3 - ti.tuwien.ac.at · beispiel 3 d. prokesch Überblick shared memory...

41
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

Upload: others

Post on 06-Sep-2019

3 views

Category:

Documents


0 download

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