理想的には、継承された優先度レベルが低くなると、段階的に実行されます。優先度レベルを上げる原因となった各依存関係が削除されると、継承された優先度レベルは、残りの最も高い依存関係の優先度レベルまで低下するはずです。
例えば:
タスクA(100が80にバンプ)には、タスクB(pri 90)とタスクC(pri 80)がそれぞれ保留中の2つのミューテックス(XとY)があります。タスクAがミューテックスYをタスクCに放棄すると、優先度が90に低下すると予想される場合があります。最終的にミューテックスXをタスクBに放棄すると、優先度レベルが100に低下すると予想されます。
優先度継承は、VxWorksではそのようには機能しません。
どのように機能するかは、使用しているVxWorksのバージョンによって異なります。
VxWorks6.0より前
ミューテックスセマフォをロックしているタスクが最後の反転セーフミューテックス セマフォを放棄するまで、優先度レベルは「バンプアップ」されたままになります。
上記の例を使用すると、タスクAがミューテックスYをタスクCに放棄した場合、その優先度は80のままです。ミューテックスXをタスクBに放棄した後、優先度は100に戻ります(90をスキップ)。
カーブボール#1をミックスに入れましょう。このすべてが進行している間、タスクAがミューテックスZをロックしていたが、誰もZを保留していない場合はどうなりますか?その場合、優先度レベルはZが放棄されるまで80のままになり、その後100に戻ります。
なぜこのようにするのですか?
シンプルで、ほとんどの場合、それで十分です。ただし、「カーブボール#1」が出た場合、必要以上に優先度が高くなることを意味します。
VxWorks 6.0+
ミューテックスセマフォをロックしているタスクが、優先度レベルの引き上げに貢献した最後の反転セーフミューテックスを放棄するまで、優先度レベルは引き上げられたままになります。
この改善により、「カーブボール#1」の問題が回避されます。独自の制限があります。たとえば、タスクAがセマフォを放棄するのを待っている間にタスクBおよび/またはタスクCがタイムアウトした場合、タスクAの優先度レベルはセマフォを放棄するまで再計算されません。