问题描述

(由Dijkstra首先提出并解决)5个哲学家围绕一张圆桌而坐,桌子上放着5支筷子, 每两个哲学家之间放一支;哲学家的动作包括思考和进餐,进餐时需要同时拿起他左 边和右边的两支筷子,思考时则同时将两支筷子放回原处。如何保证哲学家们的动作 有序进行?如:不出现相邻者同时要求进餐;不出现有人永远拿不到筷子。

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

解决⽅法有两个,⼀个是让他们同时拿两个筷⼦:⼆是对每个哲学家的动作制定规则,避免饥饿或者死锁 。

⽅法⼀: ⾄多只允许四位哲学家同时去拿左筷⼦,最终能保证⾄少有⼀位哲学家能进餐,并在⽤完后释放两只筷⼦供他⼈使⽤。

设置⼀个初值为 4 的信号量 r,只允许 4 个哲学家同时去拿左筷⼦,这样就能保证⾄少有⼀个哲学家可以就餐,不会出现饿死和死锁的现象。

原理:⾄多只允许四个哲学家同时进餐,以保证⾄少有⼀个哲学家能够进餐,最终总会释放出他所使⽤过的两⽀筷⼦,从⽽可使更多的哲学家进餐。

代码如下:

semaphore chopstick[5] = {1, 1, 1, 1, 1};
semaphore r = 4;
Pi() { while (1) {P(r); //请求进餐P(chopstick[i]); //请求左⼿边的筷⼦P(chopstick[(i + 1) % 5]); //请求右⼿边的筷⼦eat;V(chopstick[i]); //放回左边筷⼦V(chopstick[(i + 1) % 5]); //放回右边筷⼦V(r);think;}
}

⽅法⼆: 仅当哲学家的左右⼿筷⼦都拿起时才允许进餐。 原理:多个临界资源,要么全部分配,要么⼀个都不分配,因此不会出现死锁的情形。

代码片段:

semaphore chopstick[5]={1,1,1,1,1};
semaphore mutex = 1; //互斥地取筷子
Pi (){              //i号哲学家的进程 while(1){P(mutex); P(chopstick[i]); //拿左 P(chopstick[(i+1)%5]); //拿右 V(mutex); 吃饭… V(chopstick[i]); //放左 V(chopstick[(i+1)%5]); //放右 思考…}
}

⽅法三: 规定奇数号哲学家先拿左筷⼦再拿右筷⼦,⽽偶数号哲学家相反。

原理:按照下图,将是 2,3 号哲学家竞争 3 号筷⼦,4,5 号哲学家竞争 5 号筷⼦。1 号哲学家不需要竞争。最后总会有⼀个哲学家能获得两⽀筷⼦⽽进餐。

代码如下:

semaphore chopstick[5] = {1, 1, 1, 1, 1};
Pi() {while (1) {if (i % 2 == 0) { //偶数号哲学家P(chopstick[(i + 1) % 5]); //请求右⼿边的筷⼦ P(chopstick[i]); //请求左⼿边的筷⼦} else { //奇数号哲学家P(chopstick[i]); //请求左⼿边的筷⼦P(chopstick[(i + 1) % 5]); //请求右⼿边的筷⼦}eat;V(chopstick[(i + 1) % 5]); //放回右边筷⼦V(chopstick[i]); //放回左边筷⼦think;}
}

总之,哲学家进餐问题的关键在于解决进程死锁。 这些进程之间只存在互斥关系,但是与之前接触到的互斥关系不同的是,每个进程都需要同时持有 两个临界资源,因此就有“死锁”问题的隐患。

PV经典问题之哲学家问题相关推荐

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

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

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

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

  3. 【操作系统⑧】——信号量与PV操作(下)【哲学家进餐问题 AND型信号量 信号量集机制】

  4. 博弈论速成指南:那些融入深度学习的经典想法和新思路

    选自TowardsDataScience 作者:Jesus Rodriguez 机器之心编译 参与:魔王.杜伟 随着人工智能的发展,博弈论迎来了复兴.关于博弈论,数据科学家需要了解哪些经典思想和新思路 ...

  5. 哲学家就餐与死锁问题,死锁产生的条件以及解决方案

    请结合经典案例-哲学家就餐,来谈谈你对死锁的理解,以及怎么预防和解除死锁? 哲学家就餐 描述:在一张圆桌上,有n个哲学家,n支筷子,他们的生活方式只是交替地进行思考和进餐,饥饿时便试图取其左.右最靠近 ...

  6. 多个线程为了同个资源打起架来了,该如何让他们安分?

    前言 先来看看虚构的小故事 已经晚上 11 点了,程序员小明的双手还在键盘上飞舞着,眼神依然注视着的电脑屏幕. 没办法这段时间公司业绩增长中,需求自然也多了起来,加班自然也少不了. 天气变化莫测,这时 ...

  7. 如何避免操作系统中多线程资源竞争的互斥与同步?

    作者 | 小林coding 来源 | 小林coding(ID:CodingLin) 前言 先来看看虚构的小故事 已经晚上 11 点了,程序员小明的双手还在键盘上飞舞着,眼神依然注视着的电脑屏幕. 没办 ...

  8. 多个线程“打架抢夺”同一个资源,该如何让它们安分?

    来源 | 小林coding(ID:CodingLin) 前言 先来看看虚构的小故事 已经晚上 11 点了,程序员小明的双手还在键盘上飞舞着,眼神依然注视着的电脑屏幕. 没办法这段时间公司业绩增长中,需 ...

  9. 操作系统期末总复习——绝地求生版

    ✅ 2022 新年第一篇,献给了 OS 第1次文章更新 -- 2022/1/2 18:00,改善文章结构 第2次文章更新 -- 2022/1/3 19:00,已完善链接.PV有误语句,补充部分填空题 ...

最新文章

  1. 持续集成实践小结[2] —单元测试
  2. 光流 | OpenCV3实现LK Optical Flow(代码类)
  3. 数字签名和数字信封之间的介绍
  4. 腾讯视频如何多倍速播放视频
  5. 行上下移动_这要是在我家,我是不会把上下铺这样设计的,看着特别,打扫困难...
  6. Js获取下拉框当前选择项的文本和值
  7. 在 Visual Studio Code 中使用 PoweShell - CodeShell
  8. 5.TCP/IP 详解卷1 ---RARP:逆地址解析协议
  9. c语言产品信息管理课程设计,商品信息管理系统(C语言课程设计).doc
  10. 企业网络信息安全意识宣贯——屏保制作
  11. 如何得到给定序列的互补序列以及反向互补序列
  12. CCF CSP 201903-1 小中大
  13. 小知识:Windows XP优化全攻略(网吧型)
  14. opencv切割视频:把长视频切割成固定时间的短视频
  15. yarn install报网络问题
  16. 计算机二级系统班C语言讲义,计算机二级C语言2017辅导讲义:C语言基本知识
  17. 药店java源码_基于jsp的药店-JavaEE实现药店 - java项目源码
  18. [算法练习及思路-程序员面试金典(Java解法)]No61.峰与谷
  19. 读论文Recursive Deep Models for Semantic Compositionality Over a Sentiment Treebank
  20. java编写桌球游戏素材小球图片_小球图片_小球模板_小球设计素材下载

热门文章

  1. 薄膜热电化学电池性能测试中的半导体制冷片高精度度温度控制解决方案
  2. Smooze for Mac(鼠标滚动增强工具)
  3. 任务计划程序定时关机
  4. java符号运算01_03-01 Java运算符
  5. 作为一个程序的人,我觉得我应该努力学习
  6. 激光雷达+imu_[分享]激光雷达的地图创建与定位
  7. 【工具】【thyme leaf】解决idea里面thyme leaf没有自动补全
  8. 【学习笔记】 Thymeleaf的前端渲染(价值50)
  9. SQL多行查询结果拼接
  10. nginx代理配置总和