Freigeben über


Prioritätsumkehrung

Ein als Prioritätsumkehr bekanntes Phänomen tritt auf, wenn ein Thread mit hoher Priorität auf unbestimmte Zeit verzögert wird, während er auf eine Ressource wartet, die von einem Thread mit niedriger Priorität gehalten wird, der aufgrund des Vorhandenseins eines nicht verwandten Threads mit mittlerer Priorität nicht fortgesetzt werden kann. Dadurch wird dem Thread mit hoher Priorität faktisch der Zugriff auf die CPU durch den Thread mit niedrigerer mittlerer Priorität verweigert.

Beispielsweise wird ein Thread T1, der mit der Priorität 4 ausgeführt wird, nach dem Erwerb einer Sperre von einem Thread T2 mit höherer Priorität und der Priorität 8 verdrängt. Anschließend trifft ein Thread T3 mit der Priorität 12 ein, verdrängt T2 und wird beim Versuch, die von T1 gehaltene Sperre zu erlangen, blockiert. Zu diesem Zeitpunkt sind sowohl T1 als auch T2 zur Ausführung bereit, aber da T2 eine höhere Priorität hat, wird die Ausführung fortgesetzt, wodurch effektiv verhindert wird, dass T3, ein Thread mit höherer Priorität, Fortschritte macht, da T1 die Sperre nicht ausführen und aufheben kann.

Der Threadplaner behebt dieses Problem über ein Feature namens „AutoBoost“. „AutoBoost“ verfolgt automatisch Ressourcenreservierungen und passt Thread-Prioritäten an, indem es Prioritätsuntergrenzen anwendet, die ein Thread niemals unterschreiten darf. Wenn beispielsweise ein Thread mit niedriger Priorität einen kritischen Abschnitt erwirbt und ein Thread mit höherer Priorität beim Warten auf den kritischen Abschnitt blockiert wird, wird die Priorität des Besitzers auf die maximale Priorität des wartenden Threads erhöht, bis die Ressource freigegeben wird.