Sie sind auf Seite 1von 22

Kommunikation

Nachteile des Semaphor-Konzepts (Wdh.)

I Unstrukturiertheit
„Streuung“ von P und V, Synchronisation und gegenseitiger Ausschluss
müssen explizit programmiert werden
I Fehlerträchtigkeit
wird ein P oder V vergessen, übersprungen, in falscher Reihenfolge
verwendet → Crash!
I Konzeptionelle Schwäche
Synchronisation und gegenseitiger Ausschluss sind unterschiedliche
Aufgaben

⇒ Semaphoren sind zu niedersprachlich

BESYST (Mey) I3I/I3EI/DSI3 1 / 22


Kommunikation Monitore

Monitor-Konzept, Ansatz (1)

(1) Zusammenfassen/Ordnen →
alle (verstreuten) Zugriffe auf gemeinsame Datenstrukturen werden an einer
einzigen Stelle konzentriert
(2) Prozeduren/indirekter Zugriff →
Operationen auf der gemeinsamen Datenstruktur nur mittels (und innerhalb
von) Prozeduren
(3) Schutz innerhalb Prozeduren →
der Schutz kritischer Abschnitte (durch Semaphoren) wird in die Prozeduren
verlegt, der Zugriff auf kritische Abschnitte findet immer über Prozeduren
statt

BESYST (Mey) I3I/I3EI/DSI3 2 / 22


Kommunikation Monitore

Monitor-Konzept, Ansatz (2)

(4) Verallgemeinerung/Abstraktion →
Bildung einer „Schutzmauer“ um Programme und Daten mit wenigen
wohldefinierten „Toren“

D: Daten,
P: Prozeduren
v P
@
P()
@
R
@
D
krit. Ab.
v P
V()

BESYST (Mey) I3I/I3EI/DSI3 3 / 22


Kommunikation Monitore

Monitor, Ansatz (3)

(5) Forderung nach Exklusivität →


die Semaphoren weglassen und erzwingen, dass nur ein einziger Prozess z.Zt.
im Monitor ist
⇒ gegenseitiger Ausschluss
(6) Initialisierungsteil →
zur Initialisierung lokaler Daten des Monitors
(7) Condition-Variable
⇒ Synchronisation

BESYST (Mey) I3I/I3EI/DSI3 4 / 22


Kommunikation Monitore

Monitor, Definition

I Monitor = abstrakter Datentyp


I Menge von Daten (= Betriebsmittel, das gesteuert werden soll)
I Menge von Prozeduren (Bearbeitung des Betriebsmittels)
I Bedingungen
I Zugriff auf Betriebsmittel nur über Monitorprozeduren
I zu einem Zeitpunkt darf nur ein Prozess innerhalb des Monitors
arbeiten
I andere Prozesse, die zu diesem Zeitpunkt Prozeduren des Monitors
aufrufen, werden verzögert (in einer dem Monitor zugeordneten
Warteschlange)

BESYST (Mey) I3I/I3EI/DSI3 5 / 22


Kommunikation Monitore

Beispiel Erzeuger/Verbraucher (3)


MONITOR Lager {
warentyp[] buffer = new warentyp[N];
integer in, out;
PROCEDURE Erzeugen(warentyp neue_ware) : void {
buffer[in] = neue_ware;
in = (in + 1) % N;
} // Erzeugen
PROCEDURE Verbrauchen() : warentyp {
warentyp ware = buffer[out];
out = (out + 1) % N;
RETURN ware;
Lösung gemäß (1) - (6)
} // Verbrauchen
// Initialisierung:
in = out = 0;
} // Lager

BESYST (Mey) I3I/I3EI/DSI3 6 / 22


Kommunikation Monitore

Condition-Variable

I spezielle Variable innerhalb des Monitors


