2008-09-20 5 views
0

Nous avons 3 tâches exécutées selon différentes priorités: A (120), B (110), C (100). A prend un sémaphore mutex avec le drapeau Inversion Safe. La tâche B effectue un semTake, ce qui entraîne l'élévation de la priorité de la tâche A à 110. Plus tard, la tâche C effectue un semTake. La priorité de la tâche A est maintenant 100.Comment VxWorks traite-t-il l'héritage prioritaire?

À ce stade, A libère le sémaphore et C le saisit. Nous remarquons que la priorité de A n'est pas revenue à sa priorité d'origine de 120. La priorité de A ne devrait-elle pas être restaurée tout de suite?

Répondre

4

Idéalement, lorsque le niveau de priorité hérité est abaissé, il sera effectué par paliers. Au fur et à mesure que chaque dépendance entraînant le remplacement du niveau de priorité est supprimée, le niveau de priorité hérité doit être ramené au niveau de priorité la dépendance restante la plus élevée.
Par exemple:

tâche A (100 heurté à 80) comporte deux mutex (X & Y) que les tâches B (pri 90) et de la tâche C (pri 80) sont respectivement en attente pour . Lorsque la tâche A abandonne mutex Y à la tâche C, on peut s'attendre à ce que sa priorité tombe à 90. Quand elle abandonne finalement le mutex X à la tâche B, on s'attendrait à ce que son niveau de priorité redescende à 100.

L'héritage de priorité ne fonctionne pas de cette manière dans VxWorks.
Comment cela fonctionne dépend de la version de VxWorks que vous utilisez.

pré-VxWorks 6.0

Le niveau de priorité reste « cogné » jusqu'à ce que la tâche qui a le verrou sur la sémaphores mutex donne son dernier sémaphores mutex sécurité d'inversion.

En utilisant l'exemple ci-dessus, lorsque la tâche A abandonne mutex Y à la tâche C, sa priorité reste à 80. Après abandonne mutex X à tâche B, sa priorité sera ramené à 100 (sauter 90). Jetons la balle courbe # 1 dans le mixage. Que se passerait-il si la tâche A avait un verrou sur le mutex Z alors que tout cela se passait, mais personne n'était en attente sur Z? Dans ce cas , le niveau de priorité restera à 80 jusqu'à ce que Z est abandonné - puis il retombera à 100.

Pourquoi le faire de cette façon?
C'est simple, et dans la plupart des cas, c'est assez bon . Cependant, cela signifie que lorsque la «balle de courbe n ° 1» entre en jeu , la priorité restera plus élevée pendant une période plus longue que est nécessaire.

VxWorks 6.0+

Le niveau de priorité maintenant reste élevée jusqu'à ce que la tâche qui a le verrou sur le mutex sémaphores abandonne sa dernière inversion mutex sûre qui a contribué à élever le niveau de priorité.Cette amélioration permet d'éviter le problème de "courbe bille # 1". Il a ses propres limites. Par exemple, si la tâche B et/ou la tâche C quitte (s) en attendant que la tâche A abandonne les sémaphores, le niveau de priorité de la tâche A n'est pas recalculé jusqu'à ce qu'il abandonne le sémaphore.

Questions connexes