满意答案

d64120405

2013.11.12

采纳率:45%    等级:12

已帮助:7560人

设有5个哲学家,共享一张放油把椅子的桌子,每人分得一吧椅子.但是桌子上总共执友支筷子,在每个人两边分开各放一支.哲学家只有在肚子饥饿时才试图分两次从两边拾起筷子就餐.

就餐条件是:

1)哲学家想吃饭时,先提出吃饭的要求;

2)提出吃饭要求,并拿到支筷子后,方可吃饭;

3)如果筷子已被他人获得,则必须等待该人吃完饭之后才能获取该筷子;

4)任一哲学家在自己未拿到2支筷子吃饭之前,决不放下手中的筷子;

5)刚开始就餐时,只允许2个哲学家请求吃饭.

试问:

1)描述一个保证不会出现两个邻座同时要求吃饭的算法;

2)描述一个既没有两邻座同时吃饭,又没有人饿死的算法;

3)在什么情况下,5个哲学家全都吃不上饭?

哲学家进餐问题是典型的同步问题.它是由Dijkstra提出并解决的.该问题是描述有五个哲学家,他们的生活方式是交替地进行思考和进餐.哲学家们共用一张圆桌,分别坐在周围的五张椅子上.在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左右岁靠近他的筷子,只有在他拿到两支筷子时才能进餐.进餐完毕,放下筷子继续思考.

利用记录型信号量解决哲学家进餐问题

经分析可知,筷子是临界资源,在一段时间只允许一个哲学家使用.因此,可以用一个信号量表示一支筷子,由这五个信号量构成信号量数组.其描述如下:

var chopstick:array[0,...,4]of semaphore;

所有信号量被初始化为1,第i个哲学家的活动可描述为:

repeat

wait(chopstick);

wait(chopstick[(i+1) mod 5]);

...

eat;

...

signal(chopstick);

signal(chopstick[(i+1) mod 5]);

...

think;

until false;

在以上描述中,哲学家饥饿时,总是先去拿他左边的筷子,即执行wait(chopstick);成功后,再去拿他右边的筷子,即执行

wait(chopstick[(i+1) mod 5]);,再成功后便可进餐.进餐完毕,又先放下他左边的筷子,然后放下他右边的筷子.虽然,上述解法可保证不会有两个相临的哲学家同时进餐,但引起死锁是可能的.假如五个哲学家同时饥饿而各自拿起右边的筷子时,就会使五个信号量chopstick均为0;当他们试图去拿右边的筷子时,都将因无筷子可拿而无限期地等待.对于这样的死锁问题可采用以下集中解决方法:

(1)至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐.

(2)仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐.

(3)规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号的哲学家则相反.按此规定,将是1,2号哲学家竞争1号筷子,3,4号哲学家竞争3号筷子.即五个哲学家都竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一个哲学家能获得两支筷子而进餐.

看了整整一个上午的操作系统,看得头都大了。

我们老师的算法的大意好像是用一个总的信号量,只有获得信号量的哲学家才可以拿筷子。

具体算法如下(用类c描述):

#include "所有头文件"

#define N 5

#define left (i-1)%N //i的左邻号码

#define right (i+1)%N //i的右邻号码

#define think 0

#define hungry 1

#define eating 2

typedef int semaphore //信号量是一个特殊的整型变量

int state[N] //记录每个人的状态

semaphore mutex=1; //设置信号量

semaphore s[N]; //每个哲学家一个信号量

void philosopher(int i)

{

while(true) //无限循环

{

think;

take_chopstick(i);

eat;

put_chopstick(i);

}

}

void take_chopstick(int i)

{

p(& mutex); //对信号量的p操作

state=hungry;

test(i); //试图得到两支筷子

v(&mutex); //v操作

p(&s); //得不到筷子则阻塞

}

void put_chopstick(int i)

{

p(& mutex);

state=think; //进餐结束

test(left); //看左邻是否进餐

test(right); //再看右邻

v(&mutex);

}

void test(int i)

{

if(state==hungry&&左邻没进餐&&右邻没进餐)

{

state=eating;

v(&s);

}

}

01分享举报

