Inhaltsverzeichnis
- 60 min, keine Hilfsmittel
- Multiple Choice Fragen möglich
- nur behandelter Stoff
- kein Programmcode
- Fragen zu bestehendem Code
- Probleme und Lösungen bei parallelem Ressourcenzugriff kennen
- z.B. Deadlock, Seiteneffekte, Semaphore, atomare Operationen, kritischer Abschnitt
- Parallele Programme lesen und verstehen können
- z.B. Prozessse
- Interprozess-Kommunikations-Mechanismen
- z.B. Pipes, Sockets
- Konzepte der systemnahen Programmierung
- z.B. Signale
- Praktische Realisierung dieser Konzepte am Beispiel von Unix/Linux umsetzen können
- Problematischen Code hinsichtlich parallelem Zugriff erkennen
- Die Fähigkeit erwerben, eigenständig Parallelitäts- und Kommunikationskonstrukte auszuwählen und zu implementieren
Prüfungsleistung: Klausur (ohne Hilfsmittel)
- Tanenbaum, A.S. "Moderne Betriebssysteme"
- Peter Mandl: "Grundkurs Betriebssysteme"
- Vogt, C.: "Betriebssysteme"
- Glatz, E.: "Betriebssysteme"
- gleichzeitige Abarbeitung von Aufgaben
- Motivation: Zeit sparen
$\rightarrow$ eine große Aufgabe wird zur selben Zeit in mehreren kleinen erledigt - Ausnutzung der Hardware: Multicore-Prozessoren, verteilte Rechnerkerne
Fünf-Philosophen-Problem
Es können immer nur maximal zwei Philosophen gleichzeitig speisen
- Code, der Deadlocks oder Race Conditions verursachen kann, wird "kritischer Code" / kritischer Pfad genannt
- kritische Abschnitte müssen vom Programmierer definiert werden
Mehrere Prozesse starten:
- im Hintergrund ausführen:
.\anton &
.\berta &
- Prozesse anzeigen:
jobs -l
,top
,htop
,ps
Klausurrelevant
- Zweck: es wird eine exakte Kopie des Aufrufers als Kindprozess erzeugt
- Kindprozess übernimmt Code, Daten inkl. Befehlszähler, Dateideskriptoren, ...
Auswertung des Rückgabewerts
- 3 mögliche Rückgabewerte
>0
: die PID des Kindprozesses0
: es wurde eben geforkt und wir sind das Kind-1
: Fehler
#include<stdio.h>
#include<unistd.h>
int main()
{
fork();
getpid(); // MY PID
getppid(); //Parent PID
childpid=fork(); //..
printf("Hallo, ich bin ein Prozess!\n");
fflush(stdout);
return 0;
}
- Vorgehenssynchronisation zwischen mehreren Prozessen
- sperrt z.B. kritische Codebereiche
- binär: darf / darf nicht benutzen
- zählend: x Prozesse dürfen, darüber nicht
- System-V Semaphoren haben drei Funktionen:
semget()
: Erzeugt eine neue Semaphore oder öffnet eine vorhandenesemctl()
: manipuliert Semaphorenmengensemop()
: führt eine Reihe Operationen auf einem Set Semaphoren aus
- zwei Operationen:
- P-Operation: "Passieren": regelt Betreten kritischen Codes
- V-Operation: "Verlassen": regelt Verlassen kritischen Codes
- Programmierung: Semaphoren müssen deklariert, initialisiert und dann verwendet werden
- Motivation: Verhinderung von
- gleichzeitigen Schreibzugriffen
- Verhungern von Prozessen
- Deadlocks
- Rohre zwischen Prozessen, in denen Nachrichten transportiert werden können
- nur in eine Richtung
- Pipes können nur zwischen Prozessen mit gemeinsamen Vorfahren eingerichtet werden
- Ablauf:
- Vaterprozess erzeugt Pipe
- Vaterprozess erzeugt Sohnprozess mit
fork()
- Sohnprozess erbt Pipe
- Programmierung:
- Inkludierung von
sys/unistd.h
int pipe(int fd[2])
fd[0]
zum Lesenfd[1]
zum Schreiben
- Lese-Operation:
read()
- wurden alle Leseseiten einer Pipe bereits gelesen, liefert
read()
EOF
- wurden alle Leseseiten einer Pipe bereits gelesen, liefert
- Schreib-Operation:
write()
- Schließ-Operation:
close()
- Inkludierung von
- IPC auf lokalem Rechner (Unix-Domäne) oder über das Internet (Internet-Domäne)
- Ein Port ist eine Spezifikation zur Addressierung eines Prozesses auf einem Host