ミューテックスを実装する際には、次のようないくつかのアーキテクチャの選択肢があります。
回転ミューテックス (スピンロック)
ミューテックスのスリープ中 (WAITING の間、FIFO スリープ キューが維持されます)
ミューテックスを譲る (WAITING 時にスケジューラーを呼び出して別のプロセスを実行する)
Yielding Mutex が最も好まれないのはなぜですか? また、それを使用した場合の結果はどれほど深刻でしょうか?
ミューテックスを実装する際には、次のようないくつかのアーキテクチャの選択肢があります。
回転ミューテックス (スピンロック)
ミューテックスのスリープ中 (WAITING の間、FIFO スリープ キューが維持されます)
ミューテックスを譲る (WAITING 時にスケジューラーを呼び出して別のプロセスを実行する)
Yielding Mutex が最も好まれないのはなぜですか? また、それを使用した場合の結果はどれほど深刻でしょうか?
スリープ中のミューテックスはより公平です。ミューテックスを解放すると、飢餓が発生する可能性があります。
譲歩モデルの問題点は、他のプロセスがミューテックスをスクープしている間 ( bargingも参照)、プロセスが何度も譲歩を求められるか、はるかに短い時間だけ待機する必要があることです。
新しいプロセスがキューに追加される方法によっては、特定のプロセスが順番に達するたびに、ミューテックスが既に使用されているために強制的に譲歩され、プロセスが枯渇することさえあります。
FIFO モデルは、待機中のプロセスが先着順で提供されることを保証します。OS に実装するのは難しいですが、より公平です。
モデルはより複雑になる可能性があります。たとえば、OS にもプロセスの優先順位がある場合があり、優先順位は時間の経過とともに変化する可能性があります。その場合、キュー システムの実装はさらに難しくなる可能性があります。