12
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“)

Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

  • Upload
    lethuy

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

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“)

Page 2: Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

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)

Passieren Passieren P(s)P(s) waitFor (signal)Aufruf vor krit. Abschnitt, Warten falls besetzt

Verlassen Verlassen V(s)V(s) send (signal)Aufruf nach krit. Abschnitt, Aktivieren eines wart. Prozesses

Beispiel: paralleles Hochzählen z = 1, 2, 3, ... z global

Prozeß 1 Prozeß 2. . . . . .

P(s) P(s)

V(s) V(s)

. . . . . .

z :=z+1; WriteInteger(z)z :=z+1; WriteInteger(z)

warten

freigeben

Page 3: Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

3

Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 5

Implementierung busy wait

Problem: spin locks können fairness verletzen: Prozesse hoher Prio im spin lock vs. niedr. Prio im krit. Abschnitt

Software Pseudo-Code Semaphor = Zähler, initial s=1

def P(s):while s<=0 :

UnunterbrechbarUnunterbrechbar !!NoOp;

s = s-1;

def V(s):s = s+1;

UnunterbrechbarUnunterbrechbar !!

krit. Abschnitt

Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 6

Implementierung Schlafen

class Semaphor : value;list;

Software Pseudo-Code Initial: s.value = 1Datenstruktur

def P(s):s.value = s.value-1;if s.value < 0 :

einhängen(MyID,s.list); sleep;

def V(s):if s.value < 0 :

PID = aushängen(s.list); wakeup(PID);

s.value = s.value +1;

Problem: Ununterbrech-barer Code nötig!

Page 4: Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

4

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

Page 5: Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

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

semctl Semaphorkontrolloperationensemget hole Semaphorwertsemop Semaphoroperation

Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 10

Semaphoren: Windows NT

ProzesseProzesseCreateSemaphore() ErzeugenOpenSemaphore() InitialisierenWaitForSingleObject(Sema,TimeOutVal) P(s)ReleaseSemaphore() V(s)

KernprozesseKernprozesseSpin locks: keine Referenzen zu Disk-Speicher, keine traps & syscalls

ThreadsThreadsSemaphore = Type CRITICAL_SECTIONInitializeCriticalSection(S)EnterCriticalSection(S) P(s)LeaveCriticalSection(S) V(s)

Page 6: Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

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.

Page 7: Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

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)

...

Page 8: Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

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

Synchronisation Erzeuger-Verbraucher

LLöösungsungSignal speichern. Aber: unbekannte Prozesszahl...?Semaphore einführen: belegtePlätze:=0, freiePlätze:=N, mutex:=1

Erzeuger Verbraucher

LOOPproduce(item)P(freiePlätze);P(mutex);putInBuffer(item);V(mutex);V(belegtePlätze);

END LOOP

LOOPP(belegtePlätze);P(mutex);getFromBuffer(item);V(mutex);V(freiePlätze);consume(item);

END LOOP

krit. Abschnittskontrolle + Flusskontrolle durch Semaphore

Page 9: Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

9

ProzessProzess--kommunikationkommunikation

Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 18

Prozeßkommunikation

Verbindungsanzahl

unicast multicast broadcast

•••

jede Art kann jede andere Art ersetzen!

Page 10: Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

10

Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 19

Prozeßkommunikation

Verbindungsorientierte Kommunikation

openConnection(Adresse)

Feststellen, ob der Empfängerexistiert und bereit ist:Aufbau der Verbindung

send(Message)/receive(Message)

Nachrichtenaustausch;

closeConnection Leeren der Nachrichtenpuffer,Beenden der Verbindung

Verbindungslose Kommunikationsend (Adresse, Message) / receive(Adresse, Message)

Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 20

Prozeßkommunikation: Adressierung

Eindeutige Adressierung: Qualifizierter ID mit IPAdresse = Prozeß-ID.RechnerName.Firma.Land

z.B. 5024.hera.rbi.uni-frankfurt.de

Problem: Prozeß wechselt ID bei Neustart, Aufgabe bleibt

Lösung: logische ID, nicht physische. Beispiel: „Drucker“

Prädikatsadresse: Spezifikationen als Adresse

(IFIF 386-CPU ANDAND Java_installiert ANDAND Drucker) = True: fühle dich angesprochen, sonst nicht. Arbeitsverteilung!

Mailbox = Nachrichtenpuffer mit Namen, unabh. vom Prozess

Page 11: Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

11

Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 21

Prozeßkommunikation: Pipes

Unix pipe() unidirektionale Kommunikation„ Programm1 | Programm2 | .. | Programm N “

Windows NTCreatePipe() Bidirektionale pipes

write()

Programm 1

read()

Programm 2

Beliebige Prozesse: named pipesName den Prozessen vorher bekannt

Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 22

Prozeßkommunikation : Named Pipes

Globales Konzept: Named pipe („Netzwerk/Pfadname“)

=> LAN-Interprozeß-Kommunikation

UnixNamed pipe = special device ⇒ nur IPC auf selbem Rechner, nicht NFSNamed pipe = SystemV: STREAM socket pair() / bind()

Windows NTCreateNamedPipe() : Objekt im globalen Namensraum, auch NetzPfad

IPC = ReadFile() / WriteFile()UNC-Name = „\\ComputerName\PIPE\PipeName“Lokale pipe: „\\ .\PIPE\PipeName“

Kommunikation zu Unix möglich, wenn LAN-Manager für Unix LM/U installiert.

Page 12: Modul: Programmierung (B-PRG) Grundlagen der ... · Abschnittskontrolle + Flusskontrolle durch Semaphore. 9 Prozess-kommunikation Grundlagen der Programmierung 1 - Teil 3 R.Brause:

12

Grundlagen der Programmierung 1 - Teil 3 R.Brause: Synchronisation und Kommunikation Folie 23

Prozeßkommunikation: Signale

Problem: Synchrones Warten blockiert Prozesse

Abhilfe: Benachrichtigung durch asynchrone Signale(Software-Interrupts)

• Aufsetzen der Reaktion auf ein Signal, z.B. in UNIX mit sigaction(ISR)

• Abarbeiten des Hauptprogramms• Bei Signaleintritt: Abarbeiten der angegebenen ISR

• Weiterarbeiten im Hauptprogramm