1

異なる優先順位で実行されている3つのタスクがあります:A(120)、B(110)、C(100)。Aは、反転セーフフラグを使用してミューテックスセマフォを取得します。タスクBはsemTakeを実行します。これにより、タスクAの優先度が110に引き上げられます。その後、タスクCがsemTakeを実行します。タスクAの優先度は100になりました。

この時点で、Aはセマフォを解放し、Cはそれを取得します。Aの優先度が元の優先度の120に戻らなかったことがわかります。Aの優先度をすぐに復元する必要がありますか?

4

1 に答える 1

5

理想的には、継承された優先度レベルが低くなると、段階的に実行されます。優先度レベルを上げる原因となった各依存関係が削除されると、継承された優先度レベルは、残りの最も高い依存関係の優先度レベルまで低下するはずです。
例えば:

タスク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の優先度レベルはセマフォを放棄するまで再計算されません。

于 2008-09-20T13:17:19.360 に答える