Überblick shared beispiel 3 - ti.tuwien.ac.at · beispiel 3 d. prokesch Überblick shared memory...
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)
1„zero-copy“, siehe http://www.linuxjournal.com/article/6345 3
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
32
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
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
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
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
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
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
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
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
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