PV经典问题之哲学家问题
问题描述
(由Dijkstra首先提出并解决)5个哲学家围绕一张圆桌而坐,桌子上放着5支筷子, 每两个哲学家之间放一支;哲学家的动作包括思考和进餐,进餐时需要同时拿起他左 边和右边的两支筷子,思考时则同时将两支筷子放回原处。如何保证哲学家们的动作 有序进行?如:不出现相邻者同时要求进餐;不出现有人永远拿不到筷子。
- 关系分析。系统中有5个哲学家进程,5位哲学家与左右邻居对其中间筷子的访问是互斥关系。
- 整理思路。这个问题中只有互斥关系,但与之前 遇到的问题不同的事,每个哲学家进程需要同时 持有两个临界资源才能开始吃饭。如何避免临界 资源分配不当造成的死锁现象,是哲学家问题的精髓。
解决⽅法有两个,⼀个是让他们同时拿两个筷⼦:⼆是对每个哲学家的动作制定规则,避免饥饿或者死锁 。
⽅法⼀: ⾄多只允许四位哲学家同时去拿左筷⼦,最终能保证⾄少有⼀位哲学家能进餐,并在⽤完后释放两只筷⼦供他⼈使⽤。
设置⼀个初值为 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经典问题之哲学家问题相关推荐
- Linux经典问题—五哲学家就餐问题
http://m.blog.csdn.net/aspenstars/article/details/70149038 一.问题介绍 由Dijkstra提出并解决的哲学家进餐问题(The Dinning ...
- 操作系统学习笔记(13) 互斥与同步的经典问题 -哲学家进餐问题
1 哲学家进餐问题: 2 (算法)信号量方法: 3 //Program diningphilosophers 4 var fork:array[5] of semaphor ...
- 【操作系统⑧】——信号量与PV操作(下)【哲学家进餐问题 AND型信号量 信号量集机制】
- 博弈论速成指南:那些融入深度学习的经典想法和新思路
选自TowardsDataScience 作者:Jesus Rodriguez 机器之心编译 参与:魔王.杜伟 随着人工智能的发展,博弈论迎来了复兴.关于博弈论,数据科学家需要了解哪些经典思想和新思路 ...
- 哲学家就餐与死锁问题,死锁产生的条件以及解决方案
请结合经典案例-哲学家就餐,来谈谈你对死锁的理解,以及怎么预防和解除死锁? 哲学家就餐 描述:在一张圆桌上,有n个哲学家,n支筷子,他们的生活方式只是交替地进行思考和进餐,饥饿时便试图取其左.右最靠近 ...
- 多个线程为了同个资源打起架来了,该如何让他们安分?
前言 先来看看虚构的小故事 已经晚上 11 点了,程序员小明的双手还在键盘上飞舞着,眼神依然注视着的电脑屏幕. 没办法这段时间公司业绩增长中,需求自然也多了起来,加班自然也少不了. 天气变化莫测,这时 ...
- 如何避免操作系统中多线程资源竞争的互斥与同步?
作者 | 小林coding 来源 | 小林coding(ID:CodingLin) 前言 先来看看虚构的小故事 已经晚上 11 点了,程序员小明的双手还在键盘上飞舞着,眼神依然注视着的电脑屏幕. 没办 ...
- 多个线程“打架抢夺”同一个资源,该如何让它们安分?
来源 | 小林coding(ID:CodingLin) 前言 先来看看虚构的小故事 已经晚上 11 点了,程序员小明的双手还在键盘上飞舞着,眼神依然注视着的电脑屏幕. 没办法这段时间公司业绩增长中,需 ...
- 操作系统期末总复习——绝地求生版
✅ 2022 新年第一篇,献给了 OS 第1次文章更新 -- 2022/1/2 18:00,改善文章结构 第2次文章更新 -- 2022/1/3 19:00,已完善链接.PV有误语句,补充部分填空题 ...
最新文章
- 持续集成实践小结[2] —单元测试
- 光流 | OpenCV3实现LK Optical Flow(代码类)
- 数字签名和数字信封之间的介绍
- 腾讯视频如何多倍速播放视频
- 行上下移动_这要是在我家,我是不会把上下铺这样设计的,看着特别,打扫困难...
- Js获取下拉框当前选择项的文本和值
- 在 Visual Studio Code 中使用 PoweShell - CodeShell
- 5.TCP/IP 详解卷1 ---RARP:逆地址解析协议
- c语言产品信息管理课程设计,商品信息管理系统(C语言课程设计).doc
- 企业网络信息安全意识宣贯——屏保制作
- 如何得到给定序列的互补序列以及反向互补序列
- CCF CSP 201903-1 小中大
- 小知识:Windows XP优化全攻略(网吧型)
- opencv切割视频:把长视频切割成固定时间的短视频
- yarn install报网络问题
- 计算机二级系统班C语言讲义,计算机二级C语言2017辅导讲义:C语言基本知识
- 药店java源码_基于jsp的药店-JavaEE实现药店 - java项目源码
- [算法练习及思路-程序员面试金典(Java解法)]No61.峰与谷
- 读论文Recursive Deep Models for Semantic Compositionality Over a Sentiment Treebank
- java编写桌球游戏素材小球图片_小球图片_小球模板_小球设计素材下载