# Prozessstruktur

## Prozessdarstellung
- Umfasst [_Zustände_](05_prozesszustaende.md) und _Struktur_ eines laufenden Programms
  - Grundlegende Komponenten, die die _Speicherrepräsentation_ eines Prozesses vorhanden sein können
    - Systemumgebung
    - Stack
    - Heap
    - BSS (Block Started by Symbol)
    - Datensegment
    - Codesegment
  - ![image_8.png](image_8.png)


    Beispiel: Terminalbefehl **- size**
    - ![image_9.png](image_9.png)

## Prozesse im Speicher
- ![image_10.png](image_10.png)
- Ablage im physischen Speicher erfolgt in nicht fortlaufender Weise durch den virtuellen Speicher
  - nicht zwangsläufig ständig im Hauptspeicher

## Erzeugung von Prozesskopien
- Systemaufruf **fork** unter Linux/Unix
  - Erzeugung einer _identischen Kopie_ eines Prozesses
  - aufrufender Prozess: _Elternprozess (Parent Process)_
  - neuer Prozess: _Kind-Prozess_ (Child Process)
    - hat gleichen _Programmcode_ und _Befehlszähler_
      - verweist auf gleiche Zeile im Programmcode
  - Speicherbereiche von Kind- und Elternprozess streng getrennt
- ![image_11.png](image_11.png)

## Erzeugung von neuen Prozessen
- Systemaufruf **exec**
  - Ersetzt bestehenden Prozess durch einen anderen
    - neuer Prozess erbt PID des aufrufenden Prozesses
  - ![image_12.png](image_12.png)
  - Soll aus einem Prozess (_bspw. Kommandozeilen-Interpreter (Shell)_) heraus ein Programm gestartet werden:
    - _fork_ -> _exec_
    - ![image_13.png](image_13.png)


## Übersicht Erzeugung/Verkettung/Vergabelung
![image_14.png](image_14.png)


## Beenden von Prozessen
Arten des Beendens:
- Normales Beenden (freiwillig, im Code definiert)
- Beenden aufgrund eines Fehlers (freiwillig, im Code definiert)
- Beenden aufgrund eines schwerwiegenden Fehlers (unfreiwillig, durch BS)
- Beenden durch einen anderen Prozess (unfreiwillig)

Unix Befehl: **kill** erstellt einen Wrapper um BS-Aufruf _kilL()_
- ist auf jedem Unix als alleinstehende Anwendung vorhanden (_/bin/kill_)

## Zeitliche Ausführung von Prozessen
- **Scheduler** ist wichtige Komponente des Betriebssystems
  - Zuständig für Zuweisung von CPU-Ressourcen an laufenden Prozessen
  - Hauptaufgabe: _Reihenfolge_ festlegen
- **Dispatcher**: Umsetzung der Scheduling-Entscheidungen
  - Implementierung der Entscheidung
    - Wechsel des _Kontrollflusses_ von einem laufenden Prozess zu einem anderen
    - Einleiten des Umschaltens durch einen _Timer-Interrupt_
      - Interrupt wird periodisch ausgelöst und startet entsprechende Softwareroutine
  - ![image_15.png](image_15.png)
  - ![image_16.png](image_16.png)

## POSIX-API
_Portable Operating System Interface_
- Standard, der von der IEE(_Institute of Electrical and Electronics Engineers_) entwickelt wurde
- Definiert Schnittstelle zwischen Anwendung und Betriebssystem
  - erleichtert Portabilität von Software zwischen verschiedenen Unix BS
  - bspw:
    - fork, wait/waitpid, sleep, getpid/getppid/setpgid, execl/execv/execve, kill, ...