オペレーティングシステム

ミューテックス

ミューテックスは鍵が1つのロックです。所有者だけが保護対象に入り、他のスレッドは解放を待ちます。

3スレッドのロックと待機列

各スレッドでlock()とunlock()を実行

クリティカルセクション

所有者がいると他は待機します。この例では解放すると列の先頭が取得します。

ミューテックスには所有者がある

取得したスレッドが解放する規則です。他スレッドからの解放は実装によってエラーなどになります。二値セマフォには所有者がなく、別スレッドから通知できます。

優先度逆転と継承の時間軸

HがLのミューテックスを待つ例

実行中(H、M、L) ロック待ち 実行可能 継承優先度で実行

継承の有無でHの終了時刻を比較してください。

優先度逆転

LのロックをHが待っている間にMがLを中断すると、Lは解放できません。その結果、高優先度HもMの終了を待たされます。

1997年の火星探査機Pathfinderの繰返しリセットも、この現象が原因でした。

優先度継承

HがLを待つとLの優先度を一時的に上げます。Mの割込みを防いで解放を早め、解放後は元に戻します。

FreeRTOSでは xSemaphoreCreateMutex()によるミューテックスに継承があり、 xSemaphoreCreateBinary()による二値セマフォにはありません。共有資源保護ではこの違いが重要です。