オペレーティング システムの開発に関して、「優先度の逆転」というフレーズを聞いたことがあります。
優先順位の逆転とは具体的に何でしょうか?
解決しようとしている問題は何ですか? また、どのように解決するのでしょうか?
ベストアンサー1
優先度の異なる 3 つのタスク (tLow、tMed、tHigh) があるとします。tLow と tHigh は異なるタイミングで同じ重要なリソースにアクセスしますが、tMed は独自の処理を実行します。
- tLow は実行中、tMed と tHigh は現在ブロックされています (ただし、クリティカル セクションではありません)。
- tLow が登場し、クリティカル セクションに入ります。
- tHigh はブロックを解除し、システム内で最も優先度の高いタスクであるため実行されます。
- 次に、tHigh は重要なリソースに入ろうとしますが、tLow が存在するためブロックされます。
- tMed はブロック解除され、システム内で最も優先度の高いタスクになったため、実行されます。
tHigh は、tLow がリソースを放棄するまで実行できません。tLow は、tMed がブロックまたは終了するまで実行できません。タスクの優先順位が逆転しています。tHigh は、最も優先順位が高いにもかかわらず、実行チェーンの最下部にあります。
優先順位の逆転を「解決」するには、tLow の優先順位を少なくとも tHigh と同じレベルまで上げる必要があります。優先順位を可能な限り高いレベルまで上げる人もいます。tLow の優先順位を上げることと同じくらい重要なのは、適切なタイミングで tLow の優先順位を下げることです。システムによってアプローチは異なります。
tLow の優先度を下げるタイミングはいつですか...
- tLow が持つリソース上で他のタスクがブロックされることはありません。これは、タイムアウトまたはリソースの解放が原因である可能性があります。
- tLow の優先度を上げるのに寄与する他のタスクは、tLow が持つリソース上でブロックされていません。これは、タイムアウトまたはリソースの解放が原因である可能性があります。
- リソースを待機しているタスクが変更された場合、tLow の優先度を下げて、そのリソースでブロックされている最高優先度レベルのタスクの優先度と一致させます。
方法 2 は、tLow の優先レベルが引き上げられる時間を短縮するという点で、方法 1 よりも優れています。この期間中、tLow の優先レベルは tHigh の優先レベルのままであることに注意してください。
方法 3 では、tLow の優先レベルを、一度にすべてまたは何もせずに下げるのではなく、必要に応じて段階的に下げることができます。
システムが異なれば、重要とみなす要素に応じて、異なる方法が実装されます。
- メモリフットプリント
- 複雑
- リアルタイム応答性
- 開発者の知識
お役に立てれば。