哲学家进餐问题pv_用C语言实现哲学家进餐的问题相关推荐

  1. 哲学家就餐问题python伪代码_GitHub - doooooit/Dining-philosophers-problem: 哲学家进餐问题的两种解决方法...

    哲学家就餐问题 问题描述 哲学家就餐问题(Dining philosophers problem)可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考.吃东西的时候, ...

  2. 哲学家进餐问题pv_【jMiniLang】哲学家就餐问题

    演示GIF(1.57MB),控制台输出效果(还有parser/vm/ui)自己实现: 信号量与PV原语 信号量为正数代表有空闲资源,为零与负数代表没有空闲资源.负数的绝对值代表等待的进程个数.信号量用 ...

  3. Linux哲学家进餐杀死进程,100分跪求“哲学家就餐问题”在 Linux下运行的源代码(后缀名为.c)!!!...

    如题. | 代码大致如下,当然不能直接使用,我没写P,V操作的函数. # define N 5 /* 哲学家数目 */ # define LEFT (i-1+N)%N /* i的左邻号码 */ # d ...

  4. 哲学家进餐_我如何通过预算学习计划进餐

    哲学家进餐 by Sterling Osborne, PhD Researcher 作者:斯特林·奥斯本(Sterling Osborne),博士研究员 我如何通过预算学习计划进餐 (How I pl ...

  5. 信号量哲学家问题java_利用AND信号量机制解决哲学家进餐问题

    哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题. 问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条.哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿 ...

  6. 哲学家就餐问题c语言_哲学家就餐问题的一种Python解决方案

    哲学家就餐问题一直是多线程同步问题的经典案例,本文中展示了多线程竞争共享资源带来的死锁问题,并介绍了一种简单的解决方案. 哲学家就餐问题 哲学家最擅长的就是思考和吃饭 ,当他们感觉累的时候,就会拿起一 ...

  7. 哲学家就餐问题linux源代码,Linux下实现哲学家就餐问题

    #include //筷子作为mutex pthread_mutex_t chopstick[6] ;//定义以筷子为锁的数组 void *eat_think(void *arg) { char ph ...

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

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

  9. C++实现进程调度模拟程序——哲学家进餐问题

    文章目录 一.开发环境 二.进餐问题 三.系统分析 四.程序流程图 五.源代码 5.1 多线程实现 5.2 C语言模拟 一.开发环境 开发平台: Visual C++6.0 开发环境: Windows ...

  10. (王道408考研操作系统)第二章进程管理-第三节10:经典同步问题之哲学家进餐问题

    本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 (王道408 ...

最新文章

  1. MVC的Model Binder总结
  2. Matlab学习笔记——文件的打开与关闭
  3. python 设计 实践_python实践设计模式(一)概述和工厂模式
  4. linux c 用户态 调试追踪函数 调用堆栈 定位段错误
  5. jquery ajax 序列化表单传参提交实体对象到后台action
  6. 你真的了解NSNotificationCenter吗?
  7. 拖链电缆 机器人电缆_洞头高柔性拖链网线标柔电缆
  8. jsdk php,jsdk.php · webeautiful/dashpianku - Gitee.com
  9. php 禁用通知,推送消息能不能区分禁止通知和卸载两种类型?
  10. Unity5 Survival Shooter开发笔记2
  11. 公众号开发 单独 给某个用户 推送消息_校区学生会微信公众平台征稿启事
  12. Vagrant安装CentOS7镜像
  13. wps怎么免费导出简历_WPS表格办公—一键添加简历模板
  14. 独立站客服如何友好推送折扣券
  15. C语言超全学习路线(少走弯路)
  16. 如何在Mac上清理磁盘空间?
  17. CKEditor5富文本编辑器在vue中的使用
  18. apk系统签名小技巧
  19. Learning AV Foundation(三)AVAudioRecorder
  20. LLVM 极简教程: 第一章 教程简介与词法分析器

热门文章

  1. 马悦凌:从初级护士到“民间奇医”[9]
  2. linux金山打字通游戏版,金山打字游戏2010电脑版-金山打字游戏(最全大集合安装)下载V8.1.0.1官方版-西西软件下载...
  3. 【君思智慧园区】物业管理系统解决方案
  4. c语言system自动关机,用一个自动关机小程序小试牛刀,玩转C语言System函数,边学边玩...
  5. python输入城市找省份_利用字典模拟省市区(县)的查询
  6. Centos7安装sqliteman
  7. 遥感影像几何校正方法
  8. 比鲁大师好的测试电脑软件,电脑跑分软件哪个好?好用的电脑跑分软件盘点
  9. 清除各个浏览器保存的账号密码信息
  10. AutoRunner 功能自动化测试项目实训之第一个实战案例(四)