Kapitel 2: Prozesse und Threads PDF
Document Details
Uploaded by LaudableVibrance
Hochschule Merseburg
2024
Thomas Meier
Tags
Summary
This document is a lecture or seminar notes on operating systems focusing on processes and threads. Topics covered include definitions, operational concepts, and the relationship between processes and threads. Information is targeted at undergraduate students at Hochschule Merseburg in the Sommersemester 2024.
Full Transcript
Informatik-II Sommersemester 2024 Thomas Meier ([email protected]) Fachbereich INW Hochschule Merseburg Informatik-2 Teil 1: Betriebssysteme 2. Prozesse und Threads Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 2 Ziele Ziele des Modulabschnitts „Pro...
Informatik-II Sommersemester 2024 Thomas Meier ([email protected]) Fachbereich INW Hochschule Merseburg Informatik-2 Teil 1: Betriebssysteme 2. Prozesse und Threads Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 2 Ziele Ziele des Modulabschnitts „Prozesse und Threads“ Eine der Hauptaufgaben von Betriebssystemen ist die Ausführung von Programmen. Sie können die Begriffe Prozess und Thread unterscheiden und wissen, dass im täglichen Sprachgebrauch teilweise beide Begriffe als Tasks bezeichnet werden. Sie verstehen das Prozesskonzept moderner Betriebssysteme insbesondere unter Berücksichtigung des Mehrprogramm-Betriebs (Multiprogramming). Sie verstehen das Prozess-Zustandsmodell und können die Zustandsübergänge erläutern. Sie verstehen die Mechanismen der Prozesskontrolle und die wesentlichen Ursachen für Prozess-Unterbrechungen. Sie verstehen die Bedeutung von Threads in Betriebssystemen mit Multithreading sowie die wesentlichen Unterschiede zwischen Prozessen und Threads. Sie kennen die wesentlichen Bibliotheksaufrufe (bzw. Systemaufrufe) zur Prozess- und Threaderzeugung unter Linux. Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 3 Begriffe: Prozesse, Threads, Tasks Prozess Definition: Ein Prozess ist ein im Stadium der Ausführung befindliches Programm. Ein Prozess ist gekennzeichnet durch - durch die zugehörigen Systemressourcen: Prozess ▪ Speicher (Programmcode und Daten) Hauptspeicher Prozesskontext ▪ geöffnete Dateien, Geräte, … Programm - aktueller Wert des Programmzählers CPU-Register MMU-Register - aktuelle Werte der CPU-Register und Variablen Daten Programm- Dateiinfos & In vielen Betriebssystemen werden die zähler Zugriffrechte Stack Ausführungseinheiten eines Prozesses in Form von Threads realisiert (siehe später: Threadkonzept), wobei einem Prozess mehrere Threads zugeordnet Prozessdaten sein können (→ Multithreading) Bemerkung: Häufig werden Prozesse auch als Tasks bezeichnet (→ siehe auch Multitasking), wobei je nach Kontext teilweise auch bei Threads von Tasks gesprochen wird. Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 4 Multiprogramming/Multitasking Multitasking / Multiprogramming (Mehrprogrammbetrieb) Ausführung mehrerer Programme (Prozesse) auf einem Rechner, wobei sich mehrere Prozesse eine CPU teilen. - Auf Mehrprozessormaschinen („Multi-Core“) können mehrere Prozesse echt parallel ausgeführt werden. - Wenn sich mehrere Prozesse eine CPU teilen müssen, spricht man von Quasi-Parallelität. Die Auslastung des Rechners wird erhöht, da Prozesse einen Großteil der Zeit mit Warten, insbesondere auf E/A- Operationen (Eingabe/Ausgabe) verbringen → In dieser Zeit kann die CPU andere Prozesse ausführen. Heute werden die Prozesse im Timesharing-Verfahren auf die CPUs verteilt, wobei ein Scheduler die Reihenfolge der CPU-Zuteilung für die vorhandenen ausführbereiten Prozesse vornimmt. Da sich mehrere Prozesse gleichzeitig im Hauptspeicher befinden, müssen die Rechner-Hardware und das Betriebssystem entsprechende Speicherschutzmechanismen (Memory Protection) bereitstellen. Hauptspeicher Programmzähler und Register Proc. A Prozess A A Proc. B CPU Prozess B B Prozess C C Proc. C t Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 5 Multiprogramming/Multitasking – CPU-Auslastung Ein realistisches Beispielszenario: Ein Prozess a) liest Daten von der Festplatte in den Arbeitsspeicher (sogenannter I/O-Burst, d.h. der Prozess wartet auf die Übertragung der Daten vom I/O-Gerät) b) berechnet aus den Daten eine neue Datenreihe (sogenannter CPU-Burst, d.h. der Prozess benötigt die CPU) c) schreibt die Ergebnisse (neue Datenreihe) auf die Festplatte (sogenannter I/O Burst …) Typische Zeiten für a) bis c): a) 15 ms b) 1 ms für 200 Befehle c) 15 ms Während der Phasen a) und c) ist der Prozess blockiert →die CPU-Auslastung dieses Prozesses beträgt ca. 3,2 % Dies ist der Grund, warum auf einem Rechner viele Prozess „quasi gleichzeitig“ ausgeführt werden können, ohne dass die „gefühlte“ Ausführungsgeschwindigkeiten der einzelnen Prozess merklich darunter leiden. Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 6 Mechanismen und Strukturen für die Prozessverwaltung Mechanismen und Strukturen für die Prozessverwaltung Betriebssysteme müssen Mechanismen bereitstellen, um: I. Prozesse zu starten (Erzeugung) und zu beenden (Terminierung) → siehe gleich II. zu entscheiden, welcher Prozess wann (und auf welchem Prozessor/CPU) ausgeführt wird → dafür ist das Prozess-Scheduling verantwortlich III. mehrere Prozesse simultan im Hauptspeicher halten bzw. Prozesse schnell zwischen Hauptspeicher und Sekundärspeicher auszutauschen (Swapping) → siehe später beim Thema Speicherverwaltung IV. bei konkurrierenden Zugriffen mehrerer Prozesse auf gemeinsame Speicherbereiche Konflikte vermeiden sowie Prozesse synchronisieren → siehe später beim Thema Mutual Exclusion und Inter-Process Communication (IPC) Betriebssysteme müssen Strukturen implementieren, um die aktiven Prozesse zu verwalten I. Queues: Warteschlangen zur Prozessverwaltung II. Prozess-Image und Prozess Control Block (PCB) Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 7 Prozess-Erzeugung Zu I. Prozesserzeugung: Die Erzeugung eines Prozesses kann durch folgende Ereignisse ausgelöst werden1): − Initialisierung des Systems: z.B. der init-Prozess während des „Hochfahrens“ − Systemaufruf zur Erzeugung eines Prozesses durch einen anderen Prozess ( fork()-oder clone()-Aufruf in Linux): z.B. ein Programm zur Übertragung großer Datenmengen kann für jede Netzwerk-Verbindung einen separaten Prozess starten …) − Benutzeranfrage: z.B. Nutzer startet ein Programm oder ruft in der interaktiven Kommando-Shell ein Kommando auf, wodurch ein entsprechender Prozess gestartet wird, der das aufgerufene Programm ausführt Fazit: Ein Prozess wird in der Regel durch einen anderen, bereits vorhandenen, Prozess erzeugt: − Eltern-Prozess (Parent Process): erzeugender Prozess − Kind-Prozess (Child Process): erzeugter Prozess → es entstehen Prozesshierarchien (ein Prozessbaum) → siehe auch Linux man pstree 1) In der Fachliteratur finden Sie teilweise weitere Ereignisse – hier wurden die wichtigsten Ereignisse angegeben. Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 8 Prozess-Erzeugung: fork() und clone() unter Linux-OS Im Linux-Betriebssystem gibt es zwei Aufrufe, die der Programmierer zur Erzeugung eines neuen Prozesses durch ein Programm nutzen kann: fork() − fork() ist der „klassische“ Aufruf, um aus einem Programm (Prozess) einen neuen Prozess zu starten. − der neue Prozess ist eine exakte Kopie des erzeugenden Prozesses (bis auf wenige Ausnahmen wie Process-ID, …) − die Ausführung des neuen Prozesses beginnt an exakt derselben Stelle wie der Position des erzeugenden Prozesses, d.h. bei der Rückkehr aus dem fork()-Aufruf →der Programmierer muss erkennen, welches der neue Prozess ist und entsprechende Code-Anweisungen zur Ausführung der „neuen Anwendung“ programmieren − Wie kann der Entwickler unterscheiden, welches der erzeugende Prozess ist und welches der neue Prozess ist? Praxis: Sie werden hierzu eine entsprechende Praktikumsaufgabe bearbeiten und sich dazu in der Vorbereitung mit dem fork-Aufruf beschäftigen. clone():nur bei Interesse – sprechen Sie mich bei Interesse im Praktikum dazu an… Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 9 Prozess-Terminierung Zu I. Prozessterminierung die 4 häufigsten Ursachen1) für die Beendigung eines Prozesses : normales Beenden (freiwillig): Der Prozess hat seine Arbeit verrichtet und ist nun fertig, d.h. er stellt eine Anfrage an das Betriebssystem zur Beendigung (typischerweise wenn das Ende des Programmcode eines Programms erreicht ist). Beenden aufgrund eines Fehler (freiwillig): Der Prozess erkennt einen Fehler (z.B. Bedienfehler) und stellt eine Anfrage an das Betriebssystem zur Beendigung (z.B. die Ausführung einer exit()-Anweisung in Ihrem Programmcode) Beenden aufgrund eines schwerwiegenden Fehlers (unfreiwillig): Der Prozess verursacht einen schweren Fehler (z.B. Zugriff auf nicht erlaubte Speicherstelle oder Ausführung eines unzulässigen Befehls), so dass das Betriebssystem den Prozess beendet. Beenden durch einen anderen Prozess (unfreiwillig): Vorausgesetzt, ein Prozess hat die notwendigen Berechtigungen, kann er mittels entsprechender Systemaufrufe andere Prozesse terminieren (z.B. kill-Aufruf unter Linux) 1) In der Fachliteratur finden Sie teilweise weitere Ursachen – hier wurden die wichtigsten Ereignisse angegeben. Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 10 Prozess-Zustandsmodell: das 5-Zustands-Modell Prozess-Zustandsmodell: Das Prozess-Zustandsmodell beschreibt die möglichen Zustände, in denen sich ein Prozess befinden kann sowie die möglichen Übergänge zwischen den Zuständen dispatchen new ready running exit 5-Zustands-Modell timeout Ereignis Warten tritt ein auf Ereignis blocked new: Der Prozess wurde vom Betriebssystem erzeugt. Er ist noch nicht ausführbereit. ready: Der Prozess ist zur Ausführung bereit running: Der Prozess wird momentan ausgeführt (es können nur so viele Prozesse im Zustand running sein, wie CPUs vorhanden sind) blocked: Der Prozess wartet auf ein Ereignis (z.B. die Rückkehr eines blockierenden Systemaufrufs wie beispielsweise eine Eingabe von der Tastatur) exit: Die Beendigung des Prozesses wurde initiiert. Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 11 Prozess-Zustandsmodell: Das 5-Zustands-Modell die möglichen Zustandsübergänge: → new: siehe Prozesserzeugung… new → ready: Das Betriebssystem hat den neuen Prozess aufgenommen und hat genug Betriebsmittel (z.B. Hauptspeicher) zu dessen Ausführung. ready → running: Der Scheduler des Betriebssystems hat dem Prozess die CPU zugeteilt, d.h. der Prozess „läuft“ nun. running → exit: Das Betriebssystem beendet diesen Prozess: siehe Prozessterminierung. running →ready: Das Betriebssystem entzieht dem Prozess die CPU, d.h. die maximale Zeit für ununterbrochene Ausführung ist abgelaufen oder ein höher priorisierter Prozess ist ausführbereit (timeout) running →blocked: Der Prozess benötigt zur weiteren Ausführung etwas, auf das er warten muss (z.B. Ergebnis einer I/O- Operation, Kommunikation mit einem anderen Prozess, der dazu noch nicht bereit ist …) blocked → ready: Das Ereignis, das zum Blockieren geführt hatte, ist nun eingetreten, d.h. der Prozess ist wieder ausführbereit und wartet auf die CPU-Zuteilung. Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 12 Prozess-Zustandsmodell Erweiterung des Prozess-Zustandsmodell für „Swapping“ Wir haben bisher angenommen, dass alle Prozesse eines Multitasking Betriebssystems in den physischen Hauptspeicher passen: das trifft i.d.R. nicht zu! d.h. die Summe der jeweiligen Prozess-Images ist i.d.R. größer als der physische Hauptspeicher Im Moment genügt es zu wissen, dass die Lösung des Problems darin besteht, Teile von Prozessen (Teile deren Prozess-Image) oder komplette Prozesse auf die Festplatte auszulagern → dies wird als Swapping bezeichnet (wir werden die genauen Mechanismen später beim Thema Speicherverwaltung kennenlernen) − Sollte das Betriebssystem zur Ausführung eines nicht-blockierten Prozesses Hauptspeicher benötigen, so wird ein blockierter Prozess aus der Blocked Queue (Prozesszustand blocked) auf die Festplatte ausgelagert → neuer Zustand „Suspend“ − Damit das Betriebssystem unterscheiden kann, ob ein suspendierter Prozess fortgesetzt werden könnte, wird der „Suspend“-Zustand in zwei neue Zustände unterteilt: Suspend/Ready: der Prozess ist ausführbereit aber momentan noch ausgelagert Suspend/Blocked: der Prozess ist blockiert (wartet auf Ereignis) und er ist ausgelagert → wir haben ein verfeinertes 7-Zustands-Modell (siehe Folgefolie) Bemerkung: Neben der Auslagerung (Swapping) gibt es noch weitere Gründe, die dazu führen, dass ein Prozess suspendiert ist (z.B. durch den Nutzer pausiert). Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 13 Prozess-Zustandsmodell 7-Zustands-Prozessmodell durch die Auslagerung 7-Zustands-Modell new von Prozessen (oder dispatchen Teilen) wird das 7-Zustandsmodell benötigt Aktivieren suspend/ ready running exit ready Suspendieren timeout Ereignis tritt ein Ereignis tritt ein Warten suspend/ Aktivieren auf Ereignis blocked blocked neue Übergänge Suspendieren Aktivieren: ein suspendierter Prozess (oder Teile davon) werden durch das Betriebssystem in den Hauptspeicher geladen. Suspendieren: Das Prozess-Image (oder Teile davon) werden durch das Betriebssystem auf die Festplatte geschrieben (Swapping) Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 14 Prozess-Strukturen: Prozess-Abbild (Process Image) Was muss ein Betriebssystem wissen, um Prozesse verwalten und kontrollieren zu können? Das Process-Image (Prozess-Abbild) enthält alle Informationen, die Zur Ausführung eines Prozesses durch das Betriebssystem erforderlich sind a. Speicherinhalt des Prozesses:? → Process Location (siehe auch Adressraum der Prozesses) b. Prozessattribute: Welche Attribute charakterisieren einen Prozess und Wo ist der Prozess lokalisiert? → siehe Prozess-Kontrollblock (PCB) Prozess-Identifikation Prozess-Statusinformation PCB (Process Control Block) Prozess-Kontrollinformation User-Stack Speicherinhalte des Prozesses Programm Code & Data Shared Address Space Beispiel: siehe PCB des Linux-BS Prozess-Abbild (Process Image) Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 15 Prozesskontrollblock (PCB) a) Prozesslokalisierung: Pragrammcode und Daten im Speicher (siehe Adressraum) Code-Bereich: Programmcode und statische Daten des Prozesses User-Stack und Heap: lokale Variablen und dynamisch erzeugte Daten System Stack (auch Kernel Stack): Parameter für Systemaufrufe b) Prozess Control Block (PCB) Ein Multitasking-Betriebssystem benötigt zur Prozessverwaltung eine Vielzahl von Informationen über jeden Prozess. Diese Informationen sind Teil des Prozesskontrollblocks (PCB). Der PCB ist die bedeutendste Datenstruktur des Betriebssystems. In verschiedenen Betriebssystemen existieren unterschiedliche Varianten (mit jeweils spezifischen Inhalten). Prinzipiell beinhaltet der PCB 3 Kategorien von Informationen: I. Prozessidentifikation II. Prozess-Statusinformationen III. Prozess-Kontrollinformationen Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 16 PCB – Betriebssystem-Queues und PCBs Verwendung der Prozesskontrollstruktur: Die meisten Betriebssysteme verwalten die Queues (z.B. Ready-Queue) als verkettete Liste von PCBs, d.h. bei einem Wechsel des Zustands eines Prozesses “hängt“ das Betriebssystem den entsprechenden PCB in die entsprechende Queue. BS-Queues Running PCB Ready PCB PCB PCB Blocked PCB PCB Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 17 Prozesskontrolle: Prozess-Unterbrechungen Prozess-Unterbrechungen Bei bestimmten Ereignissen oder Aktionen muss der laufende Prozess (Zustand running) die Kontrolle an das Betriebssystem abgeben, damit das Betriebssystem seine Arbeit verrichten kann. Die Übertragung der Kontrolle an der Betriebssystem wird durch eine Unterbrechung des laufenden Prozesses eingeleitet, indem eine entsprechende Unterbrechungsroutine angesprungen wird. Die Unterbrechungsroutine entscheidet je nach Art der Unterbrechung, ob ein Modus-Wechsel (User Mode → Kernel Mode) oder ein Prozesswechsel stattfinden soll. Es gibt 3 unterschiedliche Ursachen für den Aufruf von Unterbrechungsroutinen: 1. Interrupts (Externe Ereignisse): z.B.: Timer-Interrupts, HW-Interrupts, (d.h. Ereignisse, die nicht durch den aktuell ausgeführten Befehl verursacht wurden) 2. Traps (auch SW-Interrupts, Exceptions): i.d.R. Fehler- bzw. Ausnahmeereignis, das durch den aktuell ausgeführten Befehl verursacht wurde: z.B. „Division durch 0“ 3. Systemaufruf (Supervisor-Call): Aufruf einer Betriebssystem-Funktion (z.B. file open) die einen Systemaufruf (in Form eines SW-Interrupt – auch „Trap“) zur Folge hat, der häufig blockierend ist. Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 18 Prozesskontrolle: Prozess-Unterbrechungen (Beispiele) Beispiele für Interrupts: Periodischer Takt (Timer): − Es wird überprüft, ob der aktuell ausgeführte Prozess sein Zeitkontingent verbraucht hat (Time Slice). − Falls ja, wird der Prozess in die „ready“-Queue eingereiht und ein anderer Prozess ausgewählt (Scheduling). E/A-Ereignis nach erfolgreicher Eingabe-/Ausgabe: − Der Prozess, der auf die Beendigung der E/A-Aktion gewartet hat (im blocked-Zustand) wir nun in die „ready“- Queue verschoben. − Der aktuelle Prozess wird fortgesetzt oder ein höher priorisierter Prozess wird ausgewählt (Scheduling). Speicherfehler (z.B. bei virtuellem Speicher mit Paging → siehe Speicherverwaltung): − Die referenzierte (virtuelle) Adresse befindet sich nicht im physischen Hauptspeicher (Page Fault) − Das Betriebssystem sorgt nun dafür, dass die entsprechende Speicherseite in den Hauptspeicher geladen wird − Der aktuelle Prozess muss in den Zustand „blocked“ versetzt werden, bis der entsprechenden Speicher geladen wurde. Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 19 Threads und Multithreading Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 20 Threads und Multithreading Thread-Konzept: Das Thread-Konzept ist ein Konzept, das in modernen Betriebssystemen zur Ausführung von Prozessen eingesetzt wird: Moderne Betriebssysteme unterstützen ein Ausführungskonzept, bei dem die Ausführung von Anwendungen (Prozessen) in Form von Threads stattfindet. Auf diese Weise können nebenläufige/parallele Anwendungen entwickelt werden, die aus mehreren nebenläufigen Threads (Abarbeitungs- bzw. Ausführungsfäden) bestehen, die die Ressourcen der zugehörigen Anwendung (Prozess) gemeinsam nutzen (im Sinne von Kooperation). Dieses Konzept erleichtert die Kommunikation zwischen diesen Ausführungsfäden (Threads) gegenüber der klassischen IPC-Kommunikation von getrennten Prozessen, da alle Threads eines Prozesses auf den gemeinsamen Prozess- Adressraum zugreifen können. Allerdings entstehen durch die gemeinsamen Ressourcennutzung auch Herausforderungen für den Programmierer (siehe später …). Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 21 Zusammenhang: Prozess – Thread Wir erinnern uns an die wesentlichen Eigenschaften von Prozessen (bisher ohne Betrachtung von Threads): 1. Ein Prozess besitzt Ressourcen. D.h. einem Prozess ist ein (virtueller) Adressraum zugeordnet, in dem das Process Image abgelegt ist (inkl. PCB) 2. Ein Prozess ist auch eine Ausführungseinheit. D.h. ein Prozess ist ein Ausführungsweg durch ein Programm. Dem Prozess sind Ausführungszustände (ready, running,...) sowie eine Priorität zugeordnet. Bemerkung: Diese beiden Aufgaben sind vollkommen unabhängig voneinander! Deshalb können diese beiden Aufgaben auch unabhängig voneinander betrachten werden und folgende Begrifflichkeiten konkretisiert werden: Prozess: Der Prozess bezeichnet den Ressourcenbesitzer (im Wesentlichen Speicher und geöffnete Dateien) Prozess Thread: Die Ausführungseinheit wird als Thread (Faden) bezeichnet (teilweise auch „leichtgewichtiger Prozess“ – lightweight process (LWP)), d.h. die CPU führt den Code der jeweiligen Threads aus. Thread Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 22 Singlethreading vs. Multithreading Prozess Prozess Singlethreading: Multithreading: Der Prozess besitzt genau einen Thread. Zur Die Zuordnung von PCB und Adressraum zum Prozess bleibt wie bisher, Laufzeit werden die Prozessorregister vom aber: Jeder Thread bekommt zusätzlich einen eigenen Kontrollblock, den Prozess kontrolliert. Wenn der Prozess nicht im TCB (Thread Control Block), der für jeden Thread die Register, den Zustand ” running“ ist, so ist der Inhalt der Zustand und andere Thread-bezogene Informationen enthält. Register im PCB des Prozesses abgespeichert. Multi-Thread-Prozessmodell Thread Thread PCB Single-Thread-Prozessmodell Thread- Thread- Adressraum Kontroll- Kontroll- PCB User-Stack Block Block User-Stack User-Stack Adressraum Kernel-Stack Kernel- Kernel- Stack Stack Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 23 Multithreading – Verwendungsbeispiele Ein Beispiel zur Veranschaulichung: 3 Programme (Prozesse) werden gleichzeitig ausgeführt I. E-Mail Programm II. Textverarbeitungsprogramm III. Web-Server I. Das E-Mail Programm besteht aus mehreren Threads z.B.: − Verfassen einer neuen E-Mail − Empfang eingehender E-Mails II. Das Textverarbeitungsprogramm besteht aus mehreren Threads z.B.: − Texteingabe von der Tastatur − Formatierung des eingegebenen Textes − Rechtschreibprüfung im Hintergrund − automatische Speicherung im Hintergrund III. Der Web-Server besteht aus mehreren Threads z.B.: − Ein Thread überprüft die Netzwerkschnittstelle ständig auf eingehende HTTP-Requests (Dispatcher) − Sobald ein neuer Request empfangen wurde, wird für diesen Request ein neuer Thread erzeugt, der den Request verarbeitet und beantwortet (Worker) Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 24 Multithreading (Zusammenhang: Prozess – Thread) Gemeinsamer Adressraum bei Multithreading Das Multithreading Konzept bedingt, dass alle Threads eines Prozesses den gleichen Adressraum nutzen (Shared Memory) und auf die gleichen Daten und Ressourcen zugreifen. Ein Speicherschutz ist nicht nötig, denn diese Ressourcenteilung ist beabsichtigt. Die Threads arbeiten zusammen (kooperieren) und sind nicht als Konkurrenten zu betrachten (die beteiligten Threads gehören alle zu einem Programm). In der Regel startet ein Prozess mit einem Thread („main thread“), von dem aus, bei Bedarf, weitere Threads erzeugt werden. Terminiert ein Prozess, so terminieren (i.d.R.) mit ihm alle seine Threads. Vorteile: − Die Generierung eines neuen Threads in einem existierenden Prozess ist in einigen Betriebssystemen schneller als die Generierung eines neuen Prozesses. Das gleiche gilt für die Terminierung von Threads. − Der Wechsel zwischen den Threads eines Prozesses geht i.d.R. schneller als ein Prozesswechsel. − Die Kommunikation zwischen den Threads eines Prozesses verläuft häufig ohne Beteiligung des Kernels (Nutzung des gemeinsamen Speichers ist erlaubt). → Implementierung paralleler Abläufe mit Threads ist wesentlich effizienter als mit Prozessen. Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 25 Multithreading – Vorteile Der Einsatz von Multithreading in Anwendungen bringt mehrere Vorteile und verursacht gleichzeitig einige Herausforderungen für den Anwendungsentwickler. Verdeutlichung der Vorteile anhand typischer Szenarien: eine Anwendung kann komplexe Berechnungen parallel auf mehreren CPUs gleichzeitig durchführen (z.B. parallele Datenauswertung, Neuronale Netze, …) quasi-parallele Ausführung mehrerer, z.T. blockierender, Abläufe innerhalb einer Anwendung: z.B. - Während auf neue Daten von der Eingabe (z.B. Nutzereingabe oder Festplatte) gewartet wird (d.h. blockierendes E/A) können andere Teile der Anwendung mit den vorhandenen Daten Berechnungen durchführen. - Die Anwendung kann im Hintergrund gleichzeitig mit mehreren unterschiedlichen Peripheriegeräten kommunizieren (z.B. Messwerte abfragen oder Stellglieder ansteuern), wobei die Anwendung im Vordergrund weiterhin Berechnungen durchführt und Ergebnisse visualisiert. - Während die Anwendung Berechnungen durchführt, reagiert die Anwendung weiterhin auf Eingaben des Nutzers – beispielsweise bei Verwendung einer GUI. - Während die Anwendung potentiell länger dauernde blockierende Operationen durchführt, z.B. Netzwerk- Kommunikation, reagieren andere Teile der Anwendung weiterhin auf Nutzereingaben etc. Hinweis: Die Dauer einer blockierenden Operation kann von weniger als einer Millisekunde (z.B. geringe Datenmenge von SSD lesen) bis zu mehreren Minuten (Eingabe eines Nutzers oder fehlerhafte Netzwerk-Kommunikation betragen). → die Vorteile des Multithreading-Programmiermodells sollten nun klar sein! Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 26 Multithreading – ein Beispielszenario Eine Beispielanwendung mit 4 Threads: ein mögliches Ablaufszenario (Zeitdiagramm der Threads im Zustand running) Main-Thread mit Grafischem User Interface (GUI) T1 T1 (für Eingabe/Ausgabe zum Nutzer) Thread zur periodische T2 Abfrage eines Messfühlers T2 T3 Thread zur Berechnung neuer T4 Steuerwerte basierend auf aktuellen T3 Messwerten und Nutzer-Parametern Beispiel 1: T2 blockiert, weil T2 einen Beispiel 2: während der Berechnung (T3 ist sleep-Systemaufruf gestartet hat running) möchte der Nutzer neue Thread zur Ansteuerung einer externen Kontrolleinheit (Stellglied) basierend (Warten bis zur neuen Meßwert-Abfrage) Parameter eingeben auf den aktuellen Ergebnissen der T4 → während dieser Zeit können die → Wegen des Multithreading wird T3 Berechnung. anderen Threads trotzdem ihre Arbeit einfach unterbrochen und T1 wird aktiv, verrichten! d.h. das User-Interface ist immer bedienbar. Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 27 Multithreading – Herausforderungen Herausforderungen: Warum wird der Multithreading-Programmierung nachgesagt, schwierig zu sein? Weil wir gegenüber dem sequentiellen Denkmodell („alle Anweisungen eines Prozesses laufen nacheinander ab“) weitere Aspekte berücksichtigen müssen (siehe unten) Weil Fehler, die sich im Zusammenspiel der beteiligten Threads ergeben, in einer Multithreading-Anwendung schwerer zu finden sind (Reproduzierbarkeit teilweise sehr schwierig) Was gilt es bei Multithreading zu beachten (wird später noch genauer behandelt…) I. Threads teilen sich den Adressraum des zugehörigen Prozesses → d.h. falls mehrere Threads auf dieselben Daten zugreifen, müssen sogenannte Race Conditions vermieden werden (Sicherstellung der Datenkonsistenz) II. der Zugriff auf beschränkte Betriebsmittels (Geräte, Dateien) muss zeitlich koordiniert werden, um Zugriffkonflikte zu vermeiden. III. Wie wird die Zusammenarbeit der einzelnen Threads einer Anwendung so koordiniert, dass sich ein „geordneter“ Ablauf der nebenläufigen Ausführungspfade (Threads) ergibt: z.B. − Ein Thread zur Ansteuerung einer Presse darf erst ausgeführt werden, wenn der Sensor der Werkzeug-Verrieglung den entsprechenden Zustand signalisiert hat. − Der Thread zur Ausgabe der Berechnungsergebnisse darf das Ergebnis erst ausgeben, wenn die 6 parallelen Berechnungs-Threads ihre Berechnungsarbeit jeweils vollständig verrichtet haben. − … Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 28 Multithreading: Thread-Synchronisation Notwendigkeit der Thread-Synchronisation Einer der wichtigsten Aspekte bei Anwendung des Multithreading ist die Notwendigkeit zur Thread-Synchronisation. Hintergrund: Da sich alle Threads eines Prozesses denselben Adressraum und Ressourcen des zugehörigen Prozesses (z.B. geöffnete Dateien) teilen, hat eine Änderung dieser Ressourcen durch einen Threads eine Veränderung der Umgebung der anderen Threads dieses Prozesses zur Folge. Daher müssen die Aktivitäten der Threads so synchronisiert werden, dass sich die Threads gegenseitig nicht stören oder gemeinsame Datenstrukturen beschädigen. Beispiel zur Verdeutlichung: Zwei Threads (A und B) eines Prozesses möchten einer doppelt verketteten Liste jeweils ein neues Element hinzufügen. Bevor Thread A sein neues Element vollständig zur Liste hinzufügen kann, wird ihm vom Betriebssystem die CPU entzogen → die Liste ist zu diesem Zeitpunkt evtl. in einem inkonsistenten Zustand! Zu einem späteren Zeitpunkt bekommt Thread B die CPU zugewiesen und möchte auch ein Element hinzufügen, wobei die Liste immer noch in einem inkonsistenten Zustand ist, d.h. das Hinzufügen kann die Datenstruktur nun völlig unbrauchbar machen → evtl. wird dieser Fehler nicht sofort bemerkt!!! Die Verfahren zur Synchronisation von Threads sowie zum Schutz gemeinsam genutzter Datenstrukturen sind mit den Verfahren, die für Prozesses zum Einsatz kommen, weitestgehend identisch. Wir werden diese Verfahren in einem späteren Modul-Abschnitt kennenlernen: siehe Inter-Prozess-Kommunikation (IPC), Mutual Exclusion, Synchronisation Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 29 Fallbeispiel: Thread-Konzept im Linux-Betriebssystem Nutzung der POSIX Thread Library (Portable Operating System Interface): auch pthread-Library genannt Die POSIX Thread-Library für C/C++ erlaubt die Implementierung von multithreaded Anwendungen für unterschiedliche Betriebssysteme, die Multithreading und die POSIX-Schnittstelle unterstützen. Nutzung der pthread-Library: (siehe z.B. man pthread_create) int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*fn) (void *), void *arg); - *thread: In dieser Struktur werden einige Eigenschaften des neu erstellten Threads abgespeichert - *attr: In dieser Struktur können Eigenschaften für die Erzeugung des neuen Threads angegeben werden (z.B. Stackgröße, Priorität, …) – bei Angabe von NULL werden Standardwerte genutzt - fn: Funktion, die durch den neuen Thread ausgeführt wird. Das Ende dieser Funktion bedeutet automatisch das Ende des Threads. - arg: Pointer auf zusätzliche Daten, die dem neuen Thread als Funktionsargumente beim Start übergeben werden können. Die pthread-Library enthält insgesamt über 100 Funktionen zur Thread-Verwaltung (Erstellung, Beendigung, Synchronisation, Mutual Exclusion, …) Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 30 Fallbeispiel: Thread-Konzept im Linux-Betriebssystem weitere wichtige Funktionen der POSIX Thread Library : void pthread_exit(…): Beenden eines Threads (es geht aber auch anders…) int pthread_cancel(…): Beenden eines Threads durch einen anderen Thread int pthread_join(…): Warten, bis der angegebene Thread beendet ist pthread_t pthread_self(…): zur Ermittlung der eigenen Thread-ID durch einen Thread int pthread_equal(…): ermittelt, ob zwei Thread-IDs identisch sind int pthread_attr_init(…): Initialisierung/Zerstörung von Pthread Attributen, die das Verhalten int pthread_attr_destroy(…): der Threads beeinflussen (z.B. Priorität, Scheduling) Ohne explizite Angabe von Attributen gilt für alle Threads das Standardverhalten. … Sie werden in späteren Kapiteln noch weitere pthread-Funktionen kennenlernen (z.B. Mutual Exclusion) Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 31 Zusammenfassung Zusammenfassung Prozesskonzept als wesentlichen Konzept zur Programmausführung in Betriebssystemen Vorteile der Multiprogrammierung (Multitasking) und Herausforderungen Prozess-Image und PCP als wesentliche Strukturen des Betriebssystems zur Prozessverwaltung Prozessverwaltung mittels Prozess-Zustandsmodell (5- Zustandsmodell und, bei Einsatz von Swapping, 7-Zustandsmodell) Unterbrechungen geben Kontrolle an Betriebssystem → verursacht Modus-Wechsel oder Prozess-Wechsel Multithreading als konzeptionelle Erweiterung der Multiprogramming → Vorteile und wesentliche Unterschiede wesentliche Bibliotheks- und Systemaufrufe zur Prozess- bzw. Threaderzeugung unter Linux. Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 32 Literaturvorschläge A. S. Tanenbaum, H. Bos: Moderne Betriebssysteme, 4. Auflage, Pearson-Verlag, 2016 W. Stallings, Operating Systems: Internals and Principles, 9. Auflage, Pearson-Verlag, 2017 J. Cooling, Real Time Operating Systems: Book 1 - The Theory, Lindentree Associates, 2019 Sommersemester 2024 - T. Meier Informatik-II: BS 02: Prozesse und Threads 33