Tutorium 5

457 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
457
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Tutorium 5

  1. 1. Tutorium #5 10.5. bzw. 17.5. c.deckert@me.com Bei dieser Ausarbeitung handelt es sich um keine offizielle Lösung des Lehrstuhls. Dies sind nur Lösungsansätze, welche keinen Anspruch auf Korrektheit oder Vollständigkeit erheben. Monday, May 10, 2010
  2. 2. tr.im/wifotut Monday, May 10, 2010
  3. 3. Agenda • Aufgabe 1: Mutexe und Sempaphore • 2. Aufgabe (Deadlocks) Monday, May 10, 2010
  4. 4. Aufgabe 1 • Java bot ursprünglich nur folgende Möglichkeiten zur Synchronisation an: • Das Attribut synchronized für Methoden. Damit wird im Methodenrumpf gegenseitiger Ausschluss realisiert. • Die Monitor-Methoden wait() und notify(). Diese Methoden können für jedes Java-Objekt aufgerufen werden. Die Methode notify() hebt eine durch wait() hervorgerufene Blockierung im Objekt auf. Monday, May 10, 2010
  5. 5. public class Semaphore { int s; public Semaphore(int initial) { s = initial; } synchronized public void P() throws InterruptedException { s--; if (s < 0) wait(); } synchronized public void V() { s++; if (s <= 0) notify(); } Monday, May 10, 2010
  6. 6. Aufgabe 1b • Nehmen wir an, dass wir ein Betriebssystem haben, das nur Mutexe unterstützt, wir aber trotzdem Semaphore verwenden möchten. Überlegen Sie sich, wie Sie einen Semaphor mit Mutexen implementieren können. Diese Lösung sollte kein busy waiting verwenden. Da das System nur Mutexe unterstützt, dürfen auch keine Interrupts abgeschaltet werden, etc. Schreiben Sie Ihre Lösung in Pseudo-code auf. Monday, May 10, 2010
  7. 7. Monday, May 10, 2010
  8. 8. Monday, May 10, 2010
  9. 9. class Semaphore { Mutex wait = new Mutex(0); int value; public Semaphore(int initalValue) { value = initalValue; } public void Down() public void Up() { { if (value == 0) if (wait.ProcessesWaiting()) { { wait.Lock(); wait.Unlock(); } } else else { { value = value--; value = value++; } } } } } Monday, May 10, 2010
  10. 10. 2 Probleme: • Änderungen von value sind nicht geschützt, wenn mehrer Prozesse Up() bzw. Down() gleichzeitig ausführen. Dieses Problem lässt sich mit einem weiteren Mutex protect lösen, so dass Up() und Down() mutually exclusive sind. • Wie sieht die Methode „ProcessesWaiting()“ aus? Mit anderen Worten: Wie finden wir heraus, ob auf wait gerade Prozesse warten? Eine Möglichkeit ist, die Anzahl der wartenden Prozesse in einer Variable count zu speichern. Dabei muss natürlich auch count geschützt werden. Monday, May 10, 2010
  11. 11. class Semaphore { Mutex wait = new Mutex(0); Mutex protect = new Mutex(1); int value; int count = 0; public Semaphore(int initalValue) { value = initalValue; } public void Down() public void Up() { { protect.Lock(); protect.Lock(); if (value == 0) { if (count > 0) count = count++; { protect.Unlock(); count = count--; wait.Lock(); wait.Unlock(); } protect.Unlock(); else } { else value = value--; { protect.Unlock(); value = value++; } protect.Unlock(); } } } } Monday, May 10, 2010
  12. 12. Aufgabe 2 • Ist es möglich einen Deadlock zu geraten, an dem nur ein Prozess beteiligt ist? Begründen Sie Ihre Antwort. Monday, May 10, 2010
  13. 13. Antwort • Nein. Das folgt direct aus der Hold-and- Wait Bedingung. (Folie 16) Monday, May 10, 2010
  14. 14. Aufgabe 2b • Deadlock Detection: Betrachten Sie den folgenden Resourcen-Graphen. Befindet sich das System in einem Deadlock? Monday, May 10, 2010
  15. 15. Antwort • Ja, es ist in einem Deadlock, da es einen Zyklus im Graphen gibt (S -> C -> F). Monday, May 10, 2010

×