3.2.11.2 Aktives Warten

[gesichtete Version][gesichtete Version]
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 17: Zeile 17:
<loop_area type="definition">
<loop_area type="definition">
<p>
<p>
{{#index:Sperrkennzeichen|Sperrvariable|Polling}}
Unter '''aktivem Warten''' versteht man nach <cite>Mandl+2013</cite> das ständige Abfragen eines Sperrkennzeichens am Eingang eines kritischen Abschnitts.
Unter '''aktivem Warten''' versteht man nach <cite>Mandl+2013</cite> das ständige Abfragen eines Sperrkennzeichens am Eingang eines kritischen Abschnitts.
</p>
</p>
</loop_area>
</loop_area>
</p>
<p>
Die Technik des ständigen Abfragens ist in der Informatik auch als Polling bekannt. Das genannte Sperrkennzeichen kann eine von mehreren Prozessen oder Threads gemeinsam genutze Variable sein, man spricht dann von einer Sperrvariablen. Das folgende Beispiel geht darauf ein.
</p>
</p>


Zeile 25: Zeile 29:
==== Beispiel für aktives Warten ====
==== Beispiel für aktives Warten ====
<p>
<p>
Der Code des bereits bekannten [[Kritischer_Abschnitt#Beispiel_zu_kritischen_Abschnitten|Beispiels zu kritischen Abschnitten]] wird um eine (globale) Sperrvariable erweitert, beide Threads haben damit Zugriff auf diese Variable:
</p>


<p>
<loop_area type="sourcecode">
<p>
<span style="font-family:Courier">
static int lock = 0;
</span>
</p>
</loop_area>
</p>
<p>
Besitzt <span style="font-family:Courier">lock</span> 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 <span style="font-family:Courier">lock</span> auf Eins gesetzt werden.
</p>
<p>
Direkt bevor der kritische Abschnitt wieder verlassen wird, wird <span style="font-family:Courier">lock</span> auf Null zurück gesetzt.
</p>
<p>
Alle beteiligten Prozesse oder Threads müssen beim Betreten ihres kritischen Bereichs den Wert von <span style="font-family:Courier">lock</span> prüfen, und gegebenenfalls warten.
</p>
<p>
<loop_area type="sourcecode">Beim Betreten des kritischen Abschnitts:
<p>
<span style="font-family:Courier">
while (lock==1);<br />
lock = 1;
</span>
</p>
</loop_area>
</p>
<p>
<loop_area type="sourcecode">Direkt vor dem Verlassen des kritischen Abschnitts:
<p>
<span style="font-family:Courier">
lock = 0;
</span>
</p>
</loop_area>
</p>
</p>


<br />
<br />
==== Aufgabe 1 ====
==== Aufgabe 1 ====
<p>
<loop_area type="task">
<loop_task title="Die Bedeutung des Semikolons!">
<p>
Die Codezeile
</p>
<p>
<span style="font-family:Courier">while (lock==1);</span>
</p>
<p>
ist sehr wichtig. Hier wird der Wert von <span style="font-family:Courier">lock</span> 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.
</p>
<p>
Erläutere: Welche Bedeutung hat das Semikolon in Verbindung mit dem <span style="font-family:Courier">while</span>?
</p>
<p>
<small>(PS.: Die <span style="font-family:Courier">while</span>-Schleife ist auch der Grund für den großen Nachteil des aktiven Wartens, siehe letzte Aufgabe ganz unten auf dieser Seite!)</small>
</p>
</loop_task>
</loop_area>
</p>
<br />
==== Aufgabe 2 ====
<p>
<p>
<loop_area type="task">
<loop_area type="task">

Version vom 3. November 2013, 15:30 Uhr

{{#index:Aktives Warten|Warten, aktiv|Geschäftiges Warten|Busy Waiting}} Aktives Warten, manchmal auch als Geschäftiges Warten oder auf Englisch Busy Waiting bezeichnet, ist eine recht einfache Technik, um Prozesse oder Threads zu Synchronisieren.

Hinweis

Findest du heraus, welchen großen Nachteil aktives Warten besitzt? Lies' mal weiter, wir kommen ganz am Ende dieser Seite auf diese Frage zurück.


Definition: Aktives Warten

Definition

{{#index:Sperrkennzeichen|Sperrvariable|Polling}} Unter aktivem Warten versteht man nach Mandl 2013 das ständige Abfragen eines Sperrkennzeichens am Eingang eines kritischen Abschnitts.

Die Technik des ständigen Abfragens ist in der Informatik auch als Polling bekannt. Das genannte Sperrkennzeichen kann eine von mehreren Prozessen oder Threads gemeinsam genutze Variable sein, man spricht dann von einer Sperrvariablen. Das folgende Beispiel geht darauf ein.


Beispiel für aktives Warten

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 ihres 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?

(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!)


Aufgabe 2

Aufgabe

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



Diese Seite steht unter der Creative Commons Namensnennung 3.0 Unported Lizenz http://i.creativecommons.org/l/by/3.0/80x15.png