3.2.11.2.1 Aktives Warten mit while

[gesichtete Version][gesichtete Version]
(LOOP2 Upgrade)
Zeile 50: Zeile 50:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Die Bedeutung des Semikolons!">
<loop_task title="Die Bedeutung des Semikolons!" id="5fa9783c7053a">
<p>
<p>
Die Codezeile
Die Codezeile
Zeile 90: Zeile 90:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Aktives Warten implementieren">
<loop_task title="Aktives Warten implementieren" id="5fa9783c70548">
<p>
<p>
Tu es! Füge den für das aktive Warten nötigen Code dem [[Kritischer_Abschnitt#Beispiel_zu_kritischen_Abschnitten|Beispielprogramm]] hinzu.
Tu es! Füge den für das aktive Warten nötigen Code dem [[Kritischer_Abschnitt#Beispiel_zu_kritischen_Abschnitten|Beispielprogramm]] hinzu.
Zeile 96: Zeile 96:
<spoiler text="Lösung">
<spoiler text="Lösung">
<p>
<p>
<loop_listing title="Beispiel: Aktives Warten" description="Ein Java-Programm mit zwei Threads. Die Sperrvariable soll ein gleichzeitiges Betreten der kritischen Abschnitte durch beide Threads verhindern.">
<loop_listing title="Beispiel: Aktives Warten" description="Ein Java-Programm mit zwei Threads. Die Sperrvariable soll ein gleichzeitiges Betreten der kritischen Abschnitte durch beide Threads verhindern." id="5fa9783c70553">
<source lang="java" line="true">
<source lang="java" line="true">
public class Beispiel_Aktives_Warten {
public class Beispiel_Aktives_Warten {
Zeile 186: Zeile 186:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Warte aktiv!">
<loop_task title="Warte aktiv!" id="5fa9783c7055d">
<p>
<p>
Spiele in deiner Lerngruppe das Verhalten der beiden Threads aus der [[Aktives_Warten#Aufgabe_2|Lösung zu Aufgabe 2]] durch. Bedenke:
Spiele in deiner Lerngruppe das Verhalten der beiden Threads aus der [[Aktives_Warten#Aufgabe_2|Lösung zu Aufgabe 2]] durch. Bedenke:
Zeile 202: Zeile 202:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Der Nachteil des aktiven Wartens">
<loop_task title="Der Nachteil des aktiven Wartens" id="5fa9783c70567">
<p>
<p>
Welchen großen Nachteil besitzen alle Verfahren, die nach dem Prinzip des aktiven Wartens verfahren?
Welchen großen Nachteil besitzen alle Verfahren, die nach dem Prinzip des aktiven Wartens verfahren?

Version vom 9. November 2020, 19:11 Uhr

Aktives Warten mit while

Der Code des bereits bekannten Beispiels zu kritischen Abschnitten wird um eine (globale) Sperrvariable erweitert, beide Threads haben damit Zugriff auf diese Variable:

Code

static int lock = 0;

Besitzt lock den Wert Null, so definiert man, dass sich aktuell kein Prozess oder Thread in seinem kritischen Abschnitt befindet. Der kritische Abschnitt darf also betreten werden, dabei muss lock auf Eins gesetzt werden.

Direkt bevor der kritische Abschnitt wieder verlassen wird, wird lock auf Null zurück gesetzt.

Alle beteiligten Prozesse oder Threads müssen beim Betreten eines kritischen Bereichs den Wert von lock prüfen, und gegebenenfalls warten.

Code

Beim Betreten des kritischen Abschnitts:

while (lock == 1);
lock = 1;

Code

Direkt vor dem Verlassen des kritischen Abschnitts:

lock = 0;


Aufgabe 1

Aufgabe

Die Codezeile

while (lock == 1);

ist sehr wichtig. Hier wird der Wert von lock geprüft und gegebenenfalls gewartet. Die Sache mit dem Warten kannst du aber nur verstehen, wenn du die Bedeutung des Semikolons ganz am Ende der Codezeile kennst.

Erläutere:
Welche Bedeutung hat das Semikolon in Verbindung mit dem while?

Und was würde passieren, wenn das Semikolon versehentlich fehlt:

while (lock == 1)        // Hier fehlt das Semikolon, Programmierfehler!
lock = 1;

(PS.: Die while-Schleife ist auch der Grund für den großen Nachteil des aktiven Wartens, siehe letzte Aufgabe ganz unten auf dieser Seite!)


Nachdem nun bekannt ist, welcher Code zur Implementierung des aktiven Wartens notwendig ist, kann dieser an den entsprechenden Stellen des Beispielprogramms eingepflegt werden.


Aufgabe 2

Aufgabe

Tu es! Füge den für das aktive Warten nötigen Code dem Beispielprogramm hinzu.


Hinweis

In dieser Lösung wird wieder gezeigt, wie zwei Threads durch die Sperrvariable beeinflusst werden. Es hat den Anschein, als ob ein Anwendungsprogrammierer sich darum kümmern müsste. (Das muss er nur bei den von ihm selbst geschaffenen "Betriebsmitteln". Es sei erneut auf das für diese Zwecke in Java integrierte Schlüsselwort synchronized verwiesen.)

Du musst gedanklich hier wieder den Sprung zu Prozessen schaffen, und zu den vielen Betriebsmitteln eines Computersystems, und zum Betriebssystem, und zu Systemaufrufen, über die letztlich das aktive Warten durch das Betriebssystem realisiert werden kann.

Dann verstehst du, dass sich der Programmierer des Betriebssystems darum kümmern muss!


Aufgabe 3

Aufgabe

Spiele in deiner Lerngruppe das Verhalten der beiden Threads aus der Lösung zu Aufgabe 2 durch. Bedenke:

  • Es gibt nur eine CPU mit einem Kern. Es kann also nur ein Prozess zur Zeit ausgeführt werden, es kommt zu Quasi-Parallelität.
  • Interessant ist die Situation, bei der sich bereits ein Prozess in seinem kritischen Abschnitt befindet, und die Sperre gesetzt hat.
  • Der Kontextwechsel erfolgt, und der andere Prozess muss dann an der while-Schleife warten. Tut er das?


Aufgabe 4

Aufgabe

Welchen großen Nachteil besitzen alle Verfahren, die nach dem Prinzip des aktiven Wartens verfahren?