Share via


優先度の逆転

優先度反転と呼ばれる現象は、優先度の高いスレッドが、関連のない中優先度スレッドが存在するために処理できない低優先度スレッドによって保持されているリソースを待っている間、無期限に遅延され続行できない場合に発生します。 その結果、優先度の高いスレッドは、より優先度の低い中優先度スレッドによって CPU へのアクセスを実質的に拒否されます。

たとえば、優先度 4 で実行されているスレッド T1 は、ロックを取得した後、より優先度の高い、優先度 8 のスレッド T2 によって割り込まれています。 その後、優先度 12 のスレッド T3 が到着し、T2 に割り込み、T1 が保持しているロックを取得しようとしてブロックされます。 この時点で、T1 と T2 の両方を実行する準備が整いましたが、T2 の方が優先度が高いため、T2 の実行が継続されます。T1 を実行してロックを解除することができないため、より優先度の高いスレッドである T3 の進行が事実上妨げられます。

スレッド スケジューラは、AutoBoost と呼ばれる機能を使用してこの問題に対処します。 AutoBoost は、リソース予約を自動的に追跡し、決して下回ってはならない優先度の下限を適用してスレッドの優先度を調整します。 たとえば、優先度の低いスレッドがクリティカル セクションを取得し、優先度の高いスレッドがクリティカル セクションを待機してブロックされた場合、所有者の優先度は、そのスレッドがリソースを解放するまで待機者の最大優先度まで引き上げられます。