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