I Unterschied zu Semaphoren: kein Zähler
I die Zustände (von Prozessen) werden ggfs. mit gewöhnlichen Variablen
(innerhalb des Monitors) verfolgt
I Operationen
Wird wait unterbrochen
I wait(c) (durch den Scheduler),
I Warte auf das Eintreffen der Bedingung c ist der Monitor durch
(in der zu c gehörenden Warteschlange) die Forderung des gegen-
I Gib den Monitor frei seitigen Ausschlusses
I signal(c) weiterhin geschützt
I Signalisiere das Eintreten der Bedingung c
I Einer/Alle wartenden Prozesse werden aktiviert

BESYST (Mey) I3I/I3EI/DSI3 7 / 22


Kommunikation Monitore

Semantiken von SIGNAL

I SIGNAL übergibt den Ausschluss an einen wartenden Prozess und wird


selbst inaktiv (Hoare):
IF ¬b THEN wait(c);
I SIGNAL reaktiviert einen wartenden Prozess und muss den Monitor
sofort verlassen (Brinch Hansen):
IF ¬b THEN wait(c);
I SIGNAL weckt alle wartenden Prozesse, verbleibt aber im Besitz des
Monitors. Erst nach Verlassen des Monitors wird ein anderer Prozess
aktiv:
WHILE ¬b DO wait(c);
(Die Auswahl des Prozesses trifft der Scheduler)

BESYST (Mey) I3I/I3EI/DSI3 8 / 22


Kommunikation Monitore

Beispiel Erzeuger/Verbraucher (4a)

MONITOR Lager {
warentyp[] buffer = new warentyp[N];
integer count, in, out;
condition nonfull; // count < N
condition nonempty; // count > 0
PROCEDURE Erzeugen(warentyp neue_ware) : void {
WHILE count == N DO wait(nonfull);
buffer[in] = neue_ware;
count = count + 1;
in = (in + 1) % N;
signal(nonempty);
} // Erzeugen

BESYST (Mey) I3I/I3EI/DSI3 9 / 22


Kommunikation Monitore

Beispiel Erzeuger/Verbraucher (4b)

PROCEDURE Verbrauchen() : warentyp {


WHILE count == 0 DO wait(nonempty);
warentyp ware = buffer[out];
count = count - 1;
out = (out + 1) % N;
signal(nonfull);
RETURN ware;
} // Verbrauchen
// Initialisierung:
count = in = out = 0;
} // Lager

BESYST (Mey) I3I/I3EI/DSI3 10 / 22


Kommunikation Monitore

Monitore in Java

I parallel ablaufende Programmteile → Threads


I Implementierung des Interfaces Runnable
I Vererbung der Klasse Thread
I jedes Objekt in Java hat einen Monitor →
Vererbung der Klasse Object
I Kennzeichnung (der Methoden): Modifizierer synchronized
I Synchronisierung: Laufzeitumgebung

BESYST (Mey) I3I/I3EI/DSI3 11 / 22


Kommunikation Monitore in Java

Steuerung von Threads

I Methoden der Klasse Object


public final void wait() throws InterruptedException
public final void wait(long timeout) throws
InterruptedException
public final void wait(long ms, int nanos) throws
InterruptedException
public final void notify()
public final void notifyAll()
I wait wartet auf ein bestimmtes Ereignis, welches mit notify[All]
signalisiert wird

BESYST (Mey) I3I/I3EI/DSI3 12 / 22


Kommunikation Monitore in Java

Erzeuger/Verbraucher in Java1

public class ProducerConsumerTest {


public static void main(String[] args) {
CubbyHole c = new CubbyHole(); // gemeinsame Ressource
Producer p1 = new Producer(c, 1);
Consumer c1 = new Consumer(c, 1);
p1.start();
c1.start();
}
}

1
Quelle: Campione/Walrath, Java Tutorial
BESYST (Mey) I3I/I3EI/DSI3 13 / 22
Kommunikation Monitore in Java

Prozess Erzeuger (Java)


public class Producer extends Thread {
private CubbyHole cubbyhole;
private int number;
public Producer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}
public void run() {
for (int i = 0; i < 10; i++) {
cubbyhole.put(i);
System.out.println("Producer #"+ this.number +
"put: "+ i);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) { }
}
}
}
BESYST (Mey) I3I/I3EI/DSI3 14 / 22
Kommunikation Monitore in Java

