« »

Speisende Philosophen

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).

a)

Level 3: Anwenden

Geben Sie eine Sequenz von Ereignissen (wait- und signal-Aufrufe mit Parameter) an, die zu einem Deadlock führen kann.

Lösung

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)

b)

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.

Lösung

Zeilen 5 und 6 streichen

Lernziele

In dieser Aufgabe …

  • verknüpfen die Studierenden ihr theoretisches Wissen über die Speisenden Philosophen mit ihren praktischen Kenntnissen von Synchronisationsmechanismen und Verklemmungen.