SlideShare uma empresa Scribd logo
1 de 19
Baixar para ler offline
Copyright(C) by Foxit Software Company,2005-2007



                                                                        Interprozess-Kommunikation                                                              Race conditions an einem Beispiel
                                            Durch Nutzung gemeinsamen Speichers (egal, ob Hauptspeicher oder Plattenplatz) können             In einer Warteschlange des BS seien mehrere Prozesse eingehängt und warten auf eine
                                            Prozesse miteinander kommunizieren, indem sie Daten austauschen.                                  Bearbeitung:

                                            Problem: hierbei entstehen zeitkritische Abläufe (race conditions)                                Für das Einhängen des Prozesses A gilt:        Für das Entfernen von B gilt:
                                                                                                                                                    • Lese den Anker: PointToB                    • Lese den Anker: PointToB
                                            Def.: Eine Situation, in der mindestens zwei Prozesse auf gemeinsam genutzte Daten zugreifen,           • Setze den NextZeiger: Point ToB             • Lese den NextZeiger: PointToC
                                            und die Ergebnisse von der zeitlichen Reihenfolge des Zugriffs abhängen, nennt man                      • Setze den Anker: Point ToA                  • Setze den Anker: PointToC
                                            zeitkritischen Ablauf (race condition)
                                                                                                                                              Was passiert, wenn die Operationen nicht in einem Stück durchgeführt werden ?
                                            Beispiel: gespoolte Druckausgabe
                                                                                          Spooler                1
                                            Idee: in einer Tabelle stehen alle zu                                2 test.c out = 2
Edited by Foxit Reader




                                            druckenden Dateien, Variable out zeigt                               3 note.xls in = 5
