parallelism:deadlocks:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
parallelism:deadlocks:start [2025/01/05 09:50] – Martin Pabst | parallelism:deadlocks:start [2025/04/08 10:54] (aktuell) – [Aufgabe 1: Das Philosophenproblem] Martin Pabst | ||
---|---|---|---|
Zeile 8: | Zeile 8: | ||
Die verfahrene Situation lässt sich auf übersichtliche Weise in einem **resource allocation graph** (deutsch: **Betriebsmittelzuteilungsgraph**) veranschaulichen: | 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**), | + | Es kommt hier zu einem **Deadlock** (deutsch: **Verklemmung**), |
+ | Auch Threads benötigen oft Ressourcen (z.B. Schreibzugriff auf einen Speicherbereich, | ||
+ | - **mutual exclusion (gegenseitiger Ausschluss)**: | ||
+ | - **hold and wait (Halten und Warten)**: Hält ein Thread eine Ressource, so kann er zugleich andere beantragen. | ||
+ | - **non preemption (Ununterbrechbarkeit)**: | ||
+ | - **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: | ||
+ | {{ : | ||
</ | </ | ||
+ | <WRAP center round todo 80%> | ||
+ | **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 ===== | ||
+ | <WRAP center round info 80%> | ||
+ | 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, | ||
+ | * 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 (" | ||
+ | </ | ||
+ | |||
+ | <WRAP center round todo 80%> | ||
+ | Aufgabe 2: | ||
+ | Bearbeiten Sie Teilaufgabe III 2. im [[https:// | ||
+ | </ | ||
+ | |||
+ | ==== Aufgabe 1: Das Philosophenproblem ===== | ||
+ | <WRAP center round info 80%> | ||
+ | Das Philosophenproblem wurde vom Informatiker [[https:// | ||
+ | "Fünf Philosophen, | ||
+ | </ | ||
+ | |||
+ | <WRAP center round todo 80%> | ||
+ | * 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 '' | ||
+ | * c) Ändern Sie das Programm so ab, dass die Bedingung " | ||
+ | * d) Ändern Sie das Programm so ab, dass eine andere der Coffman-Bedingungen nicht mehr zutrifft. Erläutern Sie Ihr Vorgehen. | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | |||
+ | <script type=" | ||
+ | new Main().setup(); | ||
+ | |||
+ | class Main { | ||
+ | |||
+ | int[] colors = { 0xff0000, 0x00ff00, 0x0000ff, 0x9614d3, 0xf5e400 }; | ||
+ | |||
+ | void setup() { | ||
+ | Fork[] forks = new Fork[5]; | ||
+ | for (int i = 0; i < 5; i++) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | for (int i = 0; i < 5; i++) { | ||
+ | new Philosopher(i, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | class Philosopher extends Thread { | ||
+ | |||
+ | int color; | ||
+ | Fork forkLeft; | ||
+ | Fork forkRight; | ||
+ | |||
+ | | ||
+ | Circle circle = new Circle(600, 300, 50); | ||
+ | circle.rotate(360 / 5.0 * number, 400, 300); | ||
+ | circle.setFillColor(color); | ||
+ | this.color = color; | ||
+ | this.forkLeft = forkLeft; | ||
+ | this.forkRight = forkRight; | ||
+ | } | ||
+ | |||
+ | | ||
+ | while (true) { | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | class Fork extends Line { | ||
+ | |||
+ | | ||
+ | int color = gray; | ||
+ | |||
+ | | ||
+ | super(500, 300, 580, 300); | ||
+ | setBorderColor(color); | ||
+ | rotate(360 / 10.0 + 360 / 5.0 * number, 400, 300); | ||
+ | } | ||
+ | |||
+ | | ||
+ | if(color != gray) { | ||
+ | | ||
+ | } | ||
+ | color = newColor; | ||
+ | setBorderColor(newColor); | ||
+ | } | ||
+ | |||
+ | | ||
+ | color = gray; | ||
+ | setBorderColor(gray); | ||
+ | notify(); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | [[.philosophenloesung: |
parallelism/deadlocks/start.1736070645.txt.gz · Zuletzt geändert: 2025/01/05 09:50 von Martin Pabst