王道考研学习笔记


问题分析

一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。哲学
家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿时
才试图拿起左、右两根筷子(一根一 根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲
学家只有同时拿起两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。


问题分析

1.关系分析。系统中有5个哲学家进程,5位哲学
家与左右邻居对其中间筷子的访问是互斥关系。
2.整理思路。这个问题中只有互斥关系,但与之前
遇到的问题不同的事,每个哲学家进程需要同时
持有两个临界资源才能开始吃饭。如何避免临界
资源分配不当造成的死锁现象,是哲学家问题的
精髓.

3.信号量设置。定义互斥信号量数组
chopstick [5]=(1,1,1,1,1}用于实现对5个筷子的互
斥访问。并对哲学家按0~4编号,哲学家i左边
的筷子编号为i,右边的筷子编号为 (i+1)%5。


 代码实现


semaphore chopstick[5]={1,1,1,1,1};
semaphore mutex=1;
pi(){
p(mutex);//实现哲学家之前互斥的拿起筷子
p(chopstick[i]);//拿起左边的筷子
p(chopstick[(i+1)%5]);//拿起右边的筷子
。。。哲学家进餐
v(chopstick[i]);//放下左边的筷子
v(chopstick[(i+1)%5]);//放下右边的筷子
v(mutex);
}

【操作系统】进程-哲学家进餐问题相关推荐

  1. 【操作系统】哲学家进餐问题

    问题描述 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆着一根筷子,桌子的中间是一碗米饭,哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人.只有当哲学家饥饿时,才试图拿起左.右两根 ...

  2. 操作系统:哲学家进餐问题

    哲学家进餐问题 五个哲学家围着一张圆桌,每个哲学家面前放着食物.哲学家的生活有两种交替活动:吃饭以及思考.当一个哲学家吃饭时,需要先拿起自己左右两边的两根筷子,并且一次只能拿起一根筷子. 下面是一种错 ...

  3. 【操作系统】“哲学家进餐”问题

    "哲学家进餐"问题 有五个哲学家,他们的生活方式是交替地进行思考和进餐.他们共用一张圆桌,分别坐在五张椅子上. 在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用 ...

  4. 操作系统(四) | 经典进程的同步问题(生产者--消费者问题、哲学家进餐问题、读者--写者问题)

    文章目录 生产者--消费者问题 分析 实现 哲学家进餐问题 方法一:最多4人同时拿左筷子,最终保证一人能进餐 方法二:同时给左右筷子 解法1:AND信号量 解法2:信号量保护机制 方法三:让奇数先左后 ...

  5. 【操作系统实验】Linux环境下用进程实现哲学家进餐问题——C语言完整代码+详细实验报告

    [注意]代码在文末,以下为详细实验报告 [实验目的]   以哲学家进餐问题为例,学习并熟悉Linux下进程通信.同步机制的具体实现方法,主要是了解并掌握信号量机制和避免死锁的使用方法,使得不会出现哲学 ...

  6. 操作系统之进程管理:15、哲学家进餐问题

    15.哲学家进餐问题 问题描述 解题思路 解决死锁的策略 方案一与方案二 方案三 注 问题描述 解题思路 1.因为需要左手和右手俩只筷子,所以可以直接拿哪只就对哪只上锁 问题:这样的话当每个人都拿走左 ...

  7. 【操作系统】进程:哲学家进餐问题

    问题描述: 有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时便试图取其左.右最靠近他的筷子,只 ...

  8. 【操作系统】-- PV原语(哲学家进餐问题)

    微信搜索:编程笔记本 微信搜索:编程笔记本 微信搜索:编程笔记本 点击上方蓝字关注我,我们一起学编程 欢迎小伙伴们分享.转载.私信.赞赏 小伙伴儿们看完以后可不可以帮我点亮一下在看呀~ 信号量与进程同 ...

  9. 2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )

    目录 1.读者-写者问题 2.哲学家进餐问题 实现 3.管程 1.为什么要引入管程? ​2.管程的定义和基本特征 3.扩展1:用管程解决生产者消费者问题 4.扩展2:Java中类似于管程的机制  个人 ...

最新文章

  1. 使用sn.exe为程序集签名
  2. 中国移动系统集成公司2020春招技术综合在线编程题第一题
  3. Android 顶部切换实现(二)
  4. java 虚类_java虚方法
  5. idea-spark-sbt 打包jar
  6. 常用开发环境搭建配置教程(OneStall)
  7. 【智能AI】准确率97%的开源肺炎检测模型
  8. Uncompilable source code in netbeans
  9. 学习笔记_vnpy实战培训day02
  10. 【iCore3 双核心板_ uC/OS-III】例程二:任务的建立与删除
  11. Qt网络编程——TCP
  12. python抛出异常 后如何接住,Python 异常的捕获、异常的传递与主动抛出异常操作示例...
  13. HDU 1166 - 敌兵布阵
  14. 【算法随记四】自动色阶、对比度、直方图均衡等算法的一些小改进。
  15. (转)“在证券行业,技术不重要,不要过分强调!”
  16. vue 检测ie版本_vue 兼容低版本ie浏览器
  17. 怎么从php文件中查找代码,php类在文件中查找类文件,但不查找类
  18. MFC操作Access数据库
  19. 超六类网线和六类网线的区别—Vecloud
  20. 运用nginx和阿里云解析配置二级域名 设置不同端口号

热门文章

  1. mac下安装node.js6 ,【并使用zsh】
  2. 计算机学院元旦晚会对联,学校元旦对联加横批
  3. 程序员来聊一聊信用卡(三)——信用卡的一些基本分类
  4. [转]静态框架导航,左侧折叠树的样式,类似于treeview
  5. 手把手教你用 jQuery 制作无缝轮播
  6. 对数据库某个字段进行去重
  7. 一款自动太阳能照明灯电路设计
  8. LU分解完成利用节点电压法的简易电路求解程序(二)
  9. LeetCode——反转字符串
  10. Java IO BIO NIO