【ライブロック】

ライブロック とは?

最終更新:
💡 廊下で同じ方向に避け続けて、すれ違えない二人

スレッドやプロセスが互いの動きに反応して状態を変え続けても、仕事が前に進まない状態。互いの待ちで停止するデッドロックとは異なる。

📌 このページのポイント
反応し続けても、目的の仕事が進まない1回目二人とも右側すれ違えない2回目二人とも左側すれ違えない3回目二人とも右側すれ違えない青:A 橙:B 廊下を上から見る例状態変更の回数と、完了件数は別再試行のタイミングや進行ルールを見直す
廊下の上から見た同じ右側・左側へ二人が避け続ける例です。図の右・左は二人それぞれの身体の向きではありません。譲り合いは一例で、ランダムな待ち時間だけで進捗が保証されるという意味ではありません。
ひよこ ひよこ
ライブロックって何? デッドロックとは違うの?
ペンギン先生 ペンギン先生
どちらも仕事が進まなくなる状態だよ。デッドロックでは相手が持つ資源などを待ち合う。ライブロックでは相手に反応して状態を変えたり、やり直したりしているのに、目的の処理が進まないんだ。
ひよこ ひよこ
動いているのに進まないって、どんな感じ?
ペンギン先生 ペンギン先生
細い廊下で二人が、同じ側へ避け、また同じ側へ避けてすれ違えないイメージだよ。図の右・左は、二人それぞれの向きではなく廊下を上から見た同じ側を表しているんだ。プログラムでも競合すると手放して再試行する動きが繰り返されることがあるよ。
ひよこ ひよこ
CPU使用率が高かったら、ライブロックなの?
ペンギン先生 ペンギン先生
それだけでは分からないよ。通常の計算でもCPU使用率は高くなるし、待ち時間を挟むライブロックなら高くならないこともあるんだ。再試行や状態変更の回数に加えて、処理の完了件数など、実際の仕事が進んでいるかを見るよ。
ひよこ ひよこ
待つ時間を増やせば直る?
ペンギン先生 ペンギン先生
全員が同じ時間だけ待つと、また同時に再試行することがあるよ。待ち時間に乱数による揺らぎ(ジッター)を入れると、タイミングがそろうのを減らせるんだ。ただしランダムにするだけで必ず進むとは言えないので、進む側を決めるルールなども検討するよ。
ひよこ ひよこ
リトライがたくさん発生していたら、全部ライブロック?
ペンギン先生 ペンギン先生
違うよ。再試行が多くても、少しずつ仕事が進んでいるなら同じ状態とは言えないんだ。AWSのジッターの例も、進捗のある処理で競合を減らす話だよ。原因に合わせて再試行の上限や失敗時の扱いを設計し、活動量と進捗を区別して確認しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ライブロック」って出てきたら「動き続けているのに、仕事が進まない状態」と思えばだいたいOK!
📖 おまけ:英語の意味
「Livelock」 = 生きたままのロック(膠着状態)
💬 止まって動かないデッドロック(dead)に対して、動き続けている(live)のに進まないから、この名前だよ

参考資料

← 用語集にもどる