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
Embed
Überblick Shared Beispiel 3 - ti.tuwien.ac.at · Beispiel 3 D. Prokesch Überblick Shared Memory Motivation Memory Mappings POSIX Shared Memory Beispiel Semaphore Motivation...
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
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
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
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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