1 Modul: Programmierung (B Modul: Programmierung (B- PRG) PRG) Grundlagen der Programmierung 1 Grundlagen der Programmierung 1 – Teil 3 Teil 3 Prozesse Prozesse Prof. Dr. R. Brause Adaptive Systemarchitektur Institut 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
13
Embed
Prozesse - Goethe University Frankfurt · 2007-12-21 · Präemptives Scheduling Shortest Remaining Time First Job mit kürzester verbleibender Bedienzeit zuerst . Dynamic Priority
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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
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):