Parallelität von Programmen
Verschicken von Nachrichten zwischen Objekten
Sequentiell
Parallel:
1. Mehrere Rechner
2. Eigener Prozess, alle Prozesse auf einem Rechner, Mehrkern
3. Quasi parallel
Grenze fließend: Verteilte Systeme
lokale Parallelität
real parallel
virtuell parallel
Ausführungsstränge (Threads)
Ausführungs squentiellen Programms: Ausführungsstrang, execution thread, thread
Erzeugen und Starten zusätzlicher Threads
Synchronisieren mehrerer Threads, Aufgaben
1. In kritischen Programmbereichen maximal ein Thread
Zuteilung von Rechenzeit
Scheduler
preemptives, nicht-preemptives Scheduling
Atomare Aktionen
Parallelität in objektorientierten Sprachen
1. Threads zwischen Objekten
2. Jedes Objekt hat seinen eigenen Thread
Lokale Parallelität in Java-Programmen
Java-Threads
Thread-Object
VM-Thread
Beschreiben und Starten von Threads
Ganz normales Objekt
Wird mit der Methode start aufgerufen
Parameterlose Methode run
public class MyThread extends Thread {
@Override
public void run () {
// Hier steht der Code
}
}
Der neue Thread wird so gestartet:
Thread myThread = new MyThread ();
myThread.start ();
Vier verschiedene Zustände
1.) Neu - d.h. start wurde noch nicht aufgerufen
2.) Lauffähig - d.h. er wird gerade ausgeführt oder könnte es
3.) Seine Ausführung ist blockiert
4.) Er kann tot sein, d.h. run ist blockiert
1.) Lauffähig
2.) Rechenbereit
3.) Rechnend
nue -> Rechenbereit <-> Rechnend -> tot
Schlafend, wartend
EA-Blockiert, Monitorblockiert
yield
sleep
Monitor-blockiert
Kommunikation von Threads über den zentralen Speicher
Zentraler Speicher
Jeder Thread hat eigenen Stack
Gemeinsamer Speicher
Java definiert eigenes Speichermodell, weil eventuell Prozesse auf unterschiedlichen Computern, ohne gemeinsamen Speicher
Fehlende sequentielle Konsistenz
Schlüsselwort volatile
Kommunikation von Threads über unterbrechungen
Methode: interrupt
void interrupt()
boolean isInterrupted()
static boolean interrupted()
sleep()
wait()
Interrupt-Flag
Scheduling von Threads
Verhungern, starvation
Synchronisation
1. Gebrauch gemeinsamer Ressourcen
2. ..
3. ..
4. Unbedachte Synchronisation: Verklemmung
Bsp: Gemeinsame Variable
Bsp.: Konto:
public class Konto {
private int saldo;
public Konto (int saldo) {
this.saldo = saldo;
}
public void einzahlen (int betrag) [
saldo = saldo + betrag;
}
}
Oder
public class Konto {
private int saldo;
public Konto (int saldo) {
this.saldo = saldo;
}
public void einzahlen (int betrag) [
int tmp = saldo + betrag;
saldo = tmp;
}
}
Kritische Bereiche
Kooperation
Zwei Threads kooperieren: Der eine Thread wartet, bis der andere eine bestimmte Leistung erbracht hat.
Fairness und Verhungern
Die Sprachspezifikation von Java fordert keine Fairness => Programmierende müssen diese Aufgabe übernehmen
Methode: yield
yield signalisiert dem Scheduler, dass der Laufende Thread den Prozessor freigeben will
Verhungern kann statt durch fehlende Fairness auch druch fehlerhafte Synchronisation entstehen
Ein objektorientiertes Monitorkonzept
Monitor: Überwachungseinheit, die den Zugang zu bestimmten Anweisungsfolgen kontrolliert
Zuordnung eines Monitors zu einer Methode oder einem Block
Um einen Block oder eine Methode einem Monitor zur Überwachung zu zu ordnen, wird das Schlüsselwort
"synchronized"
verwendet.
Bei der Deklaration "synchronized" vorstellen.
Sperren von Monitoren
Falsche Verwendung von Monitoren: Problem
Synchronisierte Blöcke
Synchronisation von Methoden
Synchronisation von Blöcken
wait/notify Mechanismus