【スターベーション】

スターベーション(飢餓状態) とは?

公開:
💡 ほかの人は進むのに、自分だけ順番が来ない

実行機会や共有資源をほかの処理に繰り返し奪われ、ある処理が長く進めなくなる状態。システム全体が動いていても、一部だけが待ち続けることがある。

📌 このページのポイント
ほかは進むのに、待ち手の順番が来ない A B C 取得 取得 取得 取得 待つ → 待つ → 待つ → … 時間が進んでも、Cだけ実行できない
ロックの取得で特定のスレッドが繰り返し負ける例。有限の待ち時間だけで飢餓とは断定しない。
ひよこ ひよこ
パソコンの中で飢餓ってどういうこと?
ペンギン先生 ペンギン先生
処理に必要な順番が回ってこないことだよ。たとえば共有ロックをほかのスレッドが次々と取り、あるスレッドだけが何度も取り損ねる。サービス全体は動いているので、気づきにくいこともあるんだ。
ひよこ ひよこ
少し待つのもスターベーション?
ペンギン先生 ペンギン先生
混雑して一時的に待つだけなら、直ちにそうとは言えないよ。問題は、資源の配り方によって特定の処理が継続的に不利になり、待ち時間を抑えられないことなんだ。単に「処理が重い」とも区別したいね。
ひよこ ひよこ
デッドロックと何が違うの?
ペンギン先生 ペンギン先生
デッドロックは、必要な資源を互いに待ち合って関係する処理が進めなくなる状態。スターベーションでは、ほかの処理は仕事を終え続けられるんだ。ライブロックは、お互いに譲り直すなどの動作が続いても仕事が進まない状態だよ。
ひよこ ひよこ
どうやって防ぐの?
ペンギン先生 ペンギン先生
公平性を考慮したロックを選んだり、ロックを持つ時間を短くしたりするよ。ただし公平なロックでも、CPUの割り当てや利用するAPIによって実際の待ち方は変わる。JavaのReentrantReadWriteLockでも、tryLockは公平設定に従わないので使い方の確認が必要だね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「スターベーション(飢餓状態)」って出てきたら「ほかの処理に機会を奪われ、順番が来ない状態」と思えればだいたいOK!

参考資料

← 用語集にもどる