1
Modul: Programmierung (BModul: Programmierung (B--PRG)PRG)Grundlagen der Programmierung 1 Grundlagen der Programmierung 1 –– Teil 3Teil 3
ProzesseProzesse
Prof. Dr. R. BrauseAdaptive SystemarchitekturInstitut für Informatik Fachbereich Informatik und Mathematik (12)
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 2
Warum Mehrprozessbetrieb?
Effiziente Nutzung des Systems
Mehrprogrammbetrieb: mehrere Teilnehmer am Rechner bzw. Server-Betrieb im Netz
Parallelbetrieb: unterschiedliche CPU-Nutzung parallel auszuführender Prozesse eines Programms
Programme und Prozesse
2
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 3
CPU-Idle
Diskette
Festplatte
Drucker
... und noch freie Prozessorkapazität fürrechenintensives Programm im Hintergrund
Parallelbetrieb bessere CPU-Nutzung
Daten drucken
Platte lesen
Daten lesen Daten lesen Daten lesen Daten lesen
Daten drucken Daten drucken
Platte schreiben Platte lesen Platte..
Prozesse
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 4
Was sind Prozesse ?
Prozess = Programmdaten
Prozeß
Daten
Pro-gramm
Stack
Prozeßkontext
CPU MMURegister Register
Dateiinfo,Zugriffs- Kernel-rechte stack
+ Prozeßkontext
3
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 5
Prozeßzustände
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)
nicht-ex.
erzeugt
bereit
terminiert
erhalteSignal
nicht-exaktivrunningZuteilung
blockiert erwarteSignal
Dispatcheraktionen
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 6
Unix Prozeßkontext
Speicherresidente Prozeßkontrollblöcke PCB der ProzeßtafelScheduling-ParameterSpeicherreferenzen: Code-, Daten-, Stackadressen im Haupt- bzw. MassenspeicherSignaldaten: Masken, ZuständeVerschiedenes: 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
4
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 7
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 R.Brause: Prozesse Folie 8
Kind
if (PID==0){exec („program“)
...};
/* PID = = 0 */
Unix: Prozeßerzeugung
Eltern
PID = fork()
/* PID ≠ 0 */
if (PID==0){ ...
...};
PID = wait(Status) . . .exit(Status) };
. . .
5
NebenlNebenlääufigkeit:ufigkeit:ThreadsThreads
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 10
Threads (Coroutinen)
gemeinsamer Prozeßkontext (Speicher-Addressbereich, Dateien (file handles)
Thread 1
Thread 2
Thread 3
Gemeinsamer Prozeßkontext
asynchroner, paralleler, unterschiedlicher Programmverlauf (eigener stack)
6
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 11
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
Prozeß- I/O
Systemaufruf
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 12
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
thread I/O thread I/O
Systemaufruf
7
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 13
Threads in Python
Modul thread:Funktionen zur Erstellung und Verwaltung von Threads.Low-Level Thread-Programmierung
Modul threading:Basiert auf Modul thread.Gekapselte Thread-KlasseHigh-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 print-Anweisungen IDLE zum Absturz!→ Eigene Programme, die Threads benutzen, von der
Kommandozeile aus starten!
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 14
Threads in Python
Definition der Klasse Thread im Modul threading:
Methode start():Methode start() fügt den Thread dem Python-Schedulerhinzu, und kehrt dann sofort zurück.Derselbe Thread kann nicht mehrmals gestartet werden.
Methode run():
Wird vom Python-Scheduler aufgerufenSobald die Methode run() beendet ist, beendet sich auch der Thread.
Implementierung von Threads durchüberladen der Methode run(self) in der Klasse Threadoder durch Übergeben eines aufrufbaren Objekts.
8
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 15
Threads in Python
Konstruktor (Auszug):
Thread(target =None, name =None,...)target ist ein aufrufbares Objekt, das von der run()-Methodeaufgerufen 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 16
Überladen
import threading
class countThread(threading.Thread):def run(self):
self.counter = 0while self.counter != 10:
print self.getName() , self.counterself.counter = self.counter + 1
...t1 = countThread(name = "Thread-1") definiere Instanzent2 = countThread(name = "Thread-2")t3 = countThread(name = "Thread-3")t1.start() mache sie dem dispatcher bekanntt2.start()t3.start()
Threads in Python
Beispiel (Implementierung durch Überladen der Methode run()
3 Threads zählen „gleichzeitig“ von 0 bis 9
9
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 17
Threads in Python
Ausgabe:Thread-1 0Thread-1 1Thread-1 2Thread-1 3Thread-1 4Thread-1 5Thread-1 6Thread-1 7Thread-1 8Thread-1 9Thread-2 0Thread-2 1Thread-2 2Thread-2 3Thread-2 4
Thread-3 0Thread-3 1Thread-3 2Thread-3 3Thread-3 4Thread-2 5Thread-2 6Thread-2 7Thread-3 5Thread-2 8Thread-3 6Thread-2 Thread-3 79Thread-3 8Thread-3 9…
…
Fehlende Synchronisation!
Thread 3 unterbricht Thread 2während der Ausgabe!
ProzeProzeßß--SchedulingScheduling
10
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 19
Prozeßscheduling
Vorplanung in verschiedenen ZeitmaVorplanung in verschiedenen Zeitmaßßststääbenben
Jobende Nutzer
Langzeit-schedul
Kurzzeit-schedul
HierHier: Nur : Nur KurzzeitschedulKurzzeitschedul !!
Ankunft Warteschlange Abgang
Prozessor
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 20
Prozeßscheduling: Ziele
Maximale Auslastung der CPUZiel 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 AutovermietungSind alle Wagen gut ausgelastet, müssen neue Kunden warten.Wartet kein Kunde, so existieren Autos ohne Benutzung.
Es gibt keinen idealen Schedulingalgorithmus !
11
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 21
„Jeder Prozeß läuft so lange, wie er will.“
First Come First Serve (FCFS).Einsortieren in der Ankunftsreihenfolge (FIFO-Warteschlange).
Nicht-präemptives Scheduling
Shortest Job First (SJF)Job mit kürzester Bedienzeit zuerst (min. mittl. Wartezeit).
Ankunft Warteschlange Abgang
Prozessor
Priority Scheduling (PS)Prio Prozeß; Bevorzugung von hoher Prio.
ProblemSJF und PS erlauben verhungern (starvation) von benachteiligten Prozessen
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 22
Präemptives Scheduling
Einführung von „Zeitscheiben“: Rücksichtslose Prozesse/Benutzer!
Abbruch
Ankunft Warteschlange Abgang
Prozessor
Prozeß2Prozeß1Prozeß3Prozeß2Prozeß1
Zeitscheibe
„Jeder Prozeß läuft nur so lange, wie er darf.“
12
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 23
Round Robin (RR)Einsortieren in der Ankunftsreihenfolge (FIFO-Warteschlange) + Zeitscheibe
Präemptives Scheduling
Shortest Remaining Time FirstJob mit kürzester verbleibender Bedienzeit zuerst .
Dynamic Priority Round Robin (DPRR)wachsende Prio-Vorstufe + RR
Kombinationen aller Strategien
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 24
Scheduling mit multiplen Warteschlangen
Korrektheit: Kein Verhungern durch feste Reihenfolge
multi level scheduling: Kein Verhungern durch ansteigende Job-Priorität
extra Warteschlange pro Prio:
Prio 0: Systemprozesse
Prio 1: Interaktive Jobs
Prio 2: Allgemeine Jobs
Prio 3: Rechenintensive Jobs dyn.Prio(t) ++
Round Robin
13
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 25
Beispiele Scheduling
Beispiel non-präempt. PrioritätsschedulingSchedul P2, P3, P1mittl. Bearbeitungszeit: (5 + 8 + 9) : 3 = 7 1/3
Beispiel präemptives SchedulingSchedul P1, P2, P3, Wechsel nach jeweils kurzen Zeitscheibenmittl. Bearbeitungszeit: (3 + 9 + 7) : 3 = 6 1/3
Prozesse P1, P2, P3Priorität 1, 5, 3Länge 1, 5, 3
P1
P2
P3
111
22
2
5 3 1
Grundlagen der Programmierung 1 - Teil 3 R.Brause: Prozesse Folie 26
Beispiele RR-Scheduling
Beispiel Wechsel nach jeweils sehr kurzen Zeitscheibenmittl. Bearbeitungszeit: (3 + 7 + 9) : 3 = 6 1/3 Jobeinheiten
Prozesse P1, P2, P3, Schedul: P1, P2, P3Längen 1, 3, 5,
P1
P2
P3
111
22 2
Beispiel: Wechsel nach großen Zeitscheiben = 1 Jobeinheit
P1
P2
P3
mittl. Bearbeitungszeit: (1 + 6 + 9) : 3 = 5 1/3 Jobeinheiten