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);
}
|
| |