For Evaluation Only.




                                            auf die nächste zu druckende Datei,                                  4 dipl.doc
                                            Variable in zeigt auf nächsten
                                                                                                                 5 kase.xls
                                            freien Tabellenplatz. Zwei Prozesse           Prozeß A
                                            A und B wollen nahezu gleichzeitig                                   6 folie.ppp
                                            etwas ausdrucken.                                                    7
                                            Katastrophe: BS wechselt von A nach B         Prozeß B               8
                                            VOR dem vollständigen Ende des Zugriffs !!!
                                                     Prof. W. Burkard                                                            100              Prof. W. Burkard                                                              101




                                    Stichworte                                                                                               Stichworte

                                                   Computer arbeiten deterministisch. Heißt Eingabe gleich Ausgabe (5+5=10
                                                   egal ob es 10h morgens oder 8h abends ist // kalt oder warm ist).



                                    Notizen                                                                                                  Notizen




                                                                                                                                       100                                                                                            101
Copyright(C) by Foxit Software Company,2005-2007



                                                                               zeitkritische Bereiche                                                                              aktives Warten
                                                   Def: Derjenige Teil eines Prozesses, in dem der Zugriff auf gemeinsam benutzten Speicher
                                                      stattfindet, wird als (zeit-)kritischer Bereich des Prozesses bezeichnet.                                     = (schlechte) Lösung des Problems des wechselseitigen Ausschlusses

                                                   Idee: Probleme mit zeitkritischen Abläufen lassen sich vermeiden, wenn sich niemals zwei                Ansatz 1: Sperren aller Unterbrechungen beim Eintritt in einen kritischen Bereich
                                                       oder mehr Prozesse gleichzeitig in einem kritischen Bereich befinden.                                         - sinnvolle Lösung für diverse Prozesse des Betriebssystems
                                                                          ==> wechselseitiger Ausschluß <==                                                          - gefährliche Lösung, bei Nutzung durch Anwenderprozesse


                                                   Für ein funktionierendes System fordern wir also:                                                       Ansatz 2: Eine globale Sperrvariable kann die Werte 0 oder 1 annehmen
                                                                                                                                                                     Nur wenn Sperrvariable=0 geht ein Prozeß in den kritischen Bereich
                                                                                                                                                                     und setzt als erstes die Variable auf 1.
Edited by Foxit Reader




                                                   1. nur ein Prozeß darf sich zu einem Zeitpunkt in einem kritischen Bereich befinden
                                                                                                                                                                     Problem: siehe Beispiel “gespoolte Druckausgabe”
For Evaluation Only.




                                                   2. Nur durch das Eintreten in einen kritischen Bereich blockiert ein Prozeß andere Prozesse
                                                                                                                                                           Ansatz 3: striktes Alternieren durch aktives Warten: Jeder Prozeß hat einen
                                                   3. Kein Prozeß soll unendlich lange warten müssen, bis er in seinen kritischen Bereich darf                              Kennwert W und wartet darauf, daß die Schaltvariable SV diesen Wert
                                                                                                                                                                            annimmt. Nach Beenden des kritischen Bereiches wird SV weitergeschaltet,
                                                   4. kein Prozeß darf Annahmen über Prozessoranzahl oder Ausführungsgeschwindigkeit                              also: warten, bis SV == W
                                                       seiner selbst oder anderer Prozesse machen                                                                           Eintreten in krit. Bereich....Austreten aus kritischem Bereich
                                                       Prof. W. Burkard                                                                   102              Prof. W. Burkard
                                                                                                                                                                            SV weiterschalten                                                   103




                                    Stichworte                                                                                                         Stichworte
                                                                                                                                                          Gute Idee, funktioniert aber in der Realität nicht!




                                    Notizen                                                                                                            Notizen




                                                                                                                                                 102                                                                                                   103
Erster Versuch zur Prozess-Synchronisation                                                                     Zweiter Versuch zur Prozess-Synchronisation
    Die einfachste Idee zur Erreichung eines gegenseitigen Ausschlusses besteht darin,                                Wir wollen beide Prozesse in beliebiger Reihenfolge synchronisieren
    einen Prozess beim Eintreten in einen kritischen Abschnitt so lange                                               Ein Prozess achte also nur darauf, dass der andere nicht drin ist.
    warten zu lassen, bis der Abschnitt wieder frei ist.

    Für zwei parallel ablaufende Prozesse würde das wie folgt aussehen:




  Die gemeinsame Variable dran sei mit 1 initialisiert, so erreichen wir den gegenseitigen Ausschluss.               Die Variablen drin1 und drin2 seien beide mit false initialisiert.

  Wo ist das Problem ?                                                                                               Wo ist jetzt das Problem ?
      Beide Prozesse können nur abwechselnd in den kritischen Bereich !                                                  Jetzt gehen eventuell BEIDE gleichzeitig in den kritischen Abschnitt ! Warum ?
         Ein Prozess hindert sich eventuell selbst daran, ein zweites Mal in den krit. Bereich zu gehen!!!               Hilft es die beiden Zeilen des ersten grauen Bereiches zu vertauschen?
       




    Prof. W. Burkard                                                                                  104              Prof. W. Burkard                                                                   105




Stichworte                                                                                                         Stichworte




Notizen                                                                                                            Notizen




                                                                                                             104                                                                                                105
Copyright(C) by Foxit Software Company,2005-2007



                                                       aktives Warten: Petersons Lösung (von 1981)                                                                               Petersons Lösung in Java / C / C++
                                                   q     Die Variablen Interesse1 und Interesse2 sowie dran sind globale, gemeinsame Variablen                       #define FALSE O
                                                   q     Die Variablen Interesse1 und Interesse2 sind beide mit false initialisiert.                                 #define TRUE 1
                                                                                                                                                                     #define N     2                                            /* Anzahl der Prozesse                       */

                                                                                                                                                                     int dran;                                                  /* Wer ist an der Reihe ?            */
                                                                                                                                                                     int interessiert [N];                                      /* Alle Werte sind anfangs O (FALSE) */


                                                                                                                                                                     void enter_region (int prozess)                            /* prozess: wer tritt ein (O oder 1)   */
                                                                                                                                                                     {
                                                                                                                                                                       int anderer;                                             /* Nummer des anderen Prozesses */

                                                                                                                                                                         anderer = 1 - prozess;                                 /* Konkurrent des Prozesses       */
Edited by Foxit Reader




                                                                                                                                                                         interessiert[process] = TRUE;                         /* ich zeige mein Interesse         */
                                                                                                                                                                         dran = prozess;                                         /* setze Marke: ich bin dran!    */
For Evaluation Only.




                                                                                                                                                                         while ( dran == prozess                               /* Wer dran zuletzt setzt, muss warten, */
                                                                                                                                                                                         && interessiert[anderer] == TRUE)     /* wenn auch der andere rein will */
                                                                                                                                                                                 ;                                              /* leere Anweisung, NoOP          */
                                                                                                                                                                     }
                                                   Wie kommt ein Prozess voran, wenn der andere kein Interesse bekundet hat ?
                                                                                                                                                                     void leave_region (int prozess)                            /* prozess, der den Bereich verläßt */
                                                   Wie ist der Ablauf, wenn beide nahezu zeitgleich (im ersten grauen Bereich) Interesse bekunden ?                  {
                                                                                                                                                                       interessiert[prozess] = FALSE;                  /* gibt das Verlassen des krit. Bereiches bekannt */
                                                       Prof. W. Burkard                                                                               106
                                                                                                                                                                     } Prof. W. Burkard                                                                                107




                                    Stichworte                                                                                                                     Stichworte

                                                                                                                                                                  Wenn ein Prozess in diese Schleife kommt, bleibt er quot;ewigquot; in dieser Schleife.
                                                                                                                                                                  Er kommt erst weiter sobald die Bedingung nicht mehr erfüllt ist und dies geschieht
                                                                                                                                                                  erst dann wenn der Scheduler erneut auf den Prozess zugreift!
                                                                                                                                                                  => Aktives Warten bremst den Rechner aus, in der Zeit in der Gewartet wird,
                                                                                                                                                                  wird zudem noch unnötig Strom verbraucht.
                                    Notizen                                                                                                                        Notizen




                                                                                                                                                            106                                                                                                               107
Copyright(C) by Foxit Software Company,2005-2007



                                                                        Sleep und Wakeup                                                                 das Erzeuger-Verbraucher-Problem
                                                   wichtige Erkenntnis:                                                                              ... oder: das Ärgernis mit den verlorenen Weckrufen
                                                   Durch aktives Warten wird Prozessorzeit verschwendet!
                                                   (Prozesse prüfen aktiv in einer Schleife das Eintreffen einer Änderung)                           Zwei Prozesse benutzen einen Ringpuffer, der eine schreibt
                                                                                                                                                        Daten hinein, der andere ließt diese aus.
                                                   Dazu kommt das Prioritäteninversionsproblem:
                                                      Ein höher priorisierter Prozeß H wartet unendlich lang auf das Verlassen des krit.
                                                      Bereiches eines niedriger priorisierten Prozesses L, da der Scheduler den                      Ist der Puffer voll und der Schreiber hat etwas zum eintragen,     N Elemente
                                                      rechenbereiten Prozeß H stets vorzieht => L kommt nicht mehr zum Zug und damit                      legt er sich schlafen und läßt sich vom Verbraucher            maximal
                                                      nicht aus dem kritischen Bereich                                                                    wecken, wenn jener ein Element entfernt hat. (Denn dann
                                                                                                                                                          ist wieder Platz im Ring)                                       im Ring
Edited by Foxit Reader




                                                   Neue Idee:             wartende Prozesse “gehen schlafen” (werden in den Zustand
For Evaluation Only.




                                                          “blockiert” gesetzt) und lassen sich nach Verbesserung der Lage wieder wecken:             Ist der Puffer leer und der Leser soll etwas lesen, legt er sich
                                                                                                                                                          schlafen und läßt sich vom Schreiber wecken, wenn der
                                                                                                                                                          etwas eingetragen hat.
                                                          Aufrufender Prozeß geht schlafen      ==> Funktion sleep()
                                                                                                                     n
                                                          Prozeß mit der Nr. <n> soll aufwachen ==> Funktion wakeup(xyz)
                                                                                                                                                     PROBLEM: Eine gemeinsam benutzte Variable ANZAHL nennt die Anzahl der im Puffer
                                                                                                                                                     befindlichen Elemente. Der Zugriff auf diese Variable ist kritisch !!
                                                   Prof. W. Burkard                                                                  108             Prof. W. Burkard                                                           109




                                    Stichworte                                                                                                   Stichworte




                                    Notizen                                                                                                      Notizen




                                                                                                                                           108                                                                                        109
das Erzeuger-Verbraucher-Problem                                                                                 das Leser-Schreiber-Problem
                       Erzeuger-Algorithmus:                                                      q  auf eine Datei dürfen gleichzeitig mehrere Prozesse lesend zugreifen, ABER:
                       1. Nimm nächstes Element                                                   q  wenn ein Prozeß schreibend zugreift, darf kein anderer Prozeß (lesend oder schreibend)
                                                                                                     agieren.
                       2. Lies die Variable Anzahl
 Die beiden                                                                                       Lösung 1: (Bevorzugt die Leser-Prozesse)
                       3. Wenn Puffer voll, dann “Schlafen-gehen”
 “gefährlichen”                                                                                   Schreiber: Sperrt Datei, schreibt Daten, gibt Datei frei
                       4. Element in den Puffer eintragen
 Stellen, hier                                                                                    Leser: (Nur der erste Leser!! :) sperrt die Datei
                       5. Anzahl um 1 erhöhen
 darf der                                                                                                ließt die Daten
                       6. Wenn die Anzahl jetzt 1 lautet, “Leser-wecken”
 Scheduler nicht                                                                                         (Nur der letzte Leser!! :) gibt Datei wieder frei
 den Prozeß
                       Leser-Algorithmus:
 wechseln, sonst       1. Lies die Variable Anzahl
                                                                                                  Lösung 2: (Bevorzugt Schreiber-Prozesse)
 bricht die            2. Wenn Puffer leer, “Schlafen-gehen”
                                                                                                  grundlegendes Konzept:
 Synchronisation       3. Element lesen
                                                                                                      Prozesse mit Lesewunsch überprüfen die Existenz von schreibenden bzw.
                       4. Anzahl um 1 erniedrigen                                                     schreibwilligen Prozessen und blockieren, bis die Schlange der Schreiber leer ist.
                       5. Wenn Puffer jetzt einen freien Platz hat, “Erzeuger-wecken”


    Prof. W. Burkard                                                                110               Prof. W. Burkard                                                                     111




Stichworte                                                                                      Stichworte




Notizen                                                                                         Notizen




                                                                                          110                                                                                                    111
Copyright(C) by Foxit Software Company,2005-2007



                                                                             Semaphore: die Idee                                                                        Semaphore: die Implementierung
                                                   Idee des holl. Mathematikers Dijkstra (1965):
                                                   Man zähle Wecksignale mit Hilfe einer Integer-Variablen  Name: Semaphore




                                                                                                           
                                                   (Semaphore sind Signalmasten in der Seefahrt und bei Eisenbahnnetzen)
                                                   Def.: Eine Semaphore s ist eine Integervariable, die (aus Benutzersicht!) nicht negativ
                                                      werden kann und auf der nur zwei Operationen DOWN (auch P genannt) und UP (auch
                                                      V genannt) definiert sind:
                                                    DOWN(s) = P(s) = Reduziere s um 1, wenn s > 0, (sonst geht rufender Prozeß schlafen)
                                                    UP(s)      = V(s) = Erhöhe s um 1 und wecke einen der schlafenden Threads (falls da)
Edited by Foxit Reader




                                                                       Struktur eines
                                                                       Semaphors
For Evaluation Only.




                                                                                        Zähler
                                                   WICHTIG:
                                                   q Das Überprüfen auf 0,
                                                   q das Verändern des Wertes von s                       Zeiger auf wartende Threads/Tasks
                                                   q und das Schlafengehen bzw. „Task wecken“ sind
                                                   eine untrennbare, atomare Aktion des Betriebssystems!!
                                                    Prof. W. Burkard                                                                 112             Prof. W. Burkard                                    113




                                    Stichworte                                                                                                   Stichworte




                                    Notizen                                                                                                      Notizen




                                                                                                                                           112                                                                 113
Erzeuger-Verbraucher-Problem
Copyright(C) by Foxit Software Company,2005-2007



                                                   wechselseitiger Ausschluß mit Semaphoren                                                                                              gelöst mit Semaphoren
                                                                                                                                                                Zwei Semaphore „frei“ und „belegt“ werden benutzt um zwischen den Prozessen die
                                                           Zwei Prozesse 1 und 2 konkurrieren um den Eintritt in einen kritischen Bereich.                      Zustände des Puffers zu signalisieren. Der Semaphor „mutex“ dient nur dazu, den Zugriff auf
                                                           Semaphor s ist initial auf 1 gesetzt                                                                 den Puffer exklusiv zu machen. Der Puffer fasst N Elemente. Initial gilt:
                                                                                                                                                                Semaphor frei = N, belegt = 0, mutex = 1;
                                                           Prozeß 1:
                                                           ... beliebige Aktionen ...
                                                           down(s)                      <= Eintritt in kritischen Bereich                                       Erzeuger-Prozess:                                  Verbraucher-Prozess:
                                                           ...kritischer Bereich ...
                                                           up(s)                        <= Austritt aus dem kritischen Bereich                                  LOOP                                               LOOP
                                                                                                                                                     P = DOWN     produziere(einElement);                            P(belegt);
Edited by Foxit Reader




                                                           Prozeß 2:                                                                                 V = UP       P(frei);                                           P(mutex);
For Evaluation Only.




                                                           ... beliebige Aktionen ...                                                                             P(mutex);                                          holeAusPuffer(einElement);
                                                                                                                                                                  fuelleInPuffer(einElement);                        V(mutex);
                                                           down(s)                      <= Eintritt in kritischen Bereich                                                                                            V(frei);
                                                                                                                                                                  V(mutex);
                                                           ...kritischer Bereich ...                                                                              V(belegt);                                         verarbeite(einElement);
                                                           up(s)                        <= Austritt aus dem kritischen Bereich                                  END                                                END



                                                   Prof. W. Burkard                                                                      114                      Prof. W. Burkard                                                                            115




                                    Stichworte                                                                                                             Stichworte

                                                                                                                                                           mutex = mutual exchusion = gegenseitiger / wechselseitiger Ausschluss




                                    Notizen                                                                                                                Notizen




                                                                                                                                               114                                                                                                                  115
Leser-Schreiber-Problem                                                                                             Leser-Schreiber-Problem
                            gelöst mit Semaphoren                                                                                               gelöst mit Semaphoren
   Hier Bevorzugung der Leser: ein gemeinsamer Zähler „AnzahlLeser“ zählt die Anzahl der
   Leser im kritischen Abschnitt. Ein Semaphor „LeseSem“ schützt diesen Zähler, ein zweiter                      Bevorzugung der Schreiber:
   Semaphor „ lock“ schützt den exklusiven Zugang zum Lesen/Schreiben. Initial gilt:
   AnzahlLeser = 0;             lock = 1; ZaehlerSemaphor = 1;
                                                                                                                 ein Schreiber erhält frühestmöglich Zutritt zum kritischen Abschnitt, d.h. ebenfalls
   Leser-Prozess:                                                                                                wartenden Lesern wird der Zugriff so lange verwehrt, bis keine Schreiber mehr warten.
                                                                Schreiber-Prozess:                               Die Lösung umfasst:
   {    ... // tue irgendwas anderes                                                                                      s     2 Zähler AnzahlLeser und AnzahlSchreiber,
        P(ZaehlerSemaphor);                                     {
                                                                     ... // tue irgendwas anderes                               die die Anzahl der Leser/Schreiber zählen
        AnzahlLeser++;
                                                                     P(lock);                                             s     2 Semaphore LeserSem und SchreiberSem, die diese Zähler schützen
        if (AnzahlLeser==1) then P(lock);
                                                                     ... modifiziereDieDaten(); ...
        V(ZaehlerSemaphor);                                                                                               s     1 Semaphor lock, der wie vorhin den exklusiven Zugriff auf die Daten schützt
                                                                     V(lock);
        ... leseDieDaten(); ...                                      ... // tue irgendwas anderes                         s     1 Semaphor R erzwingt die Bevorzugung der Schreiber vor den Lesern
        P(ZaehlerSemaphor);                                     }
                                                                                                                          s     1 Semaphor M stellt sicher, dass maximal ein Leser einem Schreiber zuvorkommt, egal
        AnzahlLeser--;
                                                                                                                                wie der Scheduler agiert! Beispiel: zwei Leser und ein Schreiber greifen fast gleichzeitig
        if (AnzahlLeser==0) then V(lock);
        V(ZaehlerSemaphor);                                     ein Schreiber im kritischen Abschnitt:                          zu: im schlimmsten Fall hat dann nur ein Leser die Nase vorn (siehe Folgefolien)
        ... // tue irgendwas anderes                              
                                                                    der erste Leser, der kommt,
   }                                                            wird durch lock blockiert.                       Die Initiliasierung sieht so aus:
                                                                Kommen weitere Leser,                            Int AnzahlLeser = 0, AnzahlSchreiber = 0;
                                                                so warten diese auf ZaehlerSemaphor
                                                                                                                 Semaphor LeserSem=1, SchreiberSem=1, R=1, M=1, lock=1;
       Prof. W. Burkard                                                                            116             Prof. W. Burkard                                                                                          117




Stichworte                                                                                                     Stichworte




Notizen                                                                                                        Notizen




                                                                                                         116                                                                                                                       117
Leser-Schreiber-Problem                                                                     Leser-Schreiber-Problem
                           gelöst mit Semaphoren                                                                       gelöst mit Semaphoren
   Der Leserprozess bei Bevorzugung der Schreiber                                               Der Schreiberprozess bei Bevorzugung der Schreiber

  {    ... // tue irgendwas anderes
       P(M);           // so kommt auf jeden Fall nur ein Leser durch!
             P(R);     // hier geht’s nur weiter, wenn kein Schreiber aktiv ist                {    ... // tue irgendwas anderes
                      P(LeserSemaphor);                                                             P(SchreiberSemaphor);
                               AnzahlLeser++;                                                             AnzahlSchreiber++;                     // der erste Schreiber
                               if (AnzahlLeser==1) then P(lock);                                          if (AnzahlSchreiber == 1)   then P(R); // sperrt die Leser
                      V(LeserSemaphor);                                                             V(SchreiberSemaphor);
             V(R);
       V(M);                                                                                        P(lock); // Sperre Datei
                                                                                                     ... bearbeiteDieDaten(); ... // dies hier ist der kritische Abschnitt
              ... leseDieDaten(); ... // dies hier ist der kritische Abschnitt                      V(lock); // entsperre Datei   // es können aber nur andere Schreiber dran

       P(LeserSem);                                                                                 P(SchreiberSemaphor);
             AnzahlLeser--;                                                                               AnzahlSchreiber--;                     // der letzte Schreiber
             if (AnzahlLeser==0) then V(lock); //kein Leser mehr da        Freigabe                       if (AnzahlSchreiber == 0)   then V(R); // gibt die Leser wieder frei




                                                                        
       V(LeserSem);                                                                                 V(SchreiberSemaphor);
       ... // tue irgendwas anderes                                                                 ... // tue irgendwas anderes
  }                                                                                            }


      Prof. W. Burkard                                                           118               Prof. W. Burkard                                                        119




