哲学家进餐问题

哲学家进餐问题

一、问题背景及分析

(一)基本分析及实现

每个进程争抢地使用一种资源,其中若分配不当会导致死锁现象。

image

基本实现:

image

(二)避免死锁发生的三种方法(仍有很多种,这里仅作列举参考)

(1)限制资源容量

可以对哲学家进程施加一些限制条件,比如最多允许四个哲学家同时进餐。这样可以保证至少有一个哲学家可以拿到左右两只筷子。

这里代码实现可将资源数量设置为4。

(2)以奇偶特征分开

要求奇数号哲学家先拿左边的筷子,然后再拿右边的筷子,而偶数号哲学家刚好相反。用这种方法可以保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有其中一个可以拿起第一只筷子,另一个会直接阻塞。这避免了占有一支后再等待另一只的情况。

(3)仅当一个哲学家左右两只筷子都可用时才允许他抓起筷子

详细见 二、

二、问题实现

image

三、问题思考

(注:对上面的实现的思考)

理解:情景:A 先吃饭

  1. 若另一个相邻的哲学家 B 在 A 仍在 mutex 的 P、V 操作时也想来吃饭,则会因 P 操作阻塞。
  2. 若另一个相邻的哲学家 B 在 A 吃饭时(A 已释放了 mutex 资源)也想来吃饭,则会因其中一个拿起筷子操作阻塞。
  3. 在 2. 的基础上若还有哲学家 C 也想吃饭,则会在 P(mutex) 阻塞(B在占用并处于阻塞状态)
  4. 即 3. 的问题可能导致:明明 C 不在 A 隔壁,且两边都有筷子,却因 P(mutex) 阻塞 (被其他人占用且处于阻塞)而吃不到饭
  5. 同时会带来效率低下等其他问题
posted @   Wind_730  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示