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