首页/操作系统/进程管理/哲学家就餐问题 🔗 在 Obsidian 中打开
操作系统 · 进程管理 · 经典同步案例

哲学家就餐问题

重要度 ★★ 哲学家就餐死锁信号量进程同步408
速查
5 位哲学家围坐圆桌,每两人间 1 根筷子,必须同时拿左右两根才能就餐。本质是多进程对有限互斥资源的竞争;核心难点是避免死锁。最多允许 4 人 同时尝试即可避免。

核心概念

问题描述

5 位哲学家围坐圆桌,交替进行思考就餐。桌上放着 5 根筷子,每两位相邻哲学家之间放一根。哲学家必须同时拿到左右两根筷子才能就餐。

本质多进程对有限互斥资源的竞争问题,核心难点是避免死锁

死锁产生的原因

若每位哲学家都执行「先拿左筷、再拿右筷」,当 5 人同时拿起左筷时,每人持有一根、等待右筷 → 死锁!此时死锁四条件全部满足:互斥、持有并等待、不可抢占、循环等待。

四种经典解决方案

方案一:限制同时就餐人数

最多允许 4 位哲学家同时尝试拿筷子(信号量 room = 4)。至少 1 根空闲,必有人能拿两根,破坏循环等待。

方案二:奇偶编号不同拿取顺序

偶数哲学家「先左后右」,奇数哲学家「先右后左」,打破对称性,不会形成循环等待。

方案三:同时拿起两根筷子(AND 信号量)

Swait(chopstick[i], chopstick[(i+1)%5]) 原子性地同时获取两根资源,破坏「持有并等待」。

方案四:服务员(管程)控制

用管程的 pickup / putdowntest(i) 调度,只有左右邻居都不在就餐时才允许就餐。

速记限制人数 / 奇偶顺序 → 破坏循环等待;AND 信号量 → 破坏持有并等待;管程 → 通过调度避免。

408 考试要点

考点要点
写出完整伪代码给定方案,用 P/V 操作写出哲学家进程
分析死锁原因四条件分析(互斥 / 持有等待 / 不可抢占 / 循环等待)
证明方案正确性说明为何不会死锁
信号量初值筷子信号量 chopstick[5] 初值均为 1

记忆卡片

死锁四条件?
互斥、持有并等待、不可抢占、循环等待。
四种方案各破坏哪个条件?
限制人数 / 奇偶顺序 → 循环等待;AND 信号量 → 持有等待;管程 → 调度避免。
最多允许几位避免死锁?
4 位——5 根筷 4 人最多占 4 根,至少 1 根空闲。
chopstick[5] 初值?
均为 1。P 减为 0(被占用),再 P 则阻塞。

交互动画 · 死锁 vs 限制人数

P0 P1 P2 P3 P4
点击「先左后右」观察 5 人同时拿左筷如何陷入死锁;再点「限制同时 4 人」看死锁如何被打破。
提示:每根筷子同一时刻只能被一人持有。
示意图:5 位哲学家(圆)与 5 根筷子(小长条);橙色表示已拿起,绿色表示已完成就餐。限制 4 人后必有一根筷子空闲。

相关知识点

本卡暂无关联卡片(md 中 related 为空)。可用下方导航回到进程管理其他主题。