Prozesse

Transcription

Prozesse
Modul: Programmierung (B(B-PRG)
Grundlagen der Programmierung 1 – Teil 3
Prozesse
Prof. Dr. R. Brause
Adaptive Systemarchitektur
Institut für Informatik
Fachbereich Informatik und Mathematik (12)
Programme und Prozesse
Warum Mehrprozessbetrieb?
Effiziente Nutzung des Systems
X
Mehrprogrammbetrieb: mehrere Teilnehmer am
Rechner bzw. Server-Betrieb im Netz
Y
Parallelbetrieb: unterschiedliche CPU-Nutzung
parallel auszuführender Prozesse eines Programms
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Folie 2
1
Prozesse
Parallelbetrieb
bessere CPU-Nutzung
CPU-Idle
Diskette
Festplatte
Drucker
Platte lesen
Daten lesen
Daten lesen
Daten lesen
Daten drucken
Platte..
Platte lesen
Platte schreiben
Daten drucken
Daten lesen
Daten drucken
... und noch freie Prozessorkapazität für
rechenintensives Programm im Hintergrund
Grundlagen der Programmierung 1 - Teil 3
Folie 3
R.Brause: Prozesse
Was sind Prozesse ?
Prozess = Programmdaten + Prozeßkontext
Prozeß
Prozeßkontext
Daten
CPU
Register
MMU
Register
Programm
Dateiinfo,
Zugriffsrechte
Kernelstack
Stack
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Folie 4
2
Prozeßzustände
Dispatcheraktionen
erzeugt
nicht-ex.
erhalte
Signal
bereit
blockiert
erwarte
Signal
terminiert
aktiv
Zuteilung running
nicht-ex
Prozesse warten in einer Warteschlange ...
auf den Prozessor (bereit)
auf eine Nachricht (blockiert)
auf ein Zeitsignal (blockiert)
auf Daten des I/O-Geräts (blockiert)
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Folie 5
Unix Prozeßkontext
Speicherresidente Prozeßkontrollblöcke PCB der Prozeßtafel
Scheduling-Parameter
Speicherreferenzen: Code-, Daten-, Stackadressen im Haupt- bzw.
Massenspeicher
Signaldaten: Masken, Zustände
Verschiedenes: Prozeßzustand, erwartetes Ereignis, Timerzustand,
PID, PID der Eltern, User/Group-IDs
Auslagerbarer Benutzerkontext (swappable user structure)
Prozessorzustand: Register, FPU-Register, …
Systemaufruf: Parameter, bisherige Ergebnisse, …
Datei-Info-Tabelle (file descriptor table)
Benutzungsinfo: CPU-Zeit, max. Stackgröße, …
Kernel-stack: Platz für Systemaufrufe des Prozesses
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Folie 6
3
Beispiel Prozeßerzeugung
Beispiel shell
Pseudocode
LOOP
Write(prompt);
(* tippe z. B. ´>´ *)
ReadLine(command, params);
(* lese strings, getrennt durch Leertaste *)
pid := fork();
(* erzeuge Kopie dieses Prozesses *)
IF (pid=0)
THEN execve(command,params,0)(* Kind: überlade mit Programm *)
ELSE wait(pid)
(* Eltern: warte aufs Ende vom Kind *)
END;
END;
Grundlagen der Programmierung 1 - Teil 3
Folie 7
R.Brause: Prozesse
Unix: Prozeßerzeugung
Eltern
PID = fork()
/* PID ≠ 0 */
if (PID==0)
{ ...
...
};
PID = wait(Status)
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Kind
/* PID = = 0 */
if (PID==0)
{exec („program“)
...
};
. . .
exit(Status) };
. . .
Folie 8
4
Nebenläufigkeit:
Threads
Threads (Coroutinen)
gemeinsamer Prozeßkontext (SpeicherAddressbereich, Dateien (file handles)
asynchroner, paralleler, unterschiedlicher
Programmverlauf (eigener stack)
Thread 1
Thread 2
Thread 3
Gemeinsamer Prozeßkontext
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Folie 10
5
Thread- Typen:
lightweight threads
„ kontrolliert vom Benutzerprogramm (z.B. Unix-Bibliothek)
Vorteil: sehr schneller thread-Wechsel T1, T2
Nachteil: Blockieren aller threads bei I/O-Warten
von einem thread.
Prozeß
T1
T2
Systemaufruf
Prozeß- I/O
Grundlagen der Programmierung 1 - Teil 3
Folie 11
R.Brause: Prozesse
Thread- Typen:
heavyweight threads
„ kontrolliert vom Betriebssystem (z.B. Windows NT)
Vorteil: Unabhängiger I/O aller threads T1, T2
Nachteil:langsamer BS-Systemaufruf nötig
⇒ fibers in NT
Prozeß
T1
T2
Systemaufruf
thread I/O
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
thread I/O
Folie 12
6
Threads in Python
Modul thread:
ƒ Funktionen zur Erstellung und Verwaltung von Threads.
ƒ Low-Level Thread-Programmierung
Modul threading:
ƒ Basiert auf Modul thread.
ƒ Gekapselte Thread-Klasse
ƒ High-Level Thread-Programmierung
Hinweis: Die mitgelieferte Entwicklungsumgebung von Python – IDLE –
ist nicht thread-sicher, so sind zum Beispiel die Ausgabefunktionen nicht
synchronisiert.
Insbesondere bringt die gleichzeitige Ausführung von printAnweisungen IDLE zum Absturz!
→ Eigene Programme, die Threads benutzen, von der
Kommandozeile aus starten!
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Folie 13
Threads in Python
Definition der Klasse Thread im Modul threading:
Methode start():
ƒ Methode start() fügt den Thread dem Python-Scheduler
ƒ
hinzu, und kehrt dann sofort zurück.
Derselbe Thread kann nicht mehrmals gestartet werden.
Methode run():
ƒ Wird vom Python-Scheduler aufgerufen
ƒ Sobald die Methode run() beendet ist, beendet sich auch der
Thread.
Implementierung von Threads durch
ƒ überladen der Methode run(self) in der Klasse Thread
ƒ oder durch Übergeben eines aufrufbaren Objekts.
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Folie 14
7
Threads in Python
Konstruktor (Auszug):
Thread(target =None, name =None,...)
ƒ target ist ein aufrufbares Objekt, das von der run()-Methode
ƒ
ƒ
aufgerufen wird.
Aufrufbares Objekt: __call__() Methode ist definiert.
name ist der Name des Threads.
Wenn die Subklasse den Konstruktor überschreibt, so muss
sichergestellt werden, dass zuerst der Konstruktor der
Basisklasse (Thread.__init__()) aufgerufen wird, bevor der
Thread benutzt wird.
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Folie 15
Threads in Python
Beispiel (Implementierung durch Überladen der Methode run()
3 Threads zählen „gleichzeitig“ von 0 bis 9
import threading
class countThread(threading.Thread):
def run(self):
Überladen
self.counter = 0
while self.counter != 10:
print self.getName() , self.counter
self.counter = self.counter + 1
...
t1 = countThread(name = "Thread-1")
definiere Instanzen
t2 = countThread(name = "Thread-2")
t3 = countThread(name = "Thread-3")
t1.start()
mache sie dem dispatcher bekannt
t2.start()
t3.start()
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Folie 16
8
Threads in Python
Ausgabe:
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
…
Grundlagen der Programmierung 1 - Teil 3
…
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Thread-2
Thread-2
Thread-2
Thread-2
Thread-2
Thread-3
Thread-3
Thread-3
Thread-3
Thread-3
Thread-2
Thread-2
Thread-2
Thread-3
Thread-2
Thread-3
Thread-2
9
Thread-3
Thread-3
0
1
2
3
4
5
6
7
5
8
6
Thread-3
Fehlende Synchronisation!
Thread 3 unterbricht Thread 2
während der Ausgabe!
7
8
9
R.Brause: Prozesse
Folie 17
Prozeß-Scheduling
9
Prozeßscheduling
Vorplanung in verschiedenen Zeitmaß
Zeitmaßstä
stäben
Jobende
Nutzer
Langzeitschedul
Kurzzeitschedul
Hier:
Hier: Nur Kurzzeitschedul !
Ankunft
Warteschlange
Abgang
Prozessor
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Folie 19
Prozeßscheduling: Ziele
„ Maximale Auslastung der CPU
Ziel ist die 100%ige Auslastung der CPU, normal 40%–90%.
„ Minimale Wartezeit (waiting time)
Wartezeit in der bereit-Liste minimieren (einziger
Scheduling-parameter)
Problem: Diese Ziele sind weder vollständig noch konsistent
Beispiel Autovermietung
Sind alle Wagen gut ausgelastet, müssen neue Kunden warten.
Wartet kein Kunde, so existieren Autos ohne Benutzung.
Es gibt keinen idealen Schedulingalgorithmus !
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Folie 20
10
Nicht-präemptives Scheduling
Ankunft
Warteschlange
Abgang
Prozessor
„Jeder Prozeß läuft so lange, wie er will.“
First Come First Serve (FCFS).
Einsortieren in der Ankunftsreihenfolge (FIFO-Warteschlange).
Shortest Job First (SJF)
Job mit kürzester Bedienzeit zuerst (min. mittl. Wartezeit).
Priority Scheduling (PS)
Prio ¼Prozeß; Bevorzugung von hoher Prio.
Problem
SJF und PS erlauben verhungern (starvation) von
benachteiligten Prozessen
Grundlagen der Programmierung 1 - Teil 3
Folie 21
R.Brause: Prozesse
Präemptives Scheduling
Ankunft
Warteschlange
Abgang
Prozessor
Abbruch
Einführung von „Zeitscheiben“: Rücksichtslose Prozesse/Benutzer!
Prozeß1
Prozeß2
Prozeß3
Prozeß1
Prozeß2
Zeitscheibe
„Jeder Prozeß läuft nur so lange, wie er darf.“
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
Folie 22
11
Präemptives Scheduling
Round Robin (RR)
Einsortieren in der Ankunftsreihenfolge (FIFO-Warteschlange)
+ Zeitscheibe
Dynamic Priority Round Robin (DPRR)
wachsende Prio-Vorstufe + RR
Shortest Remaining Time First
Job mit kürzester verbleibender Bedienzeit zuerst .
Kombinationen aller Strategien
Grundlagen der Programmierung 1 - Teil 3
Folie 23
R.Brause: Prozesse
Scheduling mit multiplen Warteschlangen
Korrektheit: Kein Verhungern durch feste Reihenfolge
multi level scheduling:
Kein Verhungern durch ansteigende Job-Priorität
extra Warteschlange pro Prio:
Round
Robin
Prio 0: Systemprozesse
Prio 1: Interaktive Jobs
Prio 2: Allgemeine Jobs
Prio 3: Rechenintensive Jobs
Grundlagen der Programmierung 1 - Teil 3
R.Brause: Prozesse
dyn.Prio(t) ++
Folie 24
12
Beispiele Scheduling
Prozesse P1, P2, P3
Priorität 1, 5, 3
Länge
1, 5, 3
Beispiel
non-präempt. Prioritätsscheduling
Schedul P2, P3, P1
mittl. Bearbeitungszeit: (5 + 8 + 9) : 3 = 7 1/3
5
Beispiel
1
3
präemptives Scheduling
Schedul P1, P2, P3, Wechsel nach jeweils kurzen Zeitscheiben
mittl. Bearbeitungszeit: (3 + 9 + 7) : 3 = 6 1/3
P1
P2
P3
1
1
1
2
2
Grundlagen der Programmierung 1 - Teil 3
2
Folie 25
R.Brause: Prozesse
Beispiele RR-Scheduling
Prozesse P1, P2, P3, Schedul: P1, P2, P3
Längen 1, 3, 5,
Beispiel: Wechsel nach großen Zeitscheiben = 1 Jobeinheit
P1
P2
P3
mittl. Bearbeitungszeit: (1 + 6 + 9) : 3 = 5 1/3 Jobeinheiten
Beispiel Wechsel nach jeweils sehr kurzen Zeitscheiben
mittl. Bearbeitungszeit: (3 + 7 + 9) : 3 = 6 1/3 Jobeinheiten
P1
P2
P3
Grundlagen der Programmierung 1 - Teil 3
1
1
1
R.Brause: Prozesse
2
2
2
Folie 26
13