Partager via


Inversion de priorité

Un phénomène connu sous le nom d’inversion de priorité se produit lorsqu’un fil d’exécution de haute priorité est indéfiniment retardé en attendant une ressource détenue par un fil d’exécution de basse priorité qui ne peut pas avancer en raison de la présence d’un fil d’exécution de priorité moyenne non lié. Par conséquent, le fil d’exécution de haute priorité se voit effectivement refuser l’accès au CPU par le fil d’exécution de priorité moyenne inférieure.

Par exemple, un fil d’exécution T1 s’exécutant à une priorité de 4 est préempté par un fil d’exécution de plus haute priorité T2 avec une priorité de 8 après avoir acquis un verrou. Par la suite, un fil d’exécution T3 avec une priorité de 12 arrive, préempte T2 et se bloque en essayant d’acquérir le verrou détenu par T1. À ce stade, T1 et T2 sont prêts à s’exécuter, mais puisque T2 a une priorité plus élevée, il continue à s’exécuter, empêchant effectivement T3, un fil d’exécution de priorité plus élevée, de progresser parce que T1 est incapable de s’exécuter et de libérer le verrou.

L’ordonnanceur de fils d’exécution aborde ce problème grâce à une fonctionnalité appelée AutoBoost. AutoBoost suit automatiquement les réservations de ressources et ajuste les priorités des fils d’exécution en appliquant des planchers de priorité que le fil d’exécution ne doit jamais descendre en dessous. Par exemple, si un fil d’exécution de basse priorité acquiert une section critique et qu’un fil d’exécution de plus haute priorité est bloqué en attendant la section critique, la priorité du propriétaire est élevée à la priorité maximale de l’attente jusqu’à ce qu’il libère la ressource.