優先継承の意味がわかりました。また、Mars Pathfinder のシステム リセットの問題から、ほとんどの場合、操作の重要性にもよりますが、優先度の継承を有効化/実装することをお勧めします。
ただし、優先度の継承が望ましくない場合や、有効化/実装した場合に実際に問題が発生する可能性がある場合はありますか? もしそうなら、できれば問題を説明しながら、例を挙げていただけますか?
優先継承の意味がわかりました。また、Mars Pathfinder のシステム リセットの問題から、ほとんどの場合、操作の重要性にもよりますが、優先度の継承を有効化/実装することをお勧めします。
ただし、優先度の継承が望ましくない場合や、有効化/実装した場合に実際に問題が発生する可能性がある場合はありますか? もしそうなら、できれば問題を説明しながら、例を挙げていただけますか?
OPは、優先度の継承が望ましい例を示しています。ここでは、優先度が最も高いスレッドと最も低いスレッドとの間のミューテックスで保護された短いトランザクションと、優先度の継承が使用されていない場合にトランザクションをブロックする可能性がある中程度の優先度の実行時間の長いスレッドがあります。また、この例では、優先度の高いスレッドが優先度の高いスレッドよりもアプリケーションにとって重要です。
優先順位の継承を望ましくないものにするために、これらすべての仮定が上記の例とは逆になるアプリケーションを作成できます。中優先度のスレッドがそのタスクを実行するために利用できる時間よりも、優先度が最も高いスレッドと最も低いスレッド間のトランザクションを長くしましょう。そして、この優先度が中程度のスレッドの結果が優先度の高いスレッドの結果よりも重要であると仮定しましょう。
優先度の高いスレッドで 1 秒あたり 100 の割り込みを処理する必要があるアプリケーションを想像してください。また、優先度が中程度のスレッドで 1 秒あたり 10 回の割り込みが発生します (各割り込みの処理には 30 ミリ秒が必要です)。優先度の低いスレッドが一部のリソースをロックする可能性があります (優先度の高いスレッドと一緒に使用されます)。また、(ごくまれに) 長時間 (1 秒) ロックされることもあります。優先度の継承により、優先度の高いスレッドがこのリソースに最初にアクセスすると、最大 1 秒間、バックグラウンド スレッドの優先度が上がります。そのため、中優先度のスレッドは 10 回の割り込みを逃します。同時に、優先順位の高いスレッドが 100 の割り込みを逃す可能性があります。優先度の継承がなければ、中優先度のスレッドはすべての割り込みを処理しますが、高優先度のスレッドは最大 130 の割り込みを逃します。優先度が中程度のスレッドが提供する割り込みの方が価値がある場合、
このような実際のアプリケーションは見たことがありません。そこで、このケースを説明するために 1 つを考え出しました。バックグラウンドでのコンピューター ビジョン タスクと (追加のボーナスとして) サウンド レコーディングを備えたビデオ キャプチャ アプリケーションとします。ビデオ フレームは中優先度のスレッドによってキャプチャされます。サウンドは優先度の高いスレッドによってキャプチャされます (そうしないと、ビデオ キャプチャ プロセスがサウンド割り込みの大部分をブロックする可能性があるため)。ビデオは事前に割り当てられたバッファにキャプチャされます。音声は無音圧縮でキャプチャされます (無音をキャプチャするためにメモリは必要ありません)。そのため、オーディオ スレッドには動的に割り当てられたメモリ ブロックが必要です (これが共有リソースです)。コンピューター ビジョン タスクは、メモリ ブロックを割り当てることもあります。メモリ不足になると、ガベージ コレクタ スレッドがメモリ割り当てをブロックし、何らかの作業を行います。ここでは、優先継承のないビデオ キャプチャは問題なく動作します。
また、優先度の継承が何のメリットももたらさないアプリケーションもあります。
このような場合に優先度の継承が有効になっている場合、カーネルでの優先度の継承の実装には追加のリソースが必要になる可能性が高いため、パフォーマンス (または電力効率) の低下はある程度しか発生しません。