Prof. Dr. rer. nat. Roland Wism ¨uller
Aufgabenblatt 6 Musterl¨osung
Vorlesung Betriebssysteme I Wintersemester 2021/22
Aufgabe 1: Wechselseitiger Ausschluss: strikter Wechsel
Nehmen wir an, Thread 0ist wesentlich langsamerals Thread 1. Wenn Thread 0 die Variableturnauf 1 gesetzt hat, kann Thread 1 sofort in den kritischen Abschnitt eintreten, f¨uhrt diesen schnell aus und beendet auch schnell den nicht- kritischen Abschnitt. Da er dabeiturnauf 0 setzt, muss er beim Erreichen der Schleifewhile(turn != 1);warten, bis Thread 0 die Variableturnwieder auf 1 gesetzt hat, was aber sehr lange dauert. Oder anders gesagt, Thread 1 wird daran gehindert, in den kritischen Abschnitt einzutreten, obwohl sich kein Thread im kritischen Abschnitt befindet.
Aufgabe 2: Wechselseitiger Ausschluss: Strikter Wechsel
int turn = 0;
Thread i:
while (true) {
while(turn != i);
KritischerAbschnitt();
turn = (i+1) % N;
...;
}
Aufgabe 3: Wechselseitiger Ausschuss im Betriebssystem
Angenommen, eine CPU f¨uhrt gerade Betriebssystem-Code im Systemmodus aus und ist in den kritischen Abschnitt ein- getreten. Nun trifft ein Interrupt bei der CPU ein. Die CPU unterbricht daraufhin die Abarbeitung dieses Codes und springt in die entsprechende Interrupt-Behandlungsroutine. Wenn diese nun versucht, in den kritischen Abschnitt einzutreten, ge- lingt dies nicht, da der kritische Abschnitt schon belegt ist. Die CPU f¨uhrt also eine Warteschleife aus. Das bedeutet aber, daß die Interrupt-Behandlungsroutine nicht zur¨uckkehrt und damit der unterbrochene Code auch nicht weitergef¨uhrt wird.
Also wird der kritische Abschnitt nie mehr frei und das System befindet sich in einem Deadlock.
Aufgabe 4: Synchronisation mit Semaphoren
F¨ur jedes Buch gibt es ein Semaphor, das mit der Anzahl der vorhandenen Exemplare initialisiert wird. Jeder Student fordert ein Exemplar von jedem Buch an, schreibt seine Arbeit und gibt dann die B¨ucher wieder frei.
Semaphore Buch1 = 3;
Semaphore Buch2 = 2;
Semaphore Buch3 = 2;
Prozess Student:
1
Buch1.P();
Buch2.P();
Buch3.P();
// Bachelor−Arbeit schreiben Buch3.V();
Buch2.V();
Buch1.V();
Aufgabe 5: Streng abwechselnde Synchronisation
a)
Semaphore s1 = 1;
Semaphore s2 = 0;
Thread 0: Thread 1:
while (true) {
P(s1);
print(”1”);
V(s2);
}
while (true) {
P(s2);
print(”2”);
V(s1);
}
b) Prozess 0 kann die Schleife beliebig oft hintereinander durchlaufen, wobei jedes Mal das Semaphors2hochgez¨ahlt wird. Prozess 1 kann die Schleife immer so oft hintereinander ausf¨uhren, wies2angibt.
M¨ogliche unzul¨assige Ausgaben sind z.B.: 112,... oder 111121222111...
Allgemein gilt f¨ur jedes Pr¨afix der Ausgabe, daß die Zahl der Einsen immer gr¨oßer oder gleich der Zahl der Zweien sein muß.
Aufgabe 6: Synchronisation mit Semaphoren
a)
Semaphore Schal = 1;
Semaphore M¨utze = 1;
Semaphore Handschuhe = 1;
Kind mit Schal: Kind mit M ¨utze: Kind mit Handschuhen:
{
M¨utze.P();
Handschuhe.P();
// draussen spielen Handschuhe.V();
M¨utze.V();
}
{
Handschuhe.P();
Schal.P();
// draussen spielen Schal.V();
Handschuhe.V();
}
{
M¨utze.P();
Schal.P();
// draussen spielen Schal.V();
M¨utze.V();
}
b) Die oben angegebene L¨osung kann sich nicht verklemmen, sie ist also deadlock-frei. Dies liegt an der speziellen Reihenfolge, in der die
”Betriebsmittel“ angefordert werden (siehe Abschnitt 4.3.3 der Vorlesung). W¨urde man z.B. die beidenP-Operationen beim dritten Kind vertauschen, entst¨unde ein Deadlock, wenn die drei Prozesse sich (nahezu) gleichzeitig das jeweils erste Betriebsmittel
”schnappen“.
2