SlideShare une entreprise Scribd logo
1  sur  15
Télécharger pour lire hors ligne
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
tr.im/wifotut



Monday, May 10, 2010
Agenda


                   • Aufgabe 1: Mutexe und Sempaphore
                   • 2. Aufgabe (Deadlocks)


Monday, May 10, 2010
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
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
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
Monday, May 10, 2010
Monday, May 10, 2010
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
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
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
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
Antwort


                   • Nein. Das folgt direct aus der Hold-and-
                       Wait Bedingung. (Folie 16)




Monday, May 10, 2010
Aufgabe 2b
                   • Deadlock Detection: Betrachten Sie den
                       folgenden Resourcen-Graphen. Befindet
                       sich das System in einem Deadlock?




Monday, May 10, 2010
Antwort


                   • Ja, es ist in einem Deadlock, da es einen
                       Zyklus im Graphen gibt (S -> C -> F).




Monday, May 10, 2010

Contenu connexe

En vedette

learn 4 d lifecycle and prepare a document on supply & demand
 learn 4 d lifecycle and prepare a document on supply & demand learn 4 d lifecycle and prepare a document on supply & demand
learn 4 d lifecycle and prepare a document on supply & demandvignesh palani
 
web 2.0 template, theme, layout mechanisms
web 2.0 template, theme, layout mechanisms web 2.0 template, theme, layout mechanisms
web 2.0 template, theme, layout mechanisms vignesh palani
 
Plan de negocio aguacate ptp
Plan de negocio aguacate ptpPlan de negocio aguacate ptp
Plan de negocio aguacate ptpHenry González
 

En vedette (6)

learn 4 d lifecycle and prepare a document on supply & demand
 learn 4 d lifecycle and prepare a document on supply & demand learn 4 d lifecycle and prepare a document on supply & demand
learn 4 d lifecycle and prepare a document on supply & demand
 
Hrm10e Chap15
Hrm10e Chap15Hrm10e Chap15
Hrm10e Chap15
 
web 2.0 template, theme, layout mechanisms
web 2.0 template, theme, layout mechanisms web 2.0 template, theme, layout mechanisms
web 2.0 template, theme, layout mechanisms
 
Hrm10e Chap11
Hrm10e Chap11Hrm10e Chap11
Hrm10e Chap11
 
Fern presentation
Fern presentationFern presentation
Fern presentation
 
Plan de negocio aguacate ptp
Plan de negocio aguacate ptpPlan de negocio aguacate ptp
Plan de negocio aguacate ptp
 

Tutorium 5

  • 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
  • 3. Agenda • Aufgabe 1: Mutexe und Sempaphore • 2. Aufgabe (Deadlocks) Monday, May 10, 2010
  • 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. 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. 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
  • 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. 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. 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. 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. Antwort • Nein. Das folgt direct aus der Hold-and- Wait Bedingung. (Folie 16) Monday, May 10, 2010
  • 14. Aufgabe 2b • Deadlock Detection: Betrachten Sie den folgenden Resourcen-Graphen. Befindet sich das System in einem Deadlock? Monday, May 10, 2010
  • 15. Antwort • Ja, es ist in einem Deadlock, da es einen Zyklus im Graphen gibt (S -> C -> F). Monday, May 10, 2010