Prozesszustände  | 
       
  | 
  |  | 
     
     
       user mode  | 
       Prozess arbeitet nur auf eigenen Variablen
		    und Funktionen
  | 
  |  | 
     
     
       supervisor mode  | 
       Prozess arbeitet auf Betriebssystem-Variablen und
mit BS-Funktionen
  | 
  |  | 
     
     
       system calls  | 
       Systemaufrufe: Übergang: user mode ==> supervisor mode
  | 
  |  | 
     
     
       Prozessverwaltung  | 
       
- E/A-Synchronisation
 - Scheduler: Prozessor-Zuteilung
 - Memory Management: Virtuelle Addressierung
 - Interprozess-Kommunikation
  
  | 
  |  | 
     
     
       Prozessverwaltung  | 
       Systemaufrufe
  | 
        | 
        | 
  |  | 
     
     
       Signale  | 
       Systemaufrufe
  | 
        | 
        | 
  |  | 
     
     
       Prozess Kommunikation  | 
       und Zugriffe auf externe Daten
  | 
        | 
       
- pipe
 - mknod
 - open
 - read
 - write
  
  | 
  |  | 
     
     
       Prozess-Daten  | 
       im Betriebssystem
         | 
     
     
       pid  | 
       process id
         | 
     
     
       ppid  | 
       parent process id
         | 
     
     
       pgid  | 
       process group id
         | 
     
     
       Deskriptoren  | 
       für offene E/A-Kanäle
         | 
     
     
       env  | 
       Umgebungsvariablen
  | 
  |  | 
     
     
       Virtuelle Addressierung  | 
       
Jeder Prozess besitzt seinen eigenen Adressraum
  | 
  |  | 
     
     
       Adressumsetzung  | 
       Abbildung: Virtuelle Adresse auf reale Adresse
  | 
  |  | 
     
     
        | 
       Hardware-Unterstützung erforderlich: MMU
  | 
  |  | 
     
     
       ?
    | 
       
Vorteile der virtuellen Adressierung?
  | 
  |  | 
     
     
       Prozess- Erzeugung  | 
       durch Duplizieren eines Prozesses
  | 
  |  | 
     
     
       fork  | 
       gabeln
  | 
        | 
        Verdoppeln eines Prozesses
  | 
        | 
       
Funktion ohne Parameter 
Funktion mit zwei Rücksprüngen
  | 
  |  | 
     
     
       Resultat  | 
       
 0 für den Kindprozess 
 der neue pid des Kindprozesses für den Elternprozess
  | 
  |  | 
     
     
       Verdoppeln  | 
       
process1(...) { ... } 
process2(...) { ... } 
  
int main(...) { 
  switch ( fork() ) { 
  
  case  0: process1(); 
           break; 
  
  case -1: exit(1); 
  
  default: process2(); 
           break; 
  } 
} 
 
  | 
  |  | 
     
     
       exit  | 
       Beenden eines Prozesses
  | 
        | 
       
in der shell: exit oder exit rc
  | 
  |  | 
     
     
       exec  | 
       Überlagern eines Prozesses
  | 
  |  | 
     
     
       Wirkung  | 
       
- Textsegment wird ausgewechselt
 - Benutzer-Datensegment wird neu initialisiert
 - System-Datensegment bleibt erhalten
 - main im neuen Textsegment wird aufgerufen
  
  | 
  |  | 
     
     
       wait  | 
       Synchronisation von Eltern- und Kindprozessen
  | 
  |  | 
     
     
       Wirkung  | 
       
- der runfende Prozess wartet auf die Beendigung eines Kindprozesses
 - Resultat: Der pid des beendeten Kindprozesses und der return code
  
  | 
  |  | 
     
     
       Programm-Start  | 
       aus der shell
  | 
        | 
       
- der shell-Prozess dupliziert sich
 - der Kindprozess führt exec aus
 - der Elternprozess führt wait mit pid des Kindprozesses aus
  
  | 
  |  | 
     
     
       system.c  | 
        C-Bibliotheksroutine 
vereinfachte Version ohne Signalbehandlung
  | 
        | 
        | 
        | 
       
#include        <sys/types.h> 
#include        <sys/wait.h> 
#include        <errno.h> 
#include        <unistd.h> 
  
int 
system(const char *cmdstring) 
{ 
  pid_t pid; 
  int   status; 
  
  pid = fork();          
  
  if (pid < 0) {         
    status = -1; 
  
  } 
  else if (pid == 0) {   
  
    execl("/bin/sh", "sh", 
          "-c", cmdstring, (char *) 0); 
  
    status = 127;        
  
  } 
  else {                 
  
    while (wait(&status) != pid); 
  
  } 
  
  return(status); 
} 
 
  | 
  |  |