问题描述

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

问题分析

1) 关系分析。5名哲学家与左右邻居对其中间筷子的访问是互斥关系。

2) 整理思路。显然这里有五个进程。本题的关键是如何让一个哲学家拿到左右两个筷子而不造成死锁或者饥饿现象。那么解决方法有两个,一个是让他们同时拿两个筷子;二是对每个哲学家的动作制定规则,避免饥饿或者死锁现象的发生。

3) 信号量设置。定义互斥信号量数组Ch0PstiCk[5] = {1, 1, 1, 1, 1}用于对5个筷子的互斥访问。

对哲学家按顺序从0~4编号,哲学家i左边的筷子的编号为i,哲学家右边的筷子的编号为(i+1)%5。

semaphore chopstick[5] = {1,1,1,1,1}; //定义信号量数组chopstick[5],并初始化
Pi()
{  //i号哲学家的进程do{P (chopstick[i] ) ; //取左边筷子P (chopstick[(i+1) %5] ) ;  //取右边篌子eat;  //进餐V(chopstick[i]) ; //放回左边筷子V(chopstick[(i+l)%5]);  //放回右边筷子think;  //思考} while (1);
}

该算法存在以下问题:当五个哲学家都想要进餐,分别拿起他们左边筷子的时候(都恰好执行完wait(chopstick[i]);)筷子已经被拿光了,等到他们再想拿右边的筷子的时候(执行 wait(chopstick[(i+l)%5]);)就全被阻塞了,这就出现了死锁。

为了防止死锁的发生,可以对哲学家进程施加一些限制条件,比如:

至多允许四个哲学家同时进餐;

仅当一个哲学家左右两边的筷子都可用时才允许他抓起筷子;

对哲学家顺序编号,要求奇数号哲学家先抓左边的筷子,然后再转他右边的筷子,而偶数号哲学家刚好相反。

正解制定规则如下:假设釆用第二种方法,当一个哲学家左右两边的筷子都可用时,才允许他抓起筷子。

semaphore chopstick[5] = {1,1,1,1,1}; //初始化信号量
semaphore mutex=l;  //设置取筷子的信号量
Pi()
{ //i号哲学家的进程do{P (mutex) ; //在取筷子前获得互斥量P (chopstick [i]) ; //取左边筷子P (chopstick[ (i+1) %5]) ;  //取右边筷子V (mutex) ; //释放取筷子的信号量eat;  //进餐V(chopstick[i] ) ;  //放回左边筷子V(chopstick[ (i+l)%5]) ;  //放回右边筷子think;  // 思考}while(1);
}

此外还可以釆用AND型信号量机制来解决哲学家进餐问题,有兴趣的读者可以查阅相关资料,自行思考。

转载于:https://www.cnblogs.com/stemon/p/4859596.html

[经典进程同步问题]哲学家思考相关推荐

  1. 计算机操作系统经典进程同步问题

    经典进程同步问题 1 )生产者-消费者问题(合作互斥) 1)利用记录型信号量解决 2)利用AND型信号量解决 2)哲学家进餐问题(资源耗尽,避免死锁) 1)利用记录型信号量解决 2)利用AND型信号量 ...

  2. 经典进程同步与互斥问题

    经典进程同步与互斥问题 1. 生产者-消费者问题 1.1 简单的"生产者-消费者"问题 设进程A.B是两个相互合作的进程,它们共享一个缓冲区,进程A向其中写入数据,进程B从中读出数 ...

  3. 操作系统:经典进程同步问题 之 生产者-消费者问题、读者-写者问题、哲学家进餐问题

    在进程同步中,经典的同步问题有:生产者-消费者问题.读者-写者问题.哲学家进餐问题. 一.生产者与消费者问题: 问题描述:使用一个缓冲区来保存物品,只有缓冲区没有满,生产者才可以放入物品:只有缓冲区不 ...

  4. 经典进程同步问题总结

    关键词:进程同步:生产者-消费者问题:读者-写者问题:哲学家进餐问题 信号量机制可以实现互斥.同步.对一类系统资源的申请和释放. 一般来说,要实现互斥,可以设置初值为1的互斥信号量,在访问临界区之前, ...

  5. Linux经典问题—五哲学家就餐问题

    http://m.blog.csdn.net/aspenstars/article/details/70149038 一.问题介绍 由Dijkstra提出并解决的哲学家进餐问题(The Dinning ...

  6. 经典进程同步问题(十)

    生产者–消费者问题          读者–写者问题          哲学家进餐问题   哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考.吃东西 ...

  7. 二、进程管理(4.经典进程同步问题)

    1. 生产者-消费者问题 利用记录型信号量解决生产者-消费者问题 这类问题就是两个进程对一个临界资源的使用的具体例子. 假定在生产者和消费者之间的共用缓冲池(就像是仓库),共有n个缓冲区(n个位置). ...

  8. 经典进程同步问题(一)——生产者消费者问题

    目录 一.生产者消费者问题描述 二.解决思路 三.问题求解: 四.源码 五.运行结果: 一.生产者消费者问题描述 生产者消费者(producer-customer)问题是一个非常著名的进程同步问题.它 ...

  9. PV经典问题之哲学家问题

    问题描述 (由Dijkstra首先提出并解决)5个哲学家围绕一张圆桌而坐,桌子上放着5支筷子, 每两个哲学家之间放一支:哲学家的动作包括思考和进餐,进餐时需要同时拿起他左 边和右边的两支筷子,思考时则 ...

  10. 操作系统学习笔记(13) 互斥与同步的经典问题 -哲学家进餐问题

    1 哲学家进餐问题:   2 (算法)信号量方法:   3     //Program diningphilosophers   4     var fork:array[5] of semaphor ...

最新文章

  1. OpenCV再升级!修改一行代码,将图像匹配效果提升14%!
  2. 设计模式(观察者模式)
  3. selenium - webdriver常用方法
  4. Thymeleaf抽取公共页面片段
  5. 更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外
  6. 计算机控制学什么,计算机控制技术专业介绍
  7. shell学习笔记--自我总结
  8. 【转】4.SharePoint服务器端对象模型 之 使用CAML进行数据查询
  9. 半夜,滴滴司机问我会LRU吗?
  10. 自然语言处理 —— 2.7负采样
  11. hbase 操作指令集合
  12. 整理一些css在使用中的小技巧(进行中)
  13. WIFI内部通话系统技术解决方案
  14. 关系图谱在反欺诈场景中的应用及实践
  15. 错误No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbala
  16. CSS3笔记(菜鸟教程)
  17. 计算机操作系统学习笔记----进程管理
  18. [OHIF-Viewers]医疗数字阅片-医学影像-Cornerstone
  19. 函数式编程另类指南 (转载)
  20. 【行人检测】miss rate versus false positives per image (FPPI) 前世今生(实战篇-上)

热门文章

  1. 捷径晚年生活/养老方式大全110+城市旅居场景
  2. linux xunsou_Xunsearch安装和使用
  3. ERROR in Entry module not found: Error: Can‘t resolve ‘./src/index.js‘ in‘xxx.js‘
  4. 李宏毅2021机器学习笔记——Transformer
  5. 桥水基金:对中国股市自上而下的分析
  6. Redis中的事务和三特性
  7. C++回调函数使用心得
  8. java 树什么意思是什么意思是什么_Java数据结构和算法 - 什么是2-3-4树
  9. Sentinel-2数据下载方法
  10. 鲸探发布点评:8月22日发售《孔子圣迹图》系列数字藏品