Aktives Warten
Aktives Warten oder Busy Waiting ist eine Programmiertechnik um einen Prozess (bzw. einen Thread) auf das Eintreten einer Bedingung warten zu lassen. Dabei läuft der Prozess so lange ?im Kreis?, bis die Bedingung erfüllt ist. Diese Technik wird vor allem für Spinlocks verwendet. Ein Beispiel in Pseudocode:
Funktion warte_bis (Parameter bedingung ) {
solange (nicht bedingung) { } // läuft im Kreis, bis die Bedingung erfüllt ist.
}
Das hat den großen Nachteil, dass der Prozess die volle Rechenleistung des Systems damit beansprucht, immer wieder die Bedingung zu Prüfen, und damit andere Prozesse ausbremst. Das ist vor allem auch deshalb nachteilig, weil es ja gerade die anderen Prozesse sind, die dafür sorgen müssen, dass die Bedingung erfüllt wird.
Zu einer Prioritätsinversion kann es führen, wenn der wartende Prozess (A) eine höhere Priorität im Prioritätsscheduling hat, als B, der sich in seiner kritischen Region befindet. B macht also das Warten von A überhaupt notwendig. A darf nun also exklusiv laufen und verhindert daher, dass B seine kritische Region verlassen kann. Daher kann A allerdings nie die Warteschleife verlassen.Andrew S. Tanenbaum: Moderne Betriebssysteme, Pearson Studium, 2002
Etwas besser wird die Situation, wenn das Betriebssystem (bzw. die Laufzeitumgebung) die Möglichkeit bietet, einen Prozess für eine vorgegebene Zeit ?schlafen? zu lassen. Diese Methode wird auch als slow busy waiting oder lazy polling bezeichnet. Dann lässt sich die Funktion so umsetzen:
Funktion warte_bis (Parameter bedingung) {
solange (nicht bedingung) { schlafe(1 Sekunde); } // prüft die Bedingung einmal pro Sekunde
}
Der Nachteil ist aber, dass hier häufig länger gewartet wird, als nötig wäre (nämlich bis zu einer Sekunde länger), weil die Bedingung erst wieder geprüft wird, wenn die ?Schlafzeit? abgelaufen ist. Auch wird zwar nicht mehr die volle Rechenleistung des Systems beansprucht, weil der Prozess die meiste Zeit ?schläft?, aber die Bedingung immer noch unnötig oft geprüft wird.
Aktives Warten bzw. Busy Waiting gilt im Allgemeinen als sehr schlechter Programmierstil und sollte nur als allerletzte Möglichkeit verwendet werden. Moderne Betriebssysteme bzw. Laufzeitumgebungen bieten in der Regel Locks oder Monitore an, die es erlauben, eine Bedingung nur genau dann erneut zu prüfen, wenn sich die Variablen, von denen sie abhängt, geändert haben.