Stichworte                                                                                   Stichworte




Notizen                                                                                      Notizen




                                                                                       118                                                                                       119
Semaphore in Echtzeitsystemen                                                                                Semaphore in Echtzeitsystemen
   Durch kritische Abschnitte können Prozessprioritäten verletzt werden, Beispiel:                              Problem 2:
                                                                                                                q Ein Prozess P3 mit niedrigster Priorität sei im kritischen Abschnitt
                                                                                                                q Ein Prozess P1 hoher Priorität wartet am zugehörigen Semaphor
                                                                                                                q Was passiert, wenn ein oder mehrere Prozesse P2 mittlerer Priorität nun P3 ständig
                                                                                                                   verdrängen?      Wichtiger Prozess P1 wird unnötig lange ausgestoppt!!




                                                                                                                                        
                                                                                                                q Lösung: Prioritätsvererbung
                                                                                                                   = der Prozess im kritischen Abschnitt erhält dynamisch die höhere Priorität eines
                                                                                                                   anderen Prozesses, der am entsprechenden Semaphor auf Zugang wartet
                                                                                                                   Bei Verlassen des kritischen Abschnitts fällt der Prozess wieder auf seine alte Priorität


                                                                                                                                                               Unnötig!!
    q    P3 macht zuerst das P(S), gewinnt das Rennen um den kritischen Abschnitt
    q    P2 und P1 werden durch ihr P(S) blockiert, P2 liegt aber in der Queue der Semaphore S vorne, da
         der Task das P(S) früher abschickt als P1
    q    Das V(S) von P3 lässt dann P2 weiterlaufen, obwohl der höher priorisierte P1 ebenfalls
         weiterlaufen könnte...
    q    Die Lösung: Einreihung der Tasks in die Semaphor-Queue nicht chronologisch sondern nach
         Prozess-Priorität !
    Prof. W. Burkard                                                                             120             Prof. W. Burkard                                                                     121




Stichworte                                                                                                   Stichworte




Notizen                                                                                                      Notizen




                                                                                                       120                                                                                                  121
Prioritätsvererbung durch Semaphore                                                                               Ereigniszähler
   Problem 2 gelöst durchPrioritätsvererbung
                                                                                                    Vermeidung zeitkritischer Abläufe mit Semaphoren = wechselseitiger Ausschluß
   P3 erhält die hohe Priorität von P1       Scheduler wählt NICHT P2 !




                                          
                                                                                                    Ereigniszähler = Lösung OHNE wechselseitigen Ausschluß
                                               P3 fällt auf alte Priorität zurück
                                                                                                    Def. Ereigniszähler E sind Integervariablen, die nur erhöht werden und auf denen
                                                                                                       folgende Operationen definiert sind:
                                                                                                    read(E)       liefert den aktuellen Wert von E
                                                                                                    Advance(E) erhöht den Wert von E um 1 (dies ist eine atomare Funktion)
                                                                                                    Await(E,i)    wartet bis E mindestens den Wert i erreicht

                                                                                                    Merke: Ereigniszähler beginnen immer bei 0 und werden stets nur erhöht !!!




                                         P1 erhält nun sofort die CPU,
    Prof. W. Burkard                     P2 kommt erst danach                       122             Prof. W. Burkard                                                                   123




