- Betriebssysteme WiSe 2010 / Übungsblatt 10
- -------------------------------------------
- 37)
- (a)
- Mit Hilfe von Semaphoren kann der Zugriff von mehreren Prozessen
- auf einen kritischen Bereich geregelt werden.
- Ein Semaphor S ist eine Integervariable, die nur durch 3 atomare
- Operationen verändert werden kann
- - init(S, Anfangswert) setzt S auf den Anfangswert (Initialisierung)
- - wait(S) oder auch P(S) versucht S zu verringern (Dekrementierung)
- - signal(S) oder auch V(S) erhöht S (Inkrementierung)
- Man muss also in seinem Programm z.B. folgendermaßen vorgehen:
- init(S, 1);
- ...
- wait(S)
- <kritischer Bereich>
- signal(S)
- ...
- (b)
- Der Anfangswert gibt an, wie viele Prozesse gleichzeitig auf den
- kritischen Bereich zugreifen dürfen.
- (c)
- Bei Vertauschung der Zeilen 3 und 4 in Prozess P1 kann es zu einem
- Deadlock kommen.
- 38)
- (a)
- Es kann beispielsweise passieren, dass ein Druckauftrag in der War-
- teschlange verloren wird, weil er durch eine Racecondition von einem
- anderem überschrieben wird. Gleichzeitig entsteht dadurch auch leere
- Plätze in der Warteschlange.
- Aktiver Prozess | ausgeführte Codezeile | Inhalt von W | Inhalt von next | Kommentar
- ----------------|-----------------------|---------------------|-----------------|-----------
- P1 | W[next] = ptr_file1; | [filexy, ptr_file1] | 1 | Eintrag des Jobs des ersten Proezsses in die Queue
- ----------------|-----------------------|---------------------|-----------------|-----------
- P2 | W[next] = ptr_file2; | [filexy, ptr_file2] | 1 | Eintrag des Jobs des zweiten Proezsses in die Queue (Bereits vorhandener Job an dieser Position wird übeschrieben!)
- ----------------|-----------------------|---------------------|-----------------|-----------
- P2 | next = next + 1; | [filexy, ptr_file2] | 2 | Erhöhung des Index-Zählers
- ----------------|-----------------------|---------------------|-----------------|-----------
- P1 | next = next + 1; | [filexy, ptr_file2] | 3 | Erhöhung des Index-Zählers
- ----------------|-----------------------|---------------------|-----------------|-----------
- Jetzt ist der ptr_file2-Druckjob verloren gegangen und an Index 2
- in der Warteschlange ein "Loch" entstanden.
- (b)
- Prozess P1:
- ...
- flag[0] = true;
- turn = 1;
- while(flag[0] && turn == 1) {
- /* do nothing */
- }
- W[next] = ptr_file1;
- next = next + 1;
- flag[0] = false;
- ...
- Prozess P2:
- ...
- flag[1] = true;
- turn = 0;
- while(flag[0] && turn == 0) {
- /* do nothing */
- }
- W[next] = ptr_file2;
- next = next + 1;
- flag[1] = false;
- ...
- (c)
- Der Nachteil dieses Ansatzes ist, dass wartende Prozesse
- den Prozessor nicht abgeben sondern ihn durch "Busy Wait"
- weiter beanspruchen
- 39)
- (a)
- Aktiver Prozess | ausgeführte Codezeile | Inhalt von k | Inhalt von b | Kommentar
- ----------------|-----------------------|--------------|--------------|-----------
- Ehemann | b = k; | 200 | 200 | Prozess fragt Kontostand ab
- ----------------|-----------------------|--------------|--------------|-----------
- Ehefrau | b = k; | 200 | 200 | Prozess fragt Kontostand ab
- ----------------|-----------------------|--------------|--------------|-----------
- Ehefrau | b = b - 100; | 200 | 100 | Prozess berechnet intern neuen Kontostand
- ----------------|-----------------------|--------------|--------------|-----------
- Ehefrau | k = b; | 100 | 100 | Prozess weisst neuen Kontostand zu
- ----------------|-----------------------|--------------|--------------|-----------
- Ehemann | b = b + 400; | 100 | 600 | Prozess berechnet intern neuen Kontostand
- ----------------|-----------------------|--------------|--------------|-----------
- Ehemann | k = b; | 600 | 600 | Prozess weisst neuen Kontostand zu (RACECONDITION!)
- ----------------|-----------------------|--------------|--------------|-----------
- Der Kontostand beträgt wegen der Racecondition jetzt 600 Euro statt
- 500 Euro.
- (b)
- Zur Verhinderung von Raceconditions müssen folgende Bedingungen
- erfüllt sein:
- - Mutual exclusion:
- Zu jedem Zeitpunkt darf sich höchstens ein Prozess im kriti-
- schen Bereich befinden
- - Progress:
- Befindet sich kein Prozess im kritischen Bereich, aber es gibt
- einen Kandidaten für diesen Bereich, so hängt die Entscheidung,
- welcher Prozess ihn betreten darf, nur von diesem Kandidaten ab
- und fällt in endlicher Zeit. Der Fall, dass ein Prozess im kri-
- tischen Bereich terminiert darf keinen Einfluss haben.
- - Bounded Waiting:
- Zwischen der Anforderung eines Prozesses, in den kritischen Be-
- reich einzutreten und dem tatsächlichen Eintreten in den kriti-
- schen Bereich kann eine gewisse Zeitdauer liegen. Allerdings muss
- es für die Wartezeit einen angebbare, maximalen Wert geben.
- - Vermeidung von "Circular Wait":
- Es soll vermieden werden, dass eine geschlossene Kette von Pro-
- zessen entsteht, sodass jeder Prozess mind. enie Ressource hält,
- die von einem anderem Prozess benötigt wird.
- (c)
- (i)
- Aktiver Prozess | ausgeführte Codezeile | Inhalt von k | Inhalt von b | Inhalt von x | Inhalt von y | Kommentar
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehemann | x = false; | 200 | 0 | false | false |
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehefrau | y = false; | 200 | 0 | false | false |
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehemann | while(y) {...} | 200 | 0 | false | false | Überspringung der while-Schleife (d.h. es folgt Eintritt in den kritischen Bereich)
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehefrau | while(x) {...} | 200 | 0 | false | false | Überspringung der while-Schleife (d.h. es folgt Eintritt in den kritischen Bereich)
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehefrau | y = true; | 200 | 0 | false | true |
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehefrau | b = k; | 200 | 200 | false | true | Abfrage des Kontostandes
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehemann | x = true; | 200 | 0 | true | true |
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehemann | b = k; | 200 | 200 | true | true | Abfrage des Kontostandes
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehefrau | b = b + 400; | 200 | 600 | true | true | Interne Berechnung des neuen Kontostands
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehefrau | k = b; | 600 | 600 | true | true | Zuweisung des neuen Kontostands
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehefrau | y = false; | 600 | 600 | true | false |
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehemann | b = b - 100; | 100 | 600 | true | false | Interne Berechnung des neuen Kontostands
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehemann | k = b; | 100 | 100 | true | false | Zuweisung des neuen Kontostands
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Ehemann | x = false; | 100 | 100 | false | false |
- ----------------|-----------------------|--------------|--------------|--------------|--------------|-----------
- Die Bedingung "Mutual exclusion" wird verletzt, d.h. es befinden
- sich beide Prozesse gleichzeitig im kritischen Bereich.
- Dadurch kommt am Ende der Kontostand von 100 statt 500 Eur zustande.
- (ii)
- Aktiver Prozess | ausgeführte Codezeile | Inhalt von k | Inhalt von b | Inhalt von x | Inhalt von y | Inhalt von z | Kommentar
- ----------------|-----------------------|--------------|--------------|--------------|--------------|--------------|-----------
- Ehemann | x = true; | 100 | 0 | true | false | 0 |
- ----------------|-----------------------|--------------|--------------|--------------|--------------|--------------|-----------
- Ehefrau | y = true; | 100 | 0 | true | true | 0 |
- ----------------|-----------------------|--------------|--------------|--------------|--------------|--------------|-----------
- Ehefrau | z = 1; | 100 | 0 | true | true | 1 |
- ----------------|-----------------------|--------------|--------------|--------------|--------------|--------------|-----------
- Ehemann | z = 0; | 100 | 0 | true | true | 0 |
- ----------------|-----------------------|--------------|--------------|--------------|--------------|--------------|-----------
- Ehemann | while(z==1 || y){...} | 100 | 0 | true | true | 0 | Prozess muss solange Warten, bis Variablen entsprechend geändert werden
- ----------------|-----------------------|--------------|--------------|--------------|--------------|--------------|-----------
- Ehefrau | while(z==0 || x){...} | 100 | 0 | true | true | 0 | Prozess muss solange Warten, bis Variablen entsprechend geändert werden
- ----------------|-----------------------|--------------|--------------|--------------|--------------|--------------|-----------
- Die letzten beiden Schritte wiederholen sich jetzt unendlich oft
- in beliebiger Reihenfolge, da wegen einer Racecondition ein Dead-
- lock eingetreten ist.
- Da beide Prozesse gegenseitig Variablenänderungen anfordern, die
- vom jeweils anderen Prozess durchgeführt werden müssen, ist
- "Circular Wait" eingetreten, also die letzte Bedingung verletzt.
- (d)
- Prozess Eheman:
- ...
- flag[0] = true;
- turn = 1;
- while(flag[0] && turn == 1) {
- /* do nothing */
- }
- b = k;
- b = b - 100;
- k = b;
- flag[0] = false;
- ...
- Prozess Ehefrau:
- ...
- flag[1] = true;
- turn = 0;
- while(flag[0] && turn == 0) {
- /* do nothing */
- }
- b = k;
- b = b - 100;
- k = b;
- flag[1] = false;
- ...