1 Modul: Programmierung (B-PRG) Grundlagen der Programmierung 1 – Teil 3 Prozess Prozess- synchronisation synchronisation Prof. Dr. R. Brause Adaptive Systemarchitektur Institut für Informatik Fachbereich Informatik und Mathematik (12) Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 2 Race conditions Beispiel: Kontoführung Paralleler Zugriff auf globale Variable Parallele Prozesse von vielen Benutzern arbeiten gleichzeitig auf den Daten. Falls gleichzeitig zwei Benutzer auf das gleiche Konto einzahlen möchten, so kann es sein, dass der Kontostand hinterher nicht stimmt. Ein solcher Fehler wird von keinem Kunden toleriert! Zeit 15:00 Uhr Konto A= 300 € 15:01 15:04 15:03 15:02 Konto A = 200 € 500 € einzahlen 100 € abheben B := read(A) B := B + 500 B write(A) C := read(A) C := C -100 C write(A) Eine Fehlbuchung tritt nur auf, wenn Prozess den Prozess überholt („race condition“)
12
Embed
Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:
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
1
Modul: Programmierung (B-PRG)Grundlagen der Programmierung 1 – Teil 3
ProzessProzess--synchronisationsynchronisation
Prof. Dr. R. BrauseAdaptive SystemarchitekturInstitut für Informatik Fachbereich Informatik und Mathematik (12)
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 2
Race conditions
Beispiel: KontoführungParalleler Zugriff auf globale Variable
Parallele Prozesse von vielen Benutzern arbeiten gleichzeitig auf den Daten.
Falls gleichzeitig zwei Benutzer auf das gleiche Konto einzahlen möchten, so kann es sein, dass der Kontostand hinterher nicht stimmt.
Ein solcher Fehler wird von keinem Kunden toleriert!
Zeit
15:00 UhrKonto A= 300 €
15:01
15:04
15:03
15:02
Konto A = 200 €
500 € einzahlen 100 € abheben
B := read(A)
B := B + 500
B write(A)
C := read(A)
C := C -100
C write(A)
Eine Fehlbuchung tritt nur auf, wenn Prozess den Prozess überholt („race condition“)
2
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 3
Race conditions
Beispiel: Warteschlangeneintrag eines PCB
Einhängen A Aushängen B(1) Lesen des Ankers: PointToB (1) Lesen des Ankers: PointToB(2) Setzen des NextZeigers:=PointToB (2) Lesen des NextZeigers:PointToC(3) Setzen des Ankers:=PointToA (3) Setzen des Ankers:=PointToC
Problem: („Race conditions“: kontextbedingt, nicht-wiederholbare Effekte durch „überholende“ Prozesse) z.B.a) Unterbrechung beim Aushängen von B durch Einhängen von A
⇒ Prozeß A ist weg! b) Unterbrechung beim Einhängen von A durch Aushängen von B
⇒ Prozeß B bleibt erhalten!
Anker B CPointToB PointToC
APointToA
PCB(B) PCB(C)
PCB(A)
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 4
Lösung: Signale und Semaphoren
Peterson: Synchronisierung durch Signale (Interesse)
Allgemein: Das SemaphorSemaphor (Signalbarken, Dijkstra 1965)
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 7
Lösung: Atomare Aktionen
Beispiel: GeldtransaktionSie überweisen 2000 €.
Abbuchung 2000 € Empfänger-Gutbuchung 2000 €
Wo ist das Geld? Keine oder erneute Überweisung = Verlust!
Forderung: „Atomare Aktion“Entweder vollständige Transaktion oder gar keine !(bei Abbruch „roll back“ auf vorher definierten Zustand)
Computerabsturz !
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 8
HW-Implementierung: Atomare Aktionen
Interrupts ausschalten (Probleme: timer, power failure, I/O)
Atomare Instruktionsfolge
z.B. Fetch And Add (fetch and add value) Abfrage der akt. Anzahldef fetchAndAdd(s, value) :
tmp = s; s = tmp + value; return tmp;
Test And Set (test and set lock) Abfrage: bin ich erster?def TestAndSet(s) :
tmp = s; s = true; return tmp;
wird unkritisch nur von einem Prozess zurückgesetzt
5
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 9
memory
Prozesse
Semaphoren: Unix
lockf Sperren Dateizugriff P(s) lock file
msem_init Semaphorinit. zumSpeicherzugriffmsem_lock Sperren eines Semaphors P(s)msem_unlock Entsperren eines Semaphors V(s)msem_remove Entfernen eines Semaphors
KernprozesseKernprozesseSpin locks: keine Referenzen zu Disk-Speicher, keine traps & syscalls
ThreadsThreadsSemaphore = Type CRITICAL_SECTIONInitializeCriticalSection(S)EnterCriticalSection(S) P(s)LeaveCriticalSection(S) V(s)
6
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 11
Semaphoren: Python
Class mutex() Datenstruktur mit binärem Semaphor s+ Warteschlange
Methoden
test() Ist s gesetzt?
testandset() Setze s atomar. RET: War s ungesetzt?
lock(KritAb,arg) Setze s und führe KritAb(arg) aus.s gesetzt: KritAb→Warteschlange
unlock() Setze s zurück.
Wenn Warteschlange ≠ 0, führe stattdessen ersten KritAb aus und rücke Wartschlange auf.
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 12
Semaphoren: Java
Konstruktsynchronized (<expression>) <statement>
Thread wartet, bis <expression> frei ist.
Innerhalb eines synchronized-Bereichs kann man
zusätzlich mit den Methoden wait() auf ein Signal
warten, das mit notify() gesendet wird.
7
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 13
Synchronisation von Prozessen
Präzedenzgraph
Implementierung mit Semaphoren
PROCESS A: TaskBodyA; V(b); V(c);
PROCESS B: P(b); TaskBodyB; V(d1);V(e); PROCESS C: P(c); TaskBodyC; V(d2); PROCESS D: P(d1); P(d2); TaskBodyD; PROCESS E: P(e); TaskBodyE;
Globale Variable b, c, d1, d2, e mit 0 initialisieren.
B E
A
C D
d1
d2
eb
c
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 14
Synchronisation von Prozessen
Rendez-vous-Konzept (Ada)Warten ohne Pufferung aufeinander
Senderprogramm
...
send(Empfänger,Msg);
...
Empfängerprogramm
...
receive(Sender,Msg)
...
8
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 15
Synchronisation Erzeuger-Verbraucher
Problem: race condition innerhalb der Flusskontrolle:Bei Umschaltung nach „used=0“ auf Erzeugererfolgt wakeup + Pufferfüllung, dann ewiges Schlafen vom Erzeuger und dann auch vom Verbraucher.
Erzeuger
LOOP
produce(item)
IF used=N THEN sleep();
putInBuffer(item);
used := used+1;
IF used=1
THEN wakeup(Verbraucher);
END LOOP
Verbraucher
LOOP
IF used=0 THEN sleep();
getFromBuffer(item);
used := used-1
IF used = N-1
THEN wakeup(Erzeuger);
consume(item);
END LOOP
Naiver AnsatzNaiver Ansatz Initial: used = 0
Umschaltung
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 16