next up previous contents
Next: Semaphore Up: Prozesssynchronisation Previous: TSL-Instruktion   Contents

Zustandsveränderungen von Prozessen

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

Figure: Erzeuger-Verbraucher-Problem mit kritischen Ressourcen
\begin{figure}\begin{center}
\begin{program}
void producer ()
\{
int item;
\...
...item(); /* verarbeite Eintrag */
\}
\}
\end{program} \end{center}\end{figure}

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.


next up previous contents
Next: Semaphore Up: Prozesssynchronisation Previous: TSL-Instruktion   Contents
Prof. Dr. Pluemicke 2003-05-10