Stichworte                                                                                      Stichworte




Notizen                                                                                         Notizen




                                                                                          122                                                                                                123
Lösung des Erzeuger-Verbraucher-
                   Problems mit zwei Ereigniszählern                                                                         Nachrichtenaustausch
   N = ( z.B.) 100                        /* Größe des Puffers */
   Ereigniszaehler rein=0, raus=0;       /* zählen die eingefügten/entnommenen Einträge */
                                                                                                          Problem aller bisherigen Synchronisationsverfahren: Man braucht einen GEMEINSAMEN
                                                                                                             Speicherplatz für die partizipierenden Prozesse !!
   Erzeuger:
   int zaehler=0;                            /* alle Einträge werden durchnummeriert */
                                                                                                          Erkenntnis: Dann funktionieren diese Verfahren nicht über Rechnergrenzen hinweg !!
   Schleife: zaehler inkrementieren
               await(raus, zaehler-N);      /* warten bis Platz im Puffer ist */
               Element einfügen ...                                                                       Problem: Wir brauchen ein Synchronisationsverfahren auch in verteilten Systemen
               advance(rein);
                                                                                                          Idee: Synchronisation durch Nachrichtenaustausch

   Verbraucher:                                                                                           Wir definieren zwei Systemfunktionen:
   int vzaehler=0;
   Schleife: vzaehler inkrementieren                                                                      sende(Ziel, Nachricht)          Sendet die Nachricht an das angegebene Ziel
               await(rein,vzaehler)           /* warte bis ein Element im Puffer ist */                   empfange(Quelle, Nachricht)     Empfängt eine Nachricht von der Quelle und blockiert,
               Element entnehmen...                                                                                                       d.h. wartet, solange keine Nachricht kommt.
               advance(raus)

    Prof. W. Burkard                                                                      124             Prof. W. Burkard                                                                  125




Stichworte                                                                                            Stichworte




Notizen                                                                                               Notizen




                                                                                                124                                                                                               125
