· 

Können Zombie-Threads verhungern?

1. Einführung

Wie du aus meinem Artikel zum Vergleich Prozessen und Threads weißt, sind Threads leichtgewichtige Prozesse, die immer Teil eines Prozesses sind. 


2. Thread-Zustände

Threads können sich zu ihren Lebzeiten in verschiedenen Zuständen befinden.

Zuerst wird ein Thread erzeugt und befindet sich dann in dem Zustand "Ready". Hierbei wartet er darauf, dass er die CPU erhält. Wenn ihm die CPU zugeteilt wird, befindet er sich im Zustand "Running". In diesem Zustand arbeitet er seinen Task ab und wird nach der Ausführung beendet. Allerdings kann es passieren, dass der Thread zur Ausführung seines Tasks auf ein bestimmtes Ereignis (wie z. B. das Vorhandensein einer bestimmten Datei) wartet und währenddessen blockiert wird. Dann befindet er sich im Zustand "Blocked". Wenn das Ereignis, auf das der Thread wartet, eintritt, wird er wieder in den Zustand "Running" versetzt. Ein Thread kann oft nicht unterbrechungsfrei seinen Task abarbeiten, da er abhängig vom verwendeten Scheduling-Algorithmus nur für eine bestimmte Zeit die CPU erhält.


3. Starvation (wenn ein Thread verhungert)

Der Scheduler reiht alle Threads, welche die CPU erhalten wollen, in eine Warteschlange (Queue) ein. Wenn ein Thread im Zustand "Running" beendet ist, kann er in der Warteschlange nach vorne rücken. Es gibt allerdings mehrere Situationen, die das Vorrücken verzögern oder gar verhindern können, weil beim prioritätsbasierten Scheduling z. B. Threads mit hoher Priorität bevorzugt werden. Es kann auch passieren, dass ein hochpriorer Thread sofort wieder um einen Platz auf der CPU bewirbt und der wartende Thread somit nicht zum Zug kommt. Da für einen Thread die CPU wie für uns Menschen die Nahrung ist, spricht man in solchen Situationen von einem verhungernden Thread, da er lange Zeit (und im schlimmsten Fall gar nicht) zum Zug kommt. Diese Gefahr ist vor allem dann gegeben, wenn Betriebsmittel durch bestimmte Threads exklusiv belegt werden.


4. Zombie-Threads

Über das, was im Betriebssystem passiert, wird akribisch Buch geführt. Wenn ein Thread (z. B. durch einen unvorhergesehenen Fehler oder Unachtsamkeit des Programmierers) nicht sauber beendet wird, dann entsteht ein sogenannter Zombie-Thread. Hierbei handelt es sich um einen Thread, der eigentlich bereits beendet ist, aber über den noch Informationen in der Thread- bzw. Prozesstabelle vorhanden sind. Prozesse können so z. B. nachträglich noch auf Exit-Codes des jeweiligen Threads zugreifen. Wenn ein Prozess seine Threads durchsucht, taucht dieser auf, obwohl er bereits tot ist und eigentlich entfernt gehört. Erst wenn der Parent-Thread bzw. der Prozess "stirbt", "stirbt" auch dieser Zombie-Thread richtig. Man kann sie also weder töten, noch können sie verhungern, da sie bereits beendet sind und keine Audienz bei der CPU benötigen.