Lernziele
In dieser Aufgabe …
- verknüpfen die Studierenden ihr theoretisches Wissen über die Speisenden Philosophen mit ihren praktischen Kenntnissen von Synchronisationsmechanismen und Verklemmungen.
Das Programmlisting (in Pseudocode) zeigt eine inkorrekte Lösung für das Problem der Dining
Philosopers (Speisenden Philosophen). Es gibt fünf Philosophen i (i = 0, …, 4) und ebenso fünf
Semaphore fork[i] sowie ein Semaphor mutex, die alle mit dem Wert 1 initialisiert sind.
Hinweis: Der Operator % steht für die Modulo-Funktion.
while (true){
think();
wait(mutex);
wait(fork[i]);
signal(mutex);
wait(mutex);
wait(fork[(i+1) % 5]);
signal(mutex);
eat();
signal(fork[i]);
signal(fork[(i + 1) % 5]);
}Diese Aufgabe war Teil der Klausur im Sommersemester 2025 (Ersttermin).
Level 3: Anwenden
Geben Sie eine Sequenz von Ereignissen (wait- und signal-Aufrufe mit Parameter) an, die zu einem Deadlock führen kann.
Zunächst nimmt jeder Philosoph eine Gabel auf:
wait(mutex), wait(fork[0]), signal(mutex)
wait(mutex), wait(fork[1]), signal(mutex)
wait(mutex), wait(fork[2]), signal(mutex)
wait(mutex), wait(fork[3]), signal(mutex)
wait(mutex), wait(fork[4]), signal(mutex)
Anschließend versucht jeder Philosoph, die zweite Gabel aufzuheben. Philosoph 0 schafft es am mutex vorbei, aber wartet auf fork[1].
wait(mutex), wait(fork[1])
Alle anderen Philosophen hängen am mutex: wait(mutex)
Level 3: Anwenden
Wie würden Sie den Code ändern, damit kein Deadlock mehr auftreten kann? Geben Sie jeweils Zeilennummer und Änderung in der Zeile an.
Zeilen 5 und 6 streichen
In dieser Aufgabe …