Inhaltsverzeichnis
Deadlocks (Verklemmungen)
Die Zwillinge Klaus und Lena haben zusammen ein Rotorspielzeug geschenkt bekommen. Max schnappt sich sofort den Startgriff, Lena den Rotor. Natürlich hätte Lena jetzt gerne den Startgriff und Max den Rotor, aber beide geben ihr Teil nicht her.
Die verfahrene Situation lässt sich auf übersichtliche Weise in einem resource allocation graph (deutsch: Betriebsmittelzuteilungsgraph) veranschaulichen:
Es kommt hier zu einem Deadlock (deutsch: Verklemmung), bei dem keines der Kinder die angestrebte Tätigkeit ausführen kann, da ihm jeweils eine Ressource ("Betriebsmittel") fehlt.
Auch Threads benötigen oft Ressourcen (z.B. Schreibzugriff auf einen Speicherbereich, USB-Schnittstelle des Rechners, Drucker, Netzwerkschnittstelle) zu ihrer Ausführung. Sie beantragen den Zugriff darauf beim Betriebssystem und geben ihn später wieder zurück. Zu einem Deadlock kommt es dann und nur dann, wenn die vier Coffman-Bedingungen erfüllt sind:
- mutual exclusion (gegenseitiger Ausschluss): Auf eine gegebene Ressource kann nur jeweils ein einziger Prozess Zugriff haben.
- hold and wait (Halten und Warten): Hält ein Thread eine Ressource, so kann er zugleich andere beantragen.
- non preemption (Ununterbrechbarkeit): Der Zugriff eines Threads auf eine Ressource kann nicht unterbrochen werden, d.h. dem Thread kann die Ressource nicht von außen entzogen werden (z.B. durch das Betriebssystem)
- cyclic waiting (zyklisches Warten): Im resource allocation graph gibt es mindestens einen Zyklus.
Hier noch ein Beispiel für einen resource allocation graph mit deadlock:
Aufgabe 1:
- a) Stellen Sie dar, inwiefern die vier Coffman-Bedingungen im obigen Beispiel von Klaus und Lena erfüllt sind.
- b) Der Vater sagt zu Max: "Du bist der ältere, also gibst Du Lena jetzt den Startgriff, damit sie 5 Minuten lang mit dem Rotor spielen kann. Danach bist du 5 Minuten dran."
Welche der Coffman-Bedingungen hat der Vater damit außer Kraft gesetzt?
Strategien, um Deadlocks zu verhindern
Da Deadlocks nur dann auftreten können, wenn alle vier Coffman-Bedingungen erfüllt sind, reicht es, eine davon außer Kraft zu setzen, um Deadlocks sicher zu verhindern. Hier ein paar mögliche Strategien dazu:
- hold and wait kann ausgeschlossen werden, wenn jeder Thread zu Beginn alle Ressourcen anfordern muss, die er benötigt, und ihm das Betriebssystem nur entweder alle Ressourcen auf einmal zuspricht (und den Thread dann startet) oder keine Ressourcen zuspricht und den Thread so lange warten lässt, bis alle benötigten Ressourcen zur Verfügung stehen. Natürlich schränkt das die Möglichkeit zur nebenläufigen Ausführung möglichst vieler Threads etwas ein.
- cyclic waiting kann ausgeschlossen werden, indem die Ressourcen durchnummeriert werden und nur in der Reihenfolge dieser Nummerierung angefordert werden dürfen.
- mutual exclusion kann ausgeschlossen werden, wenn ein Betriebsmittel, das eigentlich nur ein Thread gleichzeitig benutzen kann (z.B. ein Drucker) mit einer Warteschlange versehen wird, in die die Threads ihre Aufträge an dieses Betriebsmittel ablegen können und ein eigener Thread die Warteschlange der Reihen nach abarbeitet.
- Der Ausschluss von non-preemption ist schwer machbar, kann aber beispielsweise beim Arbeitsspeicher umgesetzt werden, indem lange nicht verwendete Speicherbereiche des RAM in einen Massenspeicher (z.B. SSD) ausgelagert und nur bei Bedarf wieder zurückgeholt werden ("swapping").
Aufgabe 2: Bearbeiten Sie Teilaufgabe III 2. im Abitur 2016.
Aufgabe 1: Das Philosophenproblem
Das Philosophenproblem wurde vom Informatiker Edsger W. Dijkstra formuliert um die Problematik der Nebenläufigkeit/Verklemmung zu illustrieren.
"Fünf Philosophen, nummeriert von eins bis fünf, leben in einem Haus, in dem der Tisch für sie gedeckt ist, wobei jeder Philosoph seinen eigenen Platz am Tisch hat. Ihr einziges Problem – neben dem der Philosophie – ist, dass es sich bei dem servierten Gericht um eine sehr schwierige Sorte Spaghetti handelt, die mit zwei Gabeln gegessen werden muss. Zwischen den Tellern befindet sich jeweils eine Gabel, sodass dies für einen einzelnen Philosophen kein Problem darstellt. Allerdings können zwei Nachbarn nicht gleichzeitig essen." (Quelle: Wikipedia-Artikel)
- a) Erläutern Sie, inwiefern die Coffman-Bedingungen erfüllt sind.
- b) Starten Sie das untenstehende Programm und untersuchen Sie, ob es zu einer Verklemmung kommt. Welche Rolle spielen die
sleep
-Anweisungen? - c) Ändern Sie das Programm so ab, dass die Bedingung "cyclic waiting" nicht mehr zutrifft und verifizieren Sie, dass damit die Verklemmung nicht mehr auftritt.
- d) Ändern Sie das Programm so ab, dass eine andere der Coffman-Bedingungen nicht mehr zutrifft. Erläutern Sie Ihr Vorgehen.