Eine weitere Idee wäre Prozesse anstatt sie aktiv warten zu lassen in den blockierten Zustand zu versetzen. Dann kann es auch nicht mehr vorkommen, dass ein Prozess, der sich im aktiven Warten befindet, sehr viel Rechenzeit zugeordnet bekommt. Betrachten wir dazu ein weiteres Beispiel das auf kritische Ressourcen zugreift, das Erzeuger-Verbraucher-Problem5.2
In dem C-Programm in Abbildung
wird
davon ausgegangen, dass in C Betriebssystemaufrufe
sleep,
welcher sich selber blockiert (schlafen legt), und
wakeup(process), welcher den
Prozess process vom blockierten in den rechenbereiten Zustand
überführt (aufweckt), existieren. Vergleiche Abbildung
.
Das Beispiel in Abbildung
führt genauso wie das
Druckerbeispiel am Anfang des Kapitels
möglicherweise zu großen Problemen. Nehmen wir an, der Verbraucher stellt im Moment
fest, dass count den Wert 0 hat, legt sich aber noch nicht schlafen,
sondern wird vom Scheduler in den rechenbereiten Zustand gesetzt. Der Scheduler
setzt nun den Erzeuger in den rechnenden Zustand. Der Erzeuger setzt die
Variable count auf 1 und sendet an den rechenbereiten Zustand
consumer eine wakeup-Signal. Dieser ignoriert dieses Signal,
weil er ja wach ist und legt sich schlafen, wenn er vom Scheduler wieder in der
rechnenden Zustand versetzt wird. Der Erzeuger arbeitet dann bis der Puffer
voll ist und legt sich auch schlafen. Nun sind beide Prozesse blockiert und das
System arbeitet nicht mehr. Wir haben einen Deadlock erreicht.