ライブロック: ライブロックとは何か、例、デッドロックとの違い
⚡ スマートサマリー
ライブロックとは、並行処理においてプロセスが互いの状態変化に応じて状態を変化させ続けるものの、実際には何の進展もなく、タスクを完了したりブロックされたりすることなく、アクティブな状態を維持し、CPUサイクルを消費し続ける状況のことです。

ライブロックとは何ですか?
A ライブロック 排他ロックの要求が繰り返し拒否される状況で、多くの重複が発生しています。ping 共有ロックが互いに干渉し合っている。プロセスが頻繁に状態を変更するため、タスクを完了できない。
ライブロックの例
例1:
ライブロックの最も分かりやすい例は、廊下で二人が向かい合って行き、互いに道を譲り合う場面です。二人は同時に同じ方向に動くため、前に進むことなく左右に動き続けます。この場合、二人は決してすれ違うことはありません。
例2:
上の図では、2つのプロセスそれぞれが2つのリソースを必要とし、必要なロックを取得するために基本的なポーリング方式を使用しています。試行が失敗した場合、メソッドは再試行します。
- プロセスAはリソースYを保持している
- プロセス B はリソース X を保持します
- プロセスAにはリソースXが必要です
- プロセスBにはリソースYが必要です
プロセスAが最初に実行され、リソースXを取得し、次にプロセスBが実行されてリソースYを取得すると仮定します。どちらのプロセスが先に実行されても、どちらのプロセスもそれ以上の進展は見られません。
しかし、どちらのプロセスもブロックされることはありません。処理が進まないままCPUリソースを繰り返し消費しますが、処理ブロックによって停止することはありません。
したがって、この状況は デッドロックなぜなら、どのプロセスもブロックされないからです。その代わりに、デッドロックと同等の状況、つまりライブロックと呼ばれる状況に直面します。
ライブロックの原因は何ですか?
ライブロックは、システムが許可するプロセス数、つまりプロセステーブルのエントリ総数によって決まります。したがって、これらのプロセステーブルのスロットは有限のリソースとして扱われます。プロセスがこれらの限られたリソースを繰り返し試行し、互いに譲り合う状態が続くと、どのプロセスも処理を進めることができなくなり、システムはライブロック状態に陥ります。
デッドロックとは何ですか?
A デッドロック デッドロックとは、別の待機中のプロセスが要求されたリソースを保持しているために、あるプロセスが待機状態に入ったときにオペレーティングシステム内で発生する状況です。デッドロックはマルチプロセッシングでよく発生する問題で、複数のプロセスがソフトロックまたはソフトウェアロックと呼ばれる特定の種類の相互排他的なリソースを共有します。
デッドロックの例
- 現実世界の例としては、一方通行の交通状況が挙げられます。
- ここでは、ブリッジはリソースとみなされます。
- デッドロックが発生した場合、いずれかの車両が後退する(リソースを優先的に確保し、ロールバックする)ことで簡単に解決できます。
- 行き詰まりが発生した場合、複数の車両をバックアップする必要がある可能性があります。
- したがって、飢餓は起こり得る。
デッドロックの例
飢餓とは?
飢餓状態とは、優先度の低いプロセスがブロックされる一方で、優先度の高いプロセスが実行される状況を指します。どのようなシステムにおいても、優先度の高いリソースと低いリソースへの要求は動的に発生し続けます。そのため、どのプロセスにいつリソースを提供するかを決定するための何らかのポリシーが必要となります。
アルゴリズムによっては、デッドロック状態に陥っていない場合でも、特定のプロセスが目的のサービスを受けられない場合があります。リソース枯渇は、一部のスレッドが共有リソースを長時間使用不能にした場合に発生します。
飢餓の例
例えば、あるオブジェクトが、戻り値を返すのに時間がかかる可能性のある同期メソッドを提供しているとします。あるスレッドがこのメソッドを頻繁に使用すると、同じオブジェクトへの同期アクセスを頻繁に必要とする他のスレッドがブロックされることがよくあります。
デッドロック、スターベーション、ライブロックの違い
- デッドロックとは、OSにおいて、要求されたリソースが別の待機中のプロセスによって保持されているため、あるプロセスが待機状態に入ったときに発生する状況のことです。
- 一方、ライブロックはデッドロックとほぼ同じだが、ライブロックに関わるプロセスの状態は互いに反応して常に変化し続け、どのプロセスも進行しないという点が異なる。
- つまり、ライブロックは資源不足の特異な事例である。