Lösung des Erzeuger-Verbraucher-
                             Problems mit Nachrichten                                                                    Monitore, die Idee
   N       = ( z.B.) 100                           /* Größe des Puffers */                Problem: Alle bisherigen Konzepte sind kompliziert und sehr sensibel bei kleinsten subtilen Fehlern!
                                                                                          Beispiel Semaphore:
                                                                                               Verwechseln von P und V oder Vertauschen von geschachtelten P und V:
                                                                                               P(frei); P(m); doTheCritAction(); V(frei();V(m);
   Erzeuger:                                                                              Idee:
                                                                                               man überlasse einem Compiler die richtige Anordnung der Befehle und finde ein höheres,
   Schleife:              empfange(Verbraucher, leere Nachricht)                               abstrakteres Sprachkonstrukt      den kritischen Bereich (critical region)




                                                                                                                                 
                                                                                          Statt: P(s); <kritische Befehle> V(s);
                          ... setze Element in die leere Nachricht ...                                                                                                        M
                                                                                          Nun: shared s;
                          sende(Verbraucher, Nachricht mit Element)                                                                                                         g on
                                                                                                   region s do <kritische Befehle>;                                       de eme itor
                                                                                                                                                                            r d in =
                                                                                               Der vom Compiler erzeugte Code garantiert,                                      ar sa Zu
                                                                                               dass nur einer von mehreren Prozessen im kritischen Code arbeitet.                au m sa
                                                                                                                                                                                   f d ge m
                                                                                          Monitor                                                                                     ef nu me
   Verbraucher:                                                                                                                                                                         in tz nf
                                                                                               1973-74 (!!) haben Hansen und Hoare das Konzept erweitert:                                 ie te as
                                                                                                                                                                                            rte n      s
                                                                                               Man nehme einen ADT (heute Klasse), der die Aufgabe übernimmt                                   n Da un
                                                                                                                                                                                                Zu te g
   Wiederhole 100 mal: sende(Erzeuger, leere Nachricht)                                         s alle darin enthaltenen und von außen ansprechbaren Prozeduren                                   gr n u de
                                                                                                                                                                                                    iff n r
   Schleife: empfange(Erzeuger, Nachricht mit Element)                                          s und die lokalen Daten, Variablen und Funktionen
                                                                                                                                                                                                       sf d
                                                                                                                                                                                                         un
                                                                                                                                                                                                            kt
             ... entnehme Element aus der Nachricht und verarbeite es...                        s durch Synchronisationsmechanismen automatisch zu schützen und                                               io
                                                                                                                                                                                                                ne
             sende(Erzeuger, leere Nachricht)                                                   s den wechselseitigen Ausschluss von Prozessen darin zu garantieren.                                              n
                                                                                          Diese Klasse nannte man einen MONITOR
       Prof. W. Burkard                                                      126                Prof. W. Burkard                                                                                            127




Stichworte                                                                               Stichworte




Notizen                                                                                  Notizen




                                                                                   126                                                                                                                            127
Monitore, das Konzept                                                                       Monitore, die Vorteile
 Monitor Monitorname ( Parameter )
    Datendeklarationen; /* gemeinsame Daten */
                                                                                                 q      Gemeinsam (durch mehrere Prozesse) bearbeitete Daten werden explizit in der
                                                                                                        Programmstruktur sichtbar gemacht
     ENTRY         Funktionsname1 ( Parameter ) { Prozedurkörper }
     ENTRY         Funktionsname2 ( Parameter ) { Prozedurkörper }                                            sie sind in Monitoren organisiert




                                                                                                         
     ENTRY         Funktionsname3 ( Parameter ) { Prozedurkörper }                               q      Die bereitgestellten Monitorprozeduren definieren allein
     ...                                                                                                die Zugriffsalgorithmen zu den Monitordaten.
     ENTRY         FunktionsnameN ( Parameter ) { Prozedurkörper }
                                                                                                 q      Ein Umgehen der Monitorprozeduren ist nicht möglich
    INIT { Initialisierungsanweisungen }                                                         q      Monitore kapseln wie Module die gemeinsamen Daten.
 END                                                                                                    Eine Änderung der monitorinternen Datenstrukturen und Algorithmen bleibt für
 Die Initialisierung der Monitordaten erfolgt durch einmaligen Aufruf von                               Prozesse unsichtbar, solange die Schnittstelle unverändert bleibt       information hiding




                                                                                                                                                                             
                          Monitorname(aktuelle Parameter);
 Dadurch wird letztendlich der Initialisierungsteil durchlaufen.
 Prozesse benutzen den Monitor durch Aufruf der Monitorprozeduren in der Form:
                          Monitorname.Funktionsname ( aktuelle Parameter );

       Prof. W. Burkard                                                          128             Prof. W. Burkard                                                                          129




Stichworte                                                                                   Stichworte




Notizen                                                                                      Notizen




                                                                                       128                                                                                                       129
Erzeuger-Verbraucher-Problem                                                   Erzeuger-Verbraucher-Problem
                          gelöst mit einem Monitor                                                       gelöst mit einem Monitor
    Erzeuger und Verbraucher-Prozesse:                                             Deklaration des Monitors:


 Erzeuger                             Verbraucher

 LOOP                                 LOOP
   {                                    {
     produziere(Element);                 Buffer.getFromBuffer(Element);
     Buffer.putInBuffer(Element);         verarbeite(Element);
   }                                    }
 END                                  END




    Prof. W. Burkard                                               130             Prof. W. Burkard                                  131




Stichworte                                                                     Stichworte




Notizen                                                                        Notizen




                                                                         130                                                               131
Erzeuger-Verbraucher-Problem                                                             Erzeuger-Verbraucher-Problem
                           gelöst mit einem Monitor                                                                 gelöst mit einem Monitor
   Monitor ist unvollständig ! Was fehlt ?
         Implementierung der beiden zentralen Prozeduren!
         




                                                                                                                                        Die zentralen
   Problem: wir brauchen zusätzliche Wartebedingungen zur Kontrolle des Pufferüber-
      /unterlaufs                                                                                                                      Monitor-Prozeduren
   Lösung: in Monitoren gibt es Condition-Variable mit nur zwei Operationen:
       signal(s) = sendet der Condition-Variable s ein Signal zur Befreiung
                   der an dieser Condition wartenden Tasks
       wait(s) =   Task soll an der Condition-Variable s solange warten,
                   bis ein Signal gesendet wird.


   Konsequenz: Der Monitor Buffer muss um zwei Condition-Variable erweitert werden:

       VAR frei, belegt: CONDITION

   Dann ergeben sich die beiden Monitor-Prozeduren gemäss nächster Folie!



     Prof. W. Burkard                                                         132             Prof. W. Burkard                                        133




Stichworte                                                                                Stichworte




Notizen                                                                                   Notizen




                                                                                    132                                                                     133
Ein klassisches IPC-Problem                                                                         prinzipieller Lösungsansatz für
                          das Philosophenproblem                                                                                    das Philosophenproblem
  (oder: die Rangelei um den exklusiven Zugriff auf begrenzte Betriebsmittel )                               q   Man muß den Zugriff auf die beiden Gabeln und andere gemeinsame Ressourcen regeln
                                                                                                             q   Es gibt also eine Semaphore G für den wechselseitigen Ausschluß
  Problem: Ein Philosoph ißt oder denkt. (richtig ! Das ist eine seehr starke Abstraktion!!)
  q  Es sitzen 5 Philosophen am Tisch mit fünf Tellern und fünf Gabeln
                                                                                                             q   Jeder Philosoph befindet sich in einem von drei Zuständen: denkend, hungrig, essend
  q  Ein hungriger Philosoph versucht linke und rechte Gabel aufzunehmen, dann ißt er ein
     Weilchen, danach legt er die Gabeln zurück und denkt wieder.                                            q   Es gibt also je Philosoph i eine Zustandsvariable Z(i) 1<=i<=5 mit den Werten d,h,e

  Aufgabe: Man finde für die Philosophen                     Mittagszeit bei den Philosophen                 q   Ein hungriger Philosoph ist blockiert, wenn er nicht beide Gabeln erhält.
  einen funktionierenden Algorithmus !!                                                                          (mit leerem Magen kann man nicht denken)
                                                                                                             q   Es gibt somit je Philosoph eine Semaphore S(i) 1<= i<=5
                        Einfache, aber fehlerhafte Lösung:

                                Philosoph denkt ...                                                          q   Hat ein Philosoph seine Mahlzeit beendet, so schaut er, ob seine Nachbarn jetzt essen
                              nimmt linke Gabel auf                                                              könnten und weckt sie gegebenenfalls auf
                             nimmt rechte Gabel auf
                              ißt von seinem Teller
                             legt linke Gabel zurück
                            legt rechte Gabel zurück

     Prof. W. Burkard                                                                          134               Prof. W. Burkard                                                                 135




Stichworte                                                                                                 Stichworte




Notizen                                                                                                    Notizen




                                                                                                     134                                                                                                135
Alles klar ??
 1. Was ist ein zeitkritischer Ablauf ?
 2. Zeigen Sie an folgendem Beispiel, daß der Algorithmus SJF bei nicht-gleichzeitigem
    Vorliegen der Jobs nicht korrekt arbeitet: Es sollen zum Zeitpunkt 0 zwei Jobs A und B mit
    vermuteten Laufzeiten 4 und 8 Min. vorliegen. Nach 5 Minuten kommen drei weitere Jobs
    C,D und E mit je 2 Min. Laufzeit dazu. Wie ist die Ausführungsreihenfolge und die
    durchschnittliche Verweilzeit? Wie wären die Werte, wenn die Jobs gleichzeitig vorlägen?
 3. Was ist der Unterschied zwischen aktivem Warten und Blockieren ?
 4. Nennen Sie Argumente für ein kleines bzw. großes Quantum beim Round-Robin.
 5. Was passiert, wenn beim Round-Robin ein Prozeß mehrmals in der Schlange steckt ?
    Sehen Sie einen Grund, dieses zu gestatten ?
 6. In einer Bäckerei verkaufen n Verkäufer Backwaren. Jeder eintretende Kunde zieht eine
    Nummer von einem fortlaufend nummerierten Band. Ein Verkäufer ruft die nächste
    Nummer auf, sobald er wieder frei ist. So findet jeder Kunde schnellstens den Käufer, der
    ihn bedient. Skizzieren Sie die Algorithmen für Kunden und Verkäufer (Lösung mittels
    Semaphore)


     Prof. W. Burkard                                                                   136




Stichworte




Notizen




                                                                                              136

Mais conteúdo relacionado

Destaque

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Destaque (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Kap4

  • 1. Copyright(C) by Foxit Software Company,2005-2007 Interprozess-Kommunikation Race conditions an einem Beispiel Durch Nutzung gemeinsamen Speichers (egal, ob Hauptspeicher oder Plattenplatz) können In einer Warteschlange des BS seien mehrere Prozesse eingehängt und warten auf eine Prozesse miteinander kommunizieren, indem sie Daten austauschen. Bearbeitung: Problem: hierbei entstehen zeitkritische Abläufe (race conditions) Für das Einhängen des Prozesses A gilt: Für das Entfernen von B gilt: • Lese den Anker: PointToB • Lese den Anker: PointToB Def.: Eine Situation, in der mindestens zwei Prozesse auf gemeinsam genutzte Daten zugreifen, • Setze den NextZeiger: Point ToB • Lese den NextZeiger: PointToC und die Ergebnisse von der zeitlichen Reihenfolge des Zugriffs abhängen, nennt man • Setze den Anker: Point ToA • Setze den Anker: PointToC zeitkritischen Ablauf (race condition) Was passiert, wenn die Operationen nicht in einem Stück durchgeführt werden ? Beispiel: gespoolte Druckausgabe Spooler 1 Idee: in einer Tabelle stehen alle zu 2 test.c out = 2 Edited by Foxit Reader druckenden Dateien, Variable out zeigt 3 note.xls in = 5 For Evaluation Only. auf die nächste zu druckende Datei, 4 dipl.doc Variable in zeigt auf nächsten 5 kase.xls freien Tabellenplatz. Zwei Prozesse Prozeß A A und B wollen nahezu gleichzeitig 6 folie.ppp etwas ausdrucken. 7 Katastrophe: BS wechselt von A nach B Prozeß B 8 VOR dem vollständigen Ende des Zugriffs !!! Prof. W. Burkard 100 Prof. W. Burkard 101 Stichworte Stichworte Computer arbeiten deterministisch. Heißt Eingabe gleich Ausgabe (5+5=10 egal ob es 10h morgens oder 8h abends ist // kalt oder warm ist). Notizen Notizen 100 101
  • 2. Copyright(C) by Foxit Software Company,2005-2007 zeitkritische Bereiche aktives Warten Def: Derjenige Teil eines Prozesses, in dem der Zugriff auf gemeinsam benutzten Speicher stattfindet, wird als (zeit-)kritischer Bereich des Prozesses bezeichnet. = (schlechte) Lösung des Problems des wechselseitigen Ausschlusses Idee: Probleme mit zeitkritischen Abläufen lassen sich vermeiden, wenn sich niemals zwei Ansatz 1: Sperren aller Unterbrechungen beim Eintritt in einen kritischen Bereich oder mehr Prozesse gleichzeitig in einem kritischen Bereich befinden. - sinnvolle Lösung für diverse Prozesse des Betriebssystems ==> wechselseitiger Ausschluß <== - gefährliche Lösung, bei Nutzung durch Anwenderprozesse Für ein funktionierendes System fordern wir also: Ansatz 2: Eine globale Sperrvariable kann die Werte 0 oder 1 annehmen Nur wenn Sperrvariable=0 geht ein Prozeß in den kritischen Bereich und setzt als erstes die Variable auf 1. Edited by Foxit Reader 1. nur ein Prozeß darf sich zu einem Zeitpunkt in einem kritischen Bereich befinden Problem: siehe Beispiel “gespoolte Druckausgabe” For Evaluation Only. 2. Nur durch das Eintreten in einen kritischen Bereich blockiert ein Prozeß andere Prozesse Ansatz 3: striktes Alternieren durch aktives Warten: Jeder Prozeß hat einen 3. Kein Prozeß soll unendlich lange warten müssen, bis er in seinen kritischen Bereich darf Kennwert W und wartet darauf, daß die Schaltvariable SV diesen Wert annimmt. Nach Beenden des kritischen Bereiches wird SV weitergeschaltet, 4. kein Prozeß darf Annahmen über Prozessoranzahl oder Ausführungsgeschwindigkeit also: warten, bis SV == W seiner selbst oder anderer Prozesse machen Eintreten in krit. Bereich....Austreten aus kritischem Bereich Prof. W. Burkard 102 Prof. W. Burkard SV weiterschalten 103 Stichworte Stichworte Gute Idee, funktioniert aber in der Realität nicht! Notizen Notizen 102 103
  • 3. Erster Versuch zur Prozess-Synchronisation Zweiter Versuch zur Prozess-Synchronisation Die einfachste Idee zur Erreichung eines gegenseitigen Ausschlusses besteht darin, Wir wollen beide Prozesse in beliebiger Reihenfolge synchronisieren einen Prozess beim Eintreten in einen kritischen Abschnitt so lange Ein Prozess achte also nur darauf, dass der andere nicht drin ist. warten zu lassen, bis der Abschnitt wieder frei ist. Für zwei parallel ablaufende Prozesse würde das wie folgt aussehen: Die gemeinsame Variable dran sei mit 1 initialisiert, so erreichen wir den gegenseitigen Ausschluss. Die Variablen drin1 und drin2 seien beide mit false initialisiert. Wo ist das Problem ? Wo ist jetzt das Problem ? Beide Prozesse können nur abwechselnd in den kritischen Bereich ! Jetzt gehen eventuell BEIDE gleichzeitig in den kritischen Abschnitt ! Warum ? Ein Prozess hindert sich eventuell selbst daran, ein zweites Mal in den krit. Bereich zu gehen!!! Hilft es die beiden Zeilen des ersten grauen Bereiches zu vertauschen?   Prof. W. Burkard 104 Prof. W. Burkard 105 Stichworte Stichworte Notizen Notizen 104 105
  • 4. Copyright(C) by Foxit Software Company,2005-2007 aktives Warten: Petersons Lösung (von 1981) Petersons Lösung in Java / C / C++ q Die Variablen Interesse1 und Interesse2 sowie dran sind globale, gemeinsame Variablen #define FALSE O q Die Variablen Interesse1 und Interesse2 sind beide mit false initialisiert. #define TRUE 1 #define N 2 /* Anzahl der Prozesse */ int dran; /* Wer ist an der Reihe ? */ int interessiert [N]; /* Alle Werte sind anfangs O (FALSE) */ void enter_region (int prozess) /* prozess: wer tritt ein (O oder 1) */ { int anderer; /* Nummer des anderen Prozesses */ anderer = 1 - prozess; /* Konkurrent des Prozesses */ Edited by Foxit Reader interessiert[process] = TRUE; /* ich zeige mein Interesse */ dran = prozess; /* setze Marke: ich bin dran! */ For Evaluation Only. while ( dran == prozess /* Wer dran zuletzt setzt, muss warten, */ && interessiert[anderer] == TRUE) /* wenn auch der andere rein will */ ; /* leere Anweisung, NoOP */ } Wie kommt ein Prozess voran, wenn der andere kein Interesse bekundet hat ? void leave_region (int prozess) /* prozess, der den Bereich verläßt */ Wie ist der Ablauf, wenn beide nahezu zeitgleich (im ersten grauen Bereich) Interesse bekunden ? { interessiert[prozess] = FALSE; /* gibt das Verlassen des krit. Bereiches bekannt */ Prof. W. Burkard 106 } Prof. W. Burkard 107 Stichworte Stichworte Wenn ein Prozess in diese Schleife kommt, bleibt er quot;ewigquot; in dieser Schleife. Er kommt erst weiter sobald die Bedingung nicht mehr erfüllt ist und dies geschieht erst dann wenn der Scheduler erneut auf den Prozess zugreift! => Aktives Warten bremst den Rechner aus, in der Zeit in der Gewartet wird, wird zudem noch unnötig Strom verbraucht. Notizen Notizen 106 107
  • 5. Copyright(C) by Foxit Software Company,2005-2007 Sleep und Wakeup das Erzeuger-Verbraucher-Problem wichtige Erkenntnis: ... oder: das Ärgernis mit den verlorenen Weckrufen Durch aktives Warten wird Prozessorzeit verschwendet! (Prozesse prüfen aktiv in einer Schleife das Eintreffen einer Änderung) Zwei Prozesse benutzen einen Ringpuffer, der eine schreibt Daten hinein, der andere ließt diese aus. Dazu kommt das Prioritäteninversionsproblem: Ein höher priorisierter Prozeß H wartet unendlich lang auf das Verlassen des krit. Bereiches eines niedriger priorisierten Prozesses L, da der Scheduler den Ist der Puffer voll und der Schreiber hat etwas zum eintragen, N Elemente rechenbereiten Prozeß H stets vorzieht => L kommt nicht mehr zum Zug und damit legt er sich schlafen und läßt sich vom Verbraucher maximal nicht aus dem kritischen Bereich wecken, wenn jener ein Element entfernt hat. (Denn dann ist wieder Platz im Ring) im Ring Edited by Foxit Reader Neue Idee: wartende Prozesse “gehen schlafen” (werden in den Zustand For Evaluation Only. “blockiert” gesetzt) und lassen sich nach Verbesserung der Lage wieder wecken: Ist der Puffer leer und der Leser soll etwas lesen, legt er sich schlafen und läßt sich vom Schreiber wecken, wenn der etwas eingetragen hat. Aufrufender Prozeß geht schlafen ==> Funktion sleep() n Prozeß mit der Nr. <n> soll aufwachen ==> Funktion wakeup(xyz) PROBLEM: Eine gemeinsam benutzte Variable ANZAHL nennt die Anzahl der im Puffer befindlichen Elemente. Der Zugriff auf diese Variable ist kritisch !! Prof. W. Burkard 108 Prof. W. Burkard 109 Stichworte Stichworte Notizen Notizen 108 109
  • 6. das Erzeuger-Verbraucher-Problem das Leser-Schreiber-Problem Erzeuger-Algorithmus: q auf eine Datei dürfen gleichzeitig mehrere Prozesse lesend zugreifen, ABER: 1. Nimm nächstes Element q wenn ein Prozeß schreibend zugreift, darf kein anderer Prozeß (lesend oder schreibend) agieren. 2. Lies die Variable Anzahl Die beiden Lösung 1: (Bevorzugt die Leser-Prozesse) 3. Wenn Puffer voll, dann “Schlafen-gehen” “gefährlichen” Schreiber: Sperrt Datei, schreibt Daten, gibt Datei frei 4. Element in den Puffer eintragen Stellen, hier Leser: (Nur der erste Leser!! :) sperrt die Datei 5. Anzahl um 1 erhöhen darf der ließt die Daten 6. Wenn die Anzahl jetzt 1 lautet, “Leser-wecken” Scheduler nicht (Nur der letzte Leser!! :) gibt Datei wieder frei den Prozeß Leser-Algorithmus: wechseln, sonst 1. Lies die Variable Anzahl Lösung 2: (Bevorzugt Schreiber-Prozesse) bricht die 2. Wenn Puffer leer, “Schlafen-gehen” grundlegendes Konzept: Synchronisation 3. Element lesen Prozesse mit Lesewunsch überprüfen die Existenz von schreibenden bzw. 4. Anzahl um 1 erniedrigen schreibwilligen Prozessen und blockieren, bis die Schlange der Schreiber leer ist. 5. Wenn Puffer jetzt einen freien Platz hat, “Erzeuger-wecken” Prof. W. Burkard 110 Prof. W. Burkard 111 Stichworte Stichworte Notizen Notizen 110 111
  • 7. Copyright(C) by Foxit Software Company,2005-2007 Semaphore: die Idee Semaphore: die Implementierung Idee des holl. Mathematikers Dijkstra (1965): Man zähle Wecksignale mit Hilfe einer Integer-Variablen Name: Semaphore   (Semaphore sind Signalmasten in der Seefahrt und bei Eisenbahnnetzen) Def.: Eine Semaphore s ist eine Integervariable, die (aus Benutzersicht!) nicht negativ werden kann und auf der nur zwei Operationen DOWN (auch P genannt) und UP (auch V genannt) definiert sind: DOWN(s) = P(s) = Reduziere s um 1, wenn s > 0, (sonst geht rufender Prozeß schlafen) UP(s) = V(s) = Erhöhe s um 1 und wecke einen der schlafenden Threads (falls da) Edited by Foxit Reader Struktur eines Semaphors For Evaluation Only. Zähler WICHTIG: q Das Überprüfen auf 0, q das Verändern des Wertes von s Zeiger auf wartende Threads/Tasks q und das Schlafengehen bzw. „Task wecken“ sind eine untrennbare, atomare Aktion des Betriebssystems!! Prof. W. Burkard 112 Prof. W. Burkard 113 Stichworte Stichworte Notizen Notizen 112 113
  • 8. Erzeuger-Verbraucher-Problem Copyright(C) by Foxit Software Company,2005-2007 wechselseitiger Ausschluß mit Semaphoren gelöst mit Semaphoren Zwei Semaphore „frei“ und „belegt“ werden benutzt um zwischen den Prozessen die Zwei Prozesse 1 und 2 konkurrieren um den Eintritt in einen kritischen Bereich. Zustände des Puffers zu signalisieren. Der Semaphor „mutex“ dient nur dazu, den Zugriff auf Semaphor s ist initial auf 1 gesetzt den Puffer exklusiv zu machen. Der Puffer fasst N Elemente. Initial gilt: Semaphor frei = N, belegt = 0, mutex = 1; Prozeß 1: ... beliebige Aktionen ... down(s) <= Eintritt in kritischen Bereich Erzeuger-Prozess: Verbraucher-Prozess: ...kritischer Bereich ... up(s) <= Austritt aus dem kritischen Bereich LOOP LOOP P = DOWN produziere(einElement); P(belegt); Edited by Foxit Reader Prozeß 2: V = UP P(frei); P(mutex); For Evaluation Only. ... beliebige Aktionen ... P(mutex); holeAusPuffer(einElement); fuelleInPuffer(einElement); V(mutex); down(s) <= Eintritt in kritischen Bereich V(frei); V(mutex); ...kritischer Bereich ... V(belegt); verarbeite(einElement); up(s) <= Austritt aus dem kritischen Bereich END END Prof. W. Burkard 114 Prof. W. Burkard 115 Stichworte Stichworte mutex = mutual exchusion = gegenseitiger / wechselseitiger Ausschluss Notizen Notizen 114 115
  • 9. Leser-Schreiber-Problem Leser-Schreiber-Problem gelöst mit Semaphoren gelöst mit Semaphoren Hier Bevorzugung der Leser: ein gemeinsamer Zähler „AnzahlLeser“ zählt die Anzahl der Leser im kritischen Abschnitt. Ein Semaphor „LeseSem“ schützt diesen Zähler, ein zweiter Bevorzugung der Schreiber: Semaphor „ lock“ schützt den exklusiven Zugang zum Lesen/Schreiben. Initial gilt: AnzahlLeser = 0; lock = 1; ZaehlerSemaphor = 1; ein Schreiber erhält frühestmöglich Zutritt zum kritischen Abschnitt, d.h. ebenfalls Leser-Prozess: wartenden Lesern wird der Zugriff so lange verwehrt, bis keine Schreiber mehr warten. Schreiber-Prozess: Die Lösung umfasst: { ... // tue irgendwas anderes s 2 Zähler AnzahlLeser und AnzahlSchreiber, P(ZaehlerSemaphor); { ... // tue irgendwas anderes die die Anzahl der Leser/Schreiber zählen AnzahlLeser++; P(lock); s 2 Semaphore LeserSem und SchreiberSem, die diese Zähler schützen if (AnzahlLeser==1) then P(lock); ... modifiziereDieDaten(); ... V(ZaehlerSemaphor); s 1 Semaphor lock, der wie vorhin den exklusiven Zugriff auf die Daten schützt V(lock); ... leseDieDaten(); ... ... // tue irgendwas anderes s 1 Semaphor R erzwingt die Bevorzugung der Schreiber vor den Lesern P(ZaehlerSemaphor); } s 1 Semaphor M stellt sicher, dass maximal ein Leser einem Schreiber zuvorkommt, egal AnzahlLeser--; wie der Scheduler agiert! Beispiel: zwei Leser und ein Schreiber greifen fast gleichzeitig if (AnzahlLeser==0) then V(lock); V(ZaehlerSemaphor); ein Schreiber im kritischen Abschnitt: zu: im schlimmsten Fall hat dann nur ein Leser die Nase vorn (siehe Folgefolien) ... // tue irgendwas anderes   der erste Leser, der kommt, } wird durch lock blockiert. Die Initiliasierung sieht so aus: Kommen weitere Leser, Int AnzahlLeser = 0, AnzahlSchreiber = 0; so warten diese auf ZaehlerSemaphor Semaphor LeserSem=1, SchreiberSem=1, R=1, M=1, lock=1; Prof. W. Burkard 116 Prof. W. Burkard 117 Stichworte Stichworte Notizen Notizen 116 117
  • 10. Leser-Schreiber-Problem Leser-Schreiber-Problem gelöst mit Semaphoren gelöst mit Semaphoren Der Leserprozess bei Bevorzugung der Schreiber Der Schreiberprozess bei Bevorzugung der Schreiber { ... // tue irgendwas anderes P(M); // so kommt auf jeden Fall nur ein Leser durch! P(R); // hier geht’s nur weiter, wenn kein Schreiber aktiv ist { ... // tue irgendwas anderes P(LeserSemaphor); P(SchreiberSemaphor); AnzahlLeser++; AnzahlSchreiber++; // der erste Schreiber if (AnzahlLeser==1) then P(lock); if (AnzahlSchreiber == 1) then P(R); // sperrt die Leser V(LeserSemaphor); V(SchreiberSemaphor); V(R); V(M); P(lock); // Sperre Datei ... bearbeiteDieDaten(); ... // dies hier ist der kritische Abschnitt ... leseDieDaten(); ... // dies hier ist der kritische Abschnitt V(lock); // entsperre Datei // es können aber nur andere Schreiber dran P(LeserSem); P(SchreiberSemaphor); AnzahlLeser--; AnzahlSchreiber--; // der letzte Schreiber if (AnzahlLeser==0) then V(lock); //kein Leser mehr da Freigabe if (AnzahlSchreiber == 0) then V(R); // gibt die Leser wieder frei   V(LeserSem); V(SchreiberSemaphor); ... // tue irgendwas anderes ... // tue irgendwas anderes } } Prof. W. Burkard 118 Prof. W. Burkard 119 Stichworte Stichworte Notizen Notizen 118 119
  • 11. Semaphore in Echtzeitsystemen Semaphore in Echtzeitsystemen Durch kritische Abschnitte können Prozessprioritäten verletzt werden, Beispiel: Problem 2: q Ein Prozess P3 mit niedrigster Priorität sei im kritischen Abschnitt q Ein Prozess P1 hoher Priorität wartet am zugehörigen Semaphor q Was passiert, wenn ein oder mehrere Prozesse P2 mittlerer Priorität nun P3 ständig verdrängen? Wichtiger Prozess P1 wird unnötig lange ausgestoppt!!   q Lösung: Prioritätsvererbung = der Prozess im kritischen Abschnitt erhält dynamisch die höhere Priorität eines anderen Prozesses, der am entsprechenden Semaphor auf Zugang wartet Bei Verlassen des kritischen Abschnitts fällt der Prozess wieder auf seine alte Priorität Unnötig!! q P3 macht zuerst das P(S), gewinnt das Rennen um den kritischen Abschnitt q P2 und P1 werden durch ihr P(S) blockiert, P2 liegt aber in der Queue der Semaphore S vorne, da der Task das P(S) früher abschickt als P1 q Das V(S) von P3 lässt dann P2 weiterlaufen, obwohl der höher priorisierte P1 ebenfalls weiterlaufen könnte... q Die Lösung: Einreihung der Tasks in die Semaphor-Queue nicht chronologisch sondern nach Prozess-Priorität ! Prof. W. Burkard 120 Prof. W. Burkard 121 Stichworte Stichworte Notizen Notizen 120 121
  • 12. Prioritätsvererbung durch Semaphore Ereigniszähler Problem 2 gelöst durchPrioritätsvererbung Vermeidung zeitkritischer Abläufe mit Semaphoren = wechselseitiger Ausschluß P3 erhält die hohe Priorität von P1 Scheduler wählt NICHT P2 !   Ereigniszähler = Lösung OHNE wechselseitigen Ausschluß P3 fällt auf alte Priorität zurück Def. Ereigniszähler E sind Integervariablen, die nur erhöht werden und auf denen folgende Operationen definiert sind: read(E) liefert den aktuellen Wert von E Advance(E) erhöht den Wert von E um 1 (dies ist eine atomare Funktion) Await(E,i) wartet bis E mindestens den Wert i erreicht Merke: Ereigniszähler beginnen immer bei 0 und werden stets nur erhöht !!! P1 erhält nun sofort die CPU, Prof. W. Burkard P2 kommt erst danach 122 Prof. W. Burkard 123 Stichworte Stichworte Notizen Notizen 122 123
  • 13. Lösung des Erzeuger-Verbraucher- Problems mit zwei Ereigniszählern Nachrichtenaustausch N = ( z.B.) 100 /* Größe des Puffers */ Ereigniszaehler rein=0, raus=0; /* zählen die eingefügten/entnommenen Einträge */ Problem aller bisherigen Synchronisationsverfahren: Man braucht einen GEMEINSAMEN Speicherplatz für die partizipierenden Prozesse !! Erzeuger: int zaehler=0; /* alle Einträge werden durchnummeriert */ Erkenntnis: Dann funktionieren diese Verfahren nicht über Rechnergrenzen hinweg !! Schleife: zaehler inkrementieren await(raus, zaehler-N); /* warten bis Platz im Puffer ist */ Element einfügen ... Problem: Wir brauchen ein Synchronisationsverfahren auch in verteilten Systemen advance(rein); Idee: Synchronisation durch Nachrichtenaustausch Verbraucher: Wir definieren zwei Systemfunktionen: int vzaehler=0; Schleife: vzaehler inkrementieren sende(Ziel, Nachricht) Sendet die Nachricht an das angegebene Ziel await(rein,vzaehler) /* warte bis ein Element im Puffer ist */ empfange(Quelle, Nachricht) Empfängt eine Nachricht von der Quelle und blockiert, Element entnehmen... d.h. wartet, solange keine Nachricht kommt. advance(raus) Prof. W. Burkard 124 Prof. W. Burkard 125 Stichworte Stichworte Notizen Notizen 124 125
  • 14. Lösung des Erzeuger-Verbraucher- Problems mit Nachrichten Monitore, die Idee N = ( z.B.) 100 /* Größe des Puffers */ Problem: Alle bisherigen Konzepte sind kompliziert und sehr sensibel bei kleinsten subtilen Fehlern! Beispiel Semaphore: Verwechseln von P und V oder Vertauschen von geschachtelten P und V: P(frei); P(m); doTheCritAction(); V(frei();V(m); Erzeuger: Idee: man überlasse einem Compiler die richtige Anordnung der Befehle und finde ein höheres, Schleife: empfange(Verbraucher, leere Nachricht) abstrakteres Sprachkonstrukt den kritischen Bereich (critical region)   Statt: P(s); <kritische Befehle> V(s); ... setze Element in die leere Nachricht ... M Nun: shared s; sende(Verbraucher, Nachricht mit Element) g on region s do <kritische Befehle>; de eme itor r d in = Der vom Compiler erzeugte Code garantiert, ar sa Zu dass nur einer von mehreren Prozessen im kritischen Code arbeitet. au m sa f d ge m Monitor ef nu me Verbraucher: in tz nf 1973-74 (!!) haben Hansen und Hoare das Konzept erweitert: ie te as rte n s Man nehme einen ADT (heute Klasse), der die Aufgabe übernimmt n Da un Zu te g Wiederhole 100 mal: sende(Erzeuger, leere Nachricht) s alle darin enthaltenen und von außen ansprechbaren Prozeduren gr n u de iff n r Schleife: empfange(Erzeuger, Nachricht mit Element) s und die lokalen Daten, Variablen und Funktionen sf d un kt ... entnehme Element aus der Nachricht und verarbeite es... s durch Synchronisationsmechanismen automatisch zu schützen und io ne sende(Erzeuger, leere Nachricht) s den wechselseitigen Ausschluss von Prozessen darin zu garantieren. n Diese Klasse nannte man einen MONITOR Prof. W. Burkard 126 Prof. W. Burkard 127 Stichworte Stichworte Notizen Notizen 126 127
  • 15. Monitore, das Konzept Monitore, die Vorteile Monitor Monitorname ( Parameter ) Datendeklarationen; /* gemeinsame Daten */ q Gemeinsam (durch mehrere Prozesse) bearbeitete Daten werden explizit in der Programmstruktur sichtbar gemacht ENTRY Funktionsname1 ( Parameter ) { Prozedurkörper } ENTRY Funktionsname2 ( Parameter ) { Prozedurkörper } sie sind in Monitoren organisiert   ENTRY Funktionsname3 ( Parameter ) { Prozedurkörper } q Die bereitgestellten Monitorprozeduren definieren allein ... die Zugriffsalgorithmen zu den Monitordaten. ENTRY FunktionsnameN ( Parameter ) { Prozedurkörper } q Ein Umgehen der Monitorprozeduren ist nicht möglich INIT { Initialisierungsanweisungen } q Monitore kapseln wie Module die gemeinsamen Daten. END Eine Änderung der monitorinternen Datenstrukturen und Algorithmen bleibt für Die Initialisierung der Monitordaten erfolgt durch einmaligen Aufruf von Prozesse unsichtbar, solange die Schnittstelle unverändert bleibt information hiding   Monitorname(aktuelle Parameter); Dadurch wird letztendlich der Initialisierungsteil durchlaufen. Prozesse benutzen den Monitor durch Aufruf der Monitorprozeduren in der Form: Monitorname.Funktionsname ( aktuelle Parameter ); Prof. W. Burkard 128 Prof. W. Burkard 129 Stichworte Stichworte Notizen Notizen 128 129
  • 16. Erzeuger-Verbraucher-Problem Erzeuger-Verbraucher-Problem gelöst mit einem Monitor gelöst mit einem Monitor Erzeuger und Verbraucher-Prozesse: Deklaration des Monitors: Erzeuger Verbraucher LOOP LOOP { { produziere(Element); Buffer.getFromBuffer(Element); Buffer.putInBuffer(Element); verarbeite(Element); } } END END Prof. W. Burkard 130 Prof. W. Burkard 131 Stichworte Stichworte Notizen Notizen 130 131
  • 17. Erzeuger-Verbraucher-Problem Erzeuger-Verbraucher-Problem gelöst mit einem Monitor gelöst mit einem Monitor Monitor ist unvollständig ! Was fehlt ? Implementierung der beiden zentralen Prozeduren!   Die zentralen Problem: wir brauchen zusätzliche Wartebedingungen zur Kontrolle des Pufferüber- /unterlaufs Monitor-Prozeduren Lösung: in Monitoren gibt es Condition-Variable mit nur zwei Operationen: signal(s) = sendet der Condition-Variable s ein Signal zur Befreiung der an dieser Condition wartenden Tasks wait(s) = Task soll an der Condition-Variable s solange warten, bis ein Signal gesendet wird. Konsequenz: Der Monitor Buffer muss um zwei Condition-Variable erweitert werden: VAR frei, belegt: CONDITION Dann ergeben sich die beiden Monitor-Prozeduren gemäss nächster Folie! Prof. W. Burkard 132 Prof. W. Burkard 133 Stichworte Stichworte Notizen Notizen 132 133
  • 18. Ein klassisches IPC-Problem prinzipieller Lösungsansatz für das Philosophenproblem das Philosophenproblem (oder: die Rangelei um den exklusiven Zugriff auf begrenzte Betriebsmittel ) q Man muß den Zugriff auf die beiden Gabeln und andere gemeinsame Ressourcen regeln q Es gibt also eine Semaphore G für den wechselseitigen Ausschluß Problem: Ein Philosoph ißt oder denkt. (richtig ! Das ist eine seehr starke Abstraktion!!) q Es sitzen 5 Philosophen am Tisch mit fünf Tellern und fünf Gabeln q Jeder Philosoph befindet sich in einem von drei Zuständen: denkend, hungrig, essend q Ein hungriger Philosoph versucht linke und rechte Gabel aufzunehmen, dann ißt er ein Weilchen, danach legt er die Gabeln zurück und denkt wieder. q Es gibt also je Philosoph i eine Zustandsvariable Z(i) 1<=i<=5 mit den Werten d,h,e Aufgabe: Man finde für die Philosophen Mittagszeit bei den Philosophen q Ein hungriger Philosoph ist blockiert, wenn er nicht beide Gabeln erhält. einen funktionierenden Algorithmus !! (mit leerem Magen kann man nicht denken) q Es gibt somit je Philosoph eine Semaphore S(i) 1<= i<=5 Einfache, aber fehlerhafte Lösung: Philosoph denkt ... q Hat ein Philosoph seine Mahlzeit beendet, so schaut er, ob seine Nachbarn jetzt essen nimmt linke Gabel auf könnten und weckt sie gegebenenfalls auf nimmt rechte Gabel auf ißt von seinem Teller legt linke Gabel zurück legt rechte Gabel zurück Prof. W. Burkard 134 Prof. W. Burkard 135 Stichworte Stichworte Notizen Notizen 134 135
  • 19. Alles klar ?? 1. Was ist ein zeitkritischer Ablauf ? 2. Zeigen Sie an folgendem Beispiel, daß der Algorithmus SJF bei nicht-gleichzeitigem Vorliegen der Jobs nicht korrekt arbeitet: Es sollen zum Zeitpunkt 0 zwei Jobs A und B mit vermuteten Laufzeiten 4 und 8 Min. vorliegen. Nach 5 Minuten kommen drei weitere Jobs C,D und E mit je 2 Min. Laufzeit dazu. Wie ist die Ausführungsreihenfolge und die durchschnittliche Verweilzeit? Wie wären die Werte, wenn die Jobs gleichzeitig vorlägen? 3. Was ist der Unterschied zwischen aktivem Warten und Blockieren ? 4. Nennen Sie Argumente für ein kleines bzw. großes Quantum beim Round-Robin. 5. Was passiert, wenn beim Round-Robin ein Prozeß mehrmals in der Schlange steckt ? Sehen Sie einen Grund, dieses zu gestatten ? 6. In einer Bäckerei verkaufen n Verkäufer Backwaren. Jeder eintretende Kunde zieht eine Nummer von einem fortlaufend nummerierten Band. Ein Verkäufer ruft die nächste Nummer auf, sobald er wieder frei ist. So findet jeder Kunde schnellstens den Käufer, der ihn bedient. Skizzieren Sie die Algorithmen für Kunden und Verkäufer (Lösung mittels Semaphore) Prof. W. Burkard 136 Stichworte Notizen 136