Prozess Verbraucher (Java)


public class Consumer extends Thread {
private CubbyHole cubbyhole;
private int number;
public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}
public void run() {
int value = 0;
for (int i = 0; i < 10; i++) {
value = cubbyhole.get();
System.out.println("Consumer #"+ this.number +
"got: "+ value);
}
}
}
BESYST (Mey) I3I/I3EI/DSI3 15 / 22
Kommunikation Monitore in Java

Gemeinsame Ressource in Java (1)

public class CubbyHole {


private int contents;
private boolean available = false;
public synchronized int get() {
while (available == false) {
try {
wait();
} catch (InterruptedException e) { }
}
available = false;
notifyAll();
return contents;
} // get()

BESYST (Mey) I3I/I3EI/DSI3 16 / 22


Kommunikation Monitore in Java

Gemeinsame Ressource in Java (2)

public synchronized void put(int value) {


while (available == true) {
try {
wait();
} catch (InterruptedException e) { }
}
contents = value;
available = true;
notifyAll();
} // put()
} // CubbyHole

BESYST (Mey) I3I/I3EI/DSI3 17 / 22


Kommunikation Vor- und Nachteile von Monitoren

Vorteile von Monitoren

I Klare Struktur
I gegenseitiger Ausschluss und Synchronisation sind klar voneinander
unterschieden
I Daten und Zugriffsfunktionen für kritische Abschnitte und
Synchronisation sind an einem Punkt zusammengefasst
I Abstrakter Datentyp
I nach Aussen ist nur die Schnittstelle bekannt
I die Implementierung der Synchronisation ist verkapselt
I geringere Fehleranfälligkeit (im Vergleich zu Semaphoren)
I der gegenseitige Ausschluss ist automatisch (durch Definition) gelöst

BESYST (Mey) I3I/I3EI/DSI3 18 / 22


Kommunikation Vor- und Nachteile von Monitoren

Nachteile von Monitoren

I Neues Sprachkonzept
I muss in der Sprache enthalten sein
I kaum nachträglich integrierbar
I Probleme mit WAIT und SIGNAL
I unterschiedliche Semantiken
I die bevorzugte Formulierung für WAIT wird nicht vom Compiler
erzwungen
I die Reihenfolge von WAIT und SIGNAL muss eingehalten werden
(Bedingung: WAIT muss vor dem zugehörigen SIGNAL erfolgen)

BESYST (Mey) I3I/I3EI/DSI3 19 / 22


Kommunikation

Erweiterungen des Monitor-Konzepts

I Warten mit Prioritäten


I Einführung eines bedingten WAIT, das die Priorität des wartenden
Prozesses beinhaltet
I in wait(long)/wait(long,int) von Java implizit vorhanden
I Pfadausdrücke
Idee: Synchronisationsoperationen WAIT und SIGNAL müssen explizit
programmiert werden und sind im Monitor ggf. verstreut →
Konzentrierung an einer Stelle

BESYST (Mey) I3I/I3EI/DSI3 20 / 22


Kommunikation

Die speisenden Philosophen2

I 5 Philosophen verbringen ihre Zeit an


einem Tisch mit essen und denken
I wer isst, denkt nicht, und umgekehrt
I um zu essen, werden beide Gabeln
neben dem Teller benötigt
I will ein Philosoph essen, nimmt er
zunächst die linke, dann die rechte
Gabel auf
I gesucht ist eine (Kommunikations-)
Lösung, bei der der potentielle
Deadlock vermieden wird

2
Grafik: Tanenbaum, Modern Operating Systems
BESYST (Mey) I3I/I3EI/DSI3 21 / 22
Kommunikation

Keine Lösung des Philosophenproblems!3

3
Quelle: Tanenbaum, Modern Operating Systems
BESYST (Mey) I3I/I3EI/DSI3 22 / 22

Das könnte Ihnen auch gefallen