【しょくじするてつがくしゃもんだい】

食事する哲学者問題 とは?

💡 全員が左のフォークを持ったまま、右のフォークを待ち続ける永遠のディナー
📌 このページのポイント
食事する哲学者問題 テーブル 哲学者0 哲学者1 哲学者2 哲学者3 哲学者4 F0 F1 F2 F3 F4 デッドロック! 全員が左のフォークを 持ち、右を待ち続ける 哲学者(プロセス) フォーク(共有リソース)
食事する哲学者問題のイメージ
ひよこ ひよこ

食事する哲学者問題って名前がすごいけど、何の話なの?

ペンギン先生 ペンギン先生

5人の哲学者が丸いテーブルに座ってるんだけど、フォークが5本しかなくて、隣の人と共有してるんだ。食事するには左右2本のフォークが必要なのに、全員が同時に左のフォークを取ると、右のフォークを誰も手放さないから全員が永遠に待ち続ける…これがデッドロックだよ

ひよこ ひよこ

えっ、じゃあ誰もご飯食べられないまま止まっちゃうの?

ペンギン先生 ペンギン先生

そう、まさにそれが問題なんだ。コンピュータでも同じことが起きるよ。複数のプログラムが同時にファイルやメモリなどのリソースを取り合うと、お互いが相手の持ってるリソースを待ち続けて、全体がフリーズしてしまうんだ

ひよこ ひよこ

どうやったら解決できるの?

ペンギン先生 ペンギン先生

いくつか方法があるよ。たとえば「フォークに番号を付けて、必ず小さい番号から取る」というルールにすれば、全員が同じ方向のフォークを取ることがなくなるからデッドロックしない。これをリソース順序付けと呼ぶんだ

ひよこ ひよこ

他にも方法はあるの?

ペンギン先生 ペンギン先生

「ウェイター(仲裁者)を置いて、同時に4人までしか食事させない」という方法もあるよ。5人中4人なら必ず誰かが両方のフォークを取れるからね。実際のOSでもリソースマネージャーがこういう制御をしてるんだ

ひよこ ひよこ

実際のソフトウェアでもこの問題って起きるものなの?

ペンギン先生 ペンギン先生

しょっちゅう起きるよ。データベーストランザクションが互いのロックを待ち合ったり、マルチスレッドプログラムでミューテックスの取得順序がバラバラだったり。だからこそこの問題は50年以上経った今でもコンピュータサイエンスの基本として教えられてるんだ

ひよこ ひよこ

50年前の問題が今でも使われてるってすごいね!

ペンギン先生 ペンギン先生

ダイクストラは天才だからね。ちなみに実務では「一定時間待ってダメならフォークを置いて最初からやり直す」というタイムアウト方式もよく使われるよ。完全な解決ではないけど、デッドロックから抜け出す実用的な方法として広く採用されてるんだ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「食事する哲学者問題」って出てきたら「複数プロセスが共有リソースを取り合ってデッドロックする古典的な例え話」と思えればだいたいOK!
📖 おまけ:英語の意味
「Dining Philosophers Problem」 = 食事する哲学者問題
💬 1965年にダイクストラが提唱し、後にホーアが「食事する哲学者」と名付けたんだよ。並行処理の教科書には必ず出てくる有名な思考実験だよ
← 用語集にもどる