【ゆうせんどぎゃくてん】

優先度逆転 とは?

最終更新:
💡 高優先度が、低優先度側の資源解放を待つ

高優先度のタスクが、低優先度のタスクの持つロックなどの資源を待つため、低優先度側の実行に進行を左右される現象。中優先度のタスクが低優先度側を中断すると、待ちがさらに長引くことがある。

📌 このページのポイント
資源の待ちで、優先度どおりに進めない 🔒 Lが持つロックを、Hが待つ例 高 H 中 M 低 L Lのロックを待つ 実行 実行 取得 Mに中断される 解放 Hが待ちに入る Lがロック解放 Mの実行が、Lの解放とHの再開を遅らせる 優先度継承:所有者Lの優先度を一時的に上げる
1個のCPUで優先度継承を使わない典型例。横方向に時間が進み、各行は高・中・低優先度のタスク。Hのロック取得試行と切り替え時間は省略。MがLを中断してHの待ちを延ばすが、Mの存在がすべての優先度逆転に必須という意味ではない。
ひよこ ひよこ
優先度が高いなら、先に動くはずだよね?
ペンギン先生 ペンギン先生
実行できる状態なら優先されるけれど、必要なロックを低優先度のタスクが持っていると待つよ。ロックが解放されないと進めないため、低優先度側の実行に左右される。これが優先度逆転の一つの形なんだ。
ひよこ ひよこ
低優先度がロックを返せば終わるんじゃない?
ペンギン先生 ペンギン先生
そこで中優先度のタスクが低優先度側を中断すると、解放までの待ちが長引くんだ。中優先度が走り続ければ、いつ解放できるか分からなくなる。高・中・低の3タスクは典型例だけれど、中優先度の登場がすべての優先度逆転の必須条件ではないよ。
ひよこ ひよこ
優先度継承って何?
ペンギン先生 ペンギン先生
高優先度の待ち手に合わせ、ロックの所有者の実効優先度を一時的に上げる仕組みだよ。中優先度のタスクに中断されず、解放へ進めるようにする。解除時の優先度は、他に持つロックの待ち手なども考慮して調整するんだ。
ひよこ ひよこ
Linuxにもあるの?
ペンギン先生 ペンギン先生
RT-mutexが優先度継承に対応するよ。引き上げた所有者が別のRT-mutexを待っているなら、その先の所有者にも引き上げを伝える。すべてのロックが自動で同じ動作をするわけではなく、使う同期機構や設定を確認するんだ。
ひよこ ひよこ
ほかの対策はないの?
ペンギン先生 ペンギン先生
優先度上限を使う方式もあるよ。POSIXのPTHREAD_PRIO_PROTECTなら、待ち手の有無にかかわらず、所有する対象mutexの上限値も考慮して優先度を上げる。対応状況の確認に加え、資源を持つ時間や共有する範囲を見直すことも大切なんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「優先度逆転」って出てきたら「高優先度の処理が、低優先度側の資源解放に進行を左右される現象」と思えばだいたいOK!
📖 おまけ:英語の意味
「Priority Inversion」 = 優先度の逆転
💬 高優先度の処理が進みたくても低優先度側の資源解放を待つなど、優先度の順序が逆転したように見えるための名前だよ。中優先度による割り込みは、待ちを長引かせる典型例なんだ。

参考資料

← 用語集にもどる