- Inversion de priorité
-
L'inversion de priorité est un phénomène qui peut se produire en programmation concurrente. Il s'agit d'une situation dans laquelle un processus de haute priorité ne peut pas avoir accès au processeur car il est utilisé par un processus de plus faible priorité.
Sommaire
Exemples
Une inversion de priorité peut se produire lorsqu'il y a accès à une même ressource demandé par des tâches de haute et de basse priorité. Si une tâche de basse priorité utilise la ressource, une tâche de haute priorité ne pourra pas prendre la main. Par exemple, avec la séquence d'opération suivante :
- La tâche A (de haute priorité) est mise en attente sur un Verrou X. Elle n'a donc plus accès à la ressource processeur.
- La tâche B (de basse priorité) acquiert un Verrou Y.
- La tâche B est préemptée car la tâche A vient d'obtenir le Verrou X.
- La tâche A essaye d'obtenir le verrou Y ; Comme il est déjà acquis par la tâche B, la tâche A est donc mise en attente.
La tâche de haute priorité n'a donc pas accès à la ressource processeur mais une tâche de basse priorité y a accès.
Un autre exemple met en œuvre trois tâches de priorités différentes. La tâche A (de plus forte priorité) et la tâche C (de plus faible priorité) peuvent toutes les deux accéder à une ressource partagée, protégée par le mutex X. Une troisième tâche B a une priorité intermédiaire entre celles de A et de C.- La tâche C s'exécute, et prend le mutex X.
- Un événement réveille la tâche B, qui préempte la tâche C. Cette dernière n'a pas libéré le mutex X.
- Un autre événement réveille la tâche A, mais celle-ci ne peut préempter à son tour la tâche B car elle est bloquée par le mutex X.
Il en résulte une inversion des priorités, la tâche B continuant de s'exécuter jusqu'à son terme, puis C, et enfin A : la tâche de plus haute priorité s'exécute en dernier ! Dans certains cas, un interblocage peut même survenir.
Pour éviter cela, certains systèmes utilisent une technique d'héritage de priorité, accordant momentanément à la tâche C la même priorité que celle de A afin de libérer la ressource au plus vite. Ainsi lorsque A est bloquée en attente du mutex X, C est autorisée à préempter B, libère le mutex X et est aussitôt préemptée par A. L'exécution se poursuit normalement avec B puis C.
Effets de l'inversion de priorité
La non gestion de l'inversion de priorité peut avoir des effets désastreux. En effet, comme la non gestion de l'inversion de priorité implique qu'une tâche de haute priorité peut ne pas s'exécuter, il est possible qu'une réaction à des situations d'urgence ne soit pas prise en compte (par exemple, un ordre d'arrêt d'urgence d'une centrale nucléaire qui serait bloqué par un autre ordre de moindre priorité).
Méthodes pour éviter l'inversion de priorité
Il n'existe pas de solution simple permettant d'éviter toutes les inversions de priorité. Il est néanmoins possible de prendre des mesures pour limiter ces risques. En particulier, il est possible de
- N'autoriser l'accès à des sections critiques qu'à des threads de même priorité.
- Utiliser des sémaphores adaptés, par exemple des sémaphores à héritage de priorité ou des sémaphores à priorité plafond.
Voir aussi
Wikimedia Foundation. 2010.