Lesson 2 Prozesse und Threads Flashcards
Was ist ein Prozess?
Ein Prozess ist eine in Ausführung befindliche Instanz eines Programms mit eigenem Adressraum.
Was ist ein Thread?
Ein Thread ist ein eigenständiger Ausführungspfad innerhalb eines Prozesses, der den gleichen Adressraum wie andere Threads desselben Prozesses teilt.
Was ist der Unterschied zwischen einem Prozess und einem Thread?
Ein Prozess hat einen eigenen Adressraum, während Threads innerhalb desselben Prozesses sich einen Adressraum teilen, aber eigene Stacks haben.
Was gehört zum Ausführungszustand eines Threads?
Der Ausführungszustand eines Threads umfasst den Programmzähler, Registerwerte und einen Stack.
Was gehört zum Ausführungszustand eines Prozesses?
Der Ausführungszustand eines Prozesses umfasst Programmsegmente, Datensegmente, den Heap, den Ausführungszustand der Threads und andere Betriebsmittel wie geöffnete Dateien.
Was ist das Programmabbild (Program Image)?
Das Programmabbild enthält das Programmsegment, das den ausführbaren Code eines Programms enthält, sowie das Datensegment und Metainformationen.
Wie wird der Dateityp eines Programms bestimmt?
In Unix-Systemen wird der Dateityp anhand der Execute-Berechtigung und der ersten Bytes (Magic Number) der Datei bestimmt.
Was macht der Loader beim Start eines Programms?
Der Loader lädt das Programmabbild in den Speicher, initialisiert Speichersegmente wie Stack und Heap und startet das Programm an der definierten Startadresse.
Was ist ein Kontextwechsel (Context Switch)?
Ein Kontextwechsel bezeichnet das Unterbrechen eines laufenden Prozesses und den Wechsel zu einem anderen Prozess durch das Betriebssystem.
Was ist Quasiparallelität?
Quasiparallelität bedeutet, dass in Multitasking-Systemen mehrere Prozesse scheinbar gleichzeitig ausgeführt werden, indem die CPU schnell zwischen den Prozessen wechselt.
Was ist ein Scheduling-Verfahren?
Ein Scheduling-Verfahren bestimmt, welcher Prozess von der CPU ausgeführt wird, z.B. das Round-Robin-Verfahren oder Prioritäten-gesteuertes Scheduling.
Was ist ein Zombie-Prozess?
Ein Zombie-Prozess ist ein Prozess, der beendet wurde, aber noch in der Prozesstabelle existiert, bis der Elternprozess dessen Beendigungsstatus abfragt. wait() oder waitpid()
Wie wird ein neuer Prozess in Linux erzeugt?
Ein neuer Prozess wird in Linux mit der Funktion fork() erzeugt, die einen Klon des Elternprozesses erstellt.
Wie wird ein neuer Thread in Linux erzeugt?
Ein neuer Thread wird mit der Funktion pthread_create() erstellt, die eine Funktion als ‘main’ des Threads ausführt.
Wie wird ein Thread beendet?
Ein Thread kann entweder mit pthread_cancel() beendet werden oder seine Funktion läuft regulär aus.
Was ist der Unterschied zwischen freiwilliger und unfreiwilliger Prozessbeendigung?
Freiwillige Beendigung erfolgt durch die Rückgabe aus main() oder den Aufruf von exit(), während unfreiwillige Beendigung durch schwerwiegende Fehler oder externe Befehle erfolgt.
Was sind die möglichen Zustände (Status) eines Programms bzw. Prozesses und wie erfolgt der Wechsel zwischen ihnen?
Ein Prozess kann sich in folgenden Zuständen befinden, mit typischen Übergängen:
- New: Der Prozess wird erstellt, aber noch nicht ausgeführt.
Übergang zu → Ready (wenn der Prozess für die Ausführung vorbereitet ist). - Ready: Der Prozess ist bereit zur Ausführung, wartet aber auf die Zuweisung der CPU.
Übergang zu → Running (wenn die CPU dem Prozess zugewiesen wird). - Running: Der Prozess wird von der CPU ausgeführt.
Übergänge zu:
- Waiting (wenn der Prozess auf ein Ereignis, wie I/O, wartet).
- Ready (wenn die CPU entzogen wird, z.B. durch Preemption).
- Exited/Terminated (wenn der Prozess beendet wird).
- Waiting: Der Prozess wartet auf ein Ereignis, z.B. I/O-Operationen.
Übergang zu → Ready (wenn das Ereignis eintritt und der Prozess wieder ausgeführt werden kann). - Exited/Terminated: Der Prozess hat seine Ausführung abgeschlossen oder wurde beendet.
Kein Übergang (Prozess wird aus der Prozesstabelle entfernt).
Was ist das Round-Robin-Verfahren im Prozess-Scheduling?
Das Round-Robin-Verfahren ist ein Scheduling-Algorithmus, bei dem jeder Prozess der Ready-Warteschlange der CPU eine feste Zeiteinheit (Time Slice) zugewiesen bekommt. Wenn die Zeit abläuft, wird der Prozess in den Ready-Zustand zurückgesetzt, und der nächste Prozess erhält die CPU. Dies wiederholt sich zyklisch. Das Verfahren sorgt für eine faire Verteilung der CPU-Zeit und eignet sich gut für zeitgeteilte Systeme.
Wie kann die Beendigung eines Prozesses erfolgen?
Freiwillig:
Der Prozess läuft durch das Auslaufen der main()-Funktion ab.
Der Prozess wird durch den Aufruf der exit()-Funktion beendet.
Unfreiwillig:
Der Prozess wird aufgrund eines schweren Fehlers beendet.
Der Prozess wird durch einen Benutzer oder ein anderes Programm beendet.
Was passiert bei einem fork()-Aufruf und wie unterscheiden sich Elternprozess und Kindprozess?
Beim fork()-Aufruf wird ein neuer Prozess (Kindprozess) erstellt, der eine exakte Kopie des Elternprozesses ist. Beide Prozesse laufen unabhängig voneinander weiter.
Elternprozess: Der ursprüngliche Prozess, der fork() aufruft.
Kindprozess: Der neu erstellte Prozess, der eine Kopie des Elternprozesses ist.
Unterschiede:
Beide Prozesse haben eigene Programmzähler, Stacks und Register.
Datensegmente (Heap) werden kopiert, aber sind unabhängig.
Der Kindprozess erhält einen neuen Prozess-ID (PID).
Mit exec() kann der Kindprozess ein neues Programm laden, um ein anderes Programm auszuführen, ohne einen neuen Prozess zu erzeugen.
Was passiert mit offenen Dateien bei der Erstellung von Threads oder beim exec()-Aufruf?
Wenn ein Thread erstellt wird, bleiben alle geöffneten Dateien für alle Threads desselben Prozesses gemeinsam zugänglich.
Beim exec()-Aufruf bleiben ebenfalls alle geöffneten Dateien des Prozesses geöffnet, außer das Close-On-Exec-Flag ist für eine Datei gesetzt. In diesem Fall wird die Datei beim Aufruf von exec() automatisch geschlossen.
Welche Funktionen gibt es zur Prozessverwaltung und was bewirken sie?
- getpid(): Gibt die PID (Prozess-ID) des aufrufenden Prozesses zurück.
- getppid(): Gibt die PID des Elternprozesses zurück.
- wait(): Wartet, bis irgendein Kindprozess beendet wird.
- waitpid(): Wartet, bis der Kindprozess mit der angegebenen PID beendet wird.
- exit(): Beendet den aufrufenden Prozess.
Diese Funktionen ermöglichen die Verwaltung und Synchronisation von Prozessen in einem Betriebssystem.
Wie wird ein Thread in C erstellt?
pthread_t thread: Definiert eine Thread-Variable.
pthread_create(&thread, NULL, thread_function, arg);
pthread_create(): Startet den neuen Thread.
Das erste Argument ist ein Zeiger auf die Thread-Variable.
Das zweite Argument sind Attribute (NULL für Standardattribute).
Das dritte Argument ist die Funktion, die der Thread ausführt.
Das vierte Argument sind die Argumente, die an die Funktion übergeben werden.
// Warte auf die Beendigung des Threads
pthread_join(thread, NULL);