哲学家就餐问题

两个地方应该是pv操作,pv都是操作元语,不可中断

p操作是将信号量-1

v操作是将信号量+1

pv一定要配对使用

哲学家进餐可以通过信号量机制解决,避免死锁

注释如下:

test(int

//测试哲学家i是否满足eating条件

if(state[i]==HUNGRY)

//状态为hungry且左右均未在eating状态,即筷子空闲

(state[(i-1)%5]!=EATING)

&&(state[(i+1)%5]!=EATING)

state[i]=EATING;

//设置哲学家i的状态标志为eating

V(&s[i]);(不懂,什么意思)

//s[i]初始化为0,表示能否eating的信号量,V之后s[i]=1,可以

//通过P操作后进入eating,否则在P(s[i])处阻塞

state[i]=THINKING;

//初始化状态位

s[i]=0;

//初始化s[i]

philosopher(int

while

(true)

P(mutex);(还有这个地方也不太懂)

//对mutex进行P操作,即加锁,防止过

//多进程同时执行造成死锁

state[i]=HUNGRY;

//设置i状态

//测试是否可以进eating,如可以,设置

//相应标志位和信号量

V(mutex);

//释放信号量,其它进程可执行P(mutex)

P(s[i]);

//测试是否可以eating

//以下为哲学家i的eating过程

拿左筷子;

拿右筷子;

放右筷子;

放左筷子;

P(mutex);

//对mutex加锁,防止多个进程同时对state[i]操作

state[i]=THINKING;

//设置i状态

test([i-1]%5);

//为左边和右边测试并设置s状态

test([i+1]%5);

V(mutex);

//释放信号量

关于哲学家就餐问题的Chandy/Misra解法的疑问

你的意思是A交给B,同时B交给A是吧?那么请求时,显然要得到AB同时没在吃,而同时都想吃。那么,根据2,则擦干净交换餐叉。然后AB都可以吃了啊。然后吃完餐叉就脏了。

最后,你怎么觉得是死锁了?

什么叫:“那么请求时,显然要得到AB同时没在吃,而同时都想吃。”

这是你假设的情况啊。因为解法的意思是找临近的询问。如果正在吃,必然不能产生交换,而产生等待。比如,abc三人,b请求,ac都正在吃。那b的请求得不到回应只能等待了啊。直到a或c中的一个吃完,就可以交出去了。

说起来,突然发现如果abc中的ac都是干净的,b就吃不上了。你这样觉得对吧?但是好像解法的说明是任意顺序,也就是说一定能找到某个被初始化的脏的。而同时全干净的情况是不能存在的,因为用了就会脏,然后初始全是脏的。

谁能介绍下Java解哲学家就餐问题吗?

init(n);

public int getCount()

return n;

public void setChopstick( int i, boolean v)

chops[ i ] = v;

public boolean getChopstick( int i )

return chops[i];

private void init( final int N)

r = new Random();

n = ( N maxPhils ) ? maxPhils : N;

chops = new boolean[n];

phils = new Philosopher[n];

initPhils();

dumpStatus();

就餐问题如何解决?...就餐问题如何解决?

就餐时间导游会带大家去有用餐的地方,您自行选择即可。

哲学家就餐问题的问题描述

哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。哲学家就餐问题有时也用米饭和筷子而不是意大利面和餐叉来描述,因为很明显,吃米饭必须用两根筷子。

哲学家从来不交谈,这就很危险,可能产生死锁,每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反)。即使没有死锁,也有可能发生资源耗尽。例如,假设规定当哲学家等待另一只餐叉超过五分钟后就放下自己手里的那一只餐叉,并且再等五分钟后进行下一次尝试。这个策略消除了死锁(系统总会进入到下一个状态),但仍然有可能发生“活锁”。如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边的餐叉,那么这些哲学家就会等待五分钟,同时放下手中的餐叉,再等五分钟,又同时拿起这些餐叉。

在实际的计算机问题中,缺乏餐叉可以类比为缺乏共享资源。一种常用的计算机技术是资源加锁,用来保证在某个时刻,资源只能被一个程序或一段代码访问。当一个程序想要使用的资源已经被另一个程序锁定,它就等待资源解锁。当多个程序涉及到加锁的资源时,在某些情况下就有可能发生死锁。例如,某个程序需要访问两个文件,当两个这样的程序各锁了一个文件,那它们都在等待对方解锁另一个文件,而这永远不会发生。

规定在拿到左侧的筷子后,先检查右面的筷子是否可用。如果不可用,则先放下左侧筷子, 等一段时间再重复整个过程。 分析:当出现以下情形,在某一个瞬间,所有的哲学家都同时启动这个算法,拿起左侧的筷 子,而看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子……如此 这样永远重复下去。对于这种情况,所有的程序都在运行,但却无法取得进展,即出现饥饿, 所有的哲学家都吃不上饭。 (2) 描述一种没有人饿死(永远拿不到筷子)算法。 考虑了四种实现的方式(a、b、c、d): a.原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释 放出他所使用过的两支筷子,从而可使更多的哲学家进餐。以下将room 作为信号量,只允 许4 个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入 餐厅的哲学家进入room 的等待队列,根据fifo 的原则,总会进入到餐厅就餐,因此不会 出现饿死和死锁的现象。 伪码: semaphore chopstick[5]=; semaphore room=4; void philosopher(int i) } b.原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。 方法1:利用and 型信号量机制实现:根据课程讲述,在一个原语中,将一段代码同时需 要的多个临界资源,要么全部分配给它,要么一个都不分配,因此不会出现死锁的情形。当 某些资源不够时阻塞调用进程;由于等待队列的存在,使得对资源的请求满足fifo 的要求, 因此不会出现饥饿的情形。 伪码: semaphore chopstick[5]=; void philosopher(int i) } 方法2:利用信号量的保护机制实现。通过信号量mutex对eat()之前的取左侧和右侧筷 子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的出现。 伪码: semaphore mutex = 1 ; semaphore chopstick[5]=; void philosopher(int i) }

规定在拿到左侧的筷子后,先检查右面的筷子是否可用。如果不可用,则先放下左侧筷子, 等一段时间再重复整个过程。 分析:当出现以下情形,在某一个瞬间,所有的哲学家都同时启动这个算法,拿起左侧的筷 子,而看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子……如此 这样永远重复下去。对于这种情况,所有的程序都在运行,但却无法取得进展,即出现饥饿, 所有的哲学家都吃不上饭。 (2) 描述一种没有人饿死(永远拿不到筷子)算法。 考虑了四种实现的方式(a、b、c、d): a.原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释 放出他所使用过的两支筷子,从而可使更多的哲学家进餐。以下将room 作为信号量,只允 许4 个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入 餐厅的哲学家进入room 的等待队列,根据fifo 的原则,总会进入到餐厅就餐,因此不会 出现饿死和死锁的现象。 伪码: semaphore chopstick[5]=; semaphore room=4; void philosopher(int i) } b.原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。 方法1:利用and 型信号量机制实现:根据课程讲述,在一个原语中,将一段代码同时需 要的多个临界资源,要么全部分配给它,要么一个都不分配,因此不会出现死锁的情形。当 某些资源不够时阻塞调用进程;由于等待队列的存在,使得对资源的请求满足fifo 的要求, 因此不会出现饥饿的情形。 伪码: semaphore chopstick[5]=; void philosopher(int i) } 方法2:利用信号量的保护机制实现。通过信号量mutex对eat()之前的取左侧和右侧筷 子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的出现。 伪码: semaphore mutex = 1 ; semaphore chopstick[5]=; void philosopher(int i) }

哲学家就餐问题的问题描述

哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。哲学家就餐问题有时也用米饭和筷子而不是意大利面和餐叉来描述,因为很明显,吃米饭必须用两根筷子。

哲学家从来不交谈,这就很危险,可能产生死锁,每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反)。即使没有死锁,也有可能发生资源耗尽。例如,假设规定当哲学家等待另一只餐叉超过五分钟后就放下自己手里的那一只餐叉,并且再等五分钟后进行下一次尝试。这个策略消除了死锁(系统总会进入到下一个状态),但仍然有可能发生“活锁”。如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边的餐叉,那么这些哲学家就会等待五分钟,同时放下手中的餐叉,再等五分钟,又同时拿起这些餐叉。

在实际的计算机问题中,缺乏餐叉可以类比为缺乏共享资源。一种常用的计算机技术是资源加锁,用来保证在某个时刻,资源只能被一个程序或一段代码访问。当一个程序想要使用的资源已经被另一个程序锁定,它就等待资源解锁。当多个程序涉及到加锁的资源时,在某些情况下就有可能发生死锁。例如,某个程序需要访问两个文件,当两个这样的程序各锁了一个文件,那它们都在等待对方解锁另一个文件,而这永远不会发生。

规定在拿到左侧的筷子后,先检查右面的筷子是否可用。如果不可用,则先放下左侧筷子, 等一段时间再重复整个过程。 分析:当出现以下情形,在某一个瞬间,所有的哲学家都同时启动这个算法,拿起左侧的筷 子,而看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子……如此 这样永远重复下去。对于这种情况,所有的程序都在运行,但却无法取得进展,即出现饥饿, 所有的哲学家都吃不上饭。 (2) 描述一种没有人饿死(永远拿不到筷子)算法。 考虑了四种实现的方式(a、b、c、d): a.原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释 放出他所使用过的两支筷子,从而可使更多的哲学家进餐。以下将room 作为信号量,只允 许4 个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入 餐厅的哲学家进入room 的等待队列,根据fifo 的原则,总会进入到餐厅就餐,因此不会 出现饿死和死锁的现象。 伪码: semaphore chopstick[5]=; semaphore room=4; void philosopher(int i) } b.原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。 方法1:利用and 型信号量机制实现:根据课程讲述,在一个原语中,将一段代码同时需 要的多个临界资源,要么全部分配给它,要么一个都不分配,因此不会出现死锁的情形。当 某些资源不够时阻塞调用进程;由于等待队列的存在,使得对资源的请求满足fifo 的要求, 因此不会出现饥饿的情形。 伪码: semaphore chopstick[5]=; void philosopher(int i) } 方法2:利用信号量的保护机制实现。通过信号量mutex对eat()之前的取左侧和右侧筷 子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的出现。 伪码: semaphore mutex = 1 ; semaphore chopstick[5]=; void philosopher(int i) }

规定在拿到左侧的筷子后,先检查右面的筷子是否可用。如果不可用,则先放下左侧筷子, 等一段时间再重复整个过程。 分析:当出现以下情形,在某一个瞬间,所有的哲学家都同时启动这个算法,拿起左侧的筷 子,而看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子……如此 这样永远重复下去。对于这种情况,所有的程序都在运行,但却无法取得进展,即出现饥饿, 所有的哲学家都吃不上饭。 (2) 描述一种没有人饿死(永远拿不到筷子)算法。 考虑了四种实现的方式(a、b、c、d): a.原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释 放出他所使用过的两支筷子,从而可使更多的哲学家进餐。以下将room 作为信号量,只允 许4 个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入 餐厅的哲学家进入room 的等待队列,根据fifo 的原则,总会进入到餐厅就餐,因此不会 出现饿死和死锁的现象。 伪码: semaphore chopstick[5]=; semaphore room=4; void philosopher(int i) } b.原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。 方法1:利用and 型信号量机制实现:根据课程讲述,在一个原语中,将一段代码同时需 要的多个临界资源,要么全部分配给它,要么一个都不分配,因此不会出现死锁的情形。当 某些资源不够时阻塞调用进程;由于等待队列的存在,使得对资源的请求满足fifo 的要求, 因此不会出现饥饿的情形。 伪码: semaphore chopstick[5]=; void philosopher(int i) } 方法2:利用信号量的保护机制实现。通过信号量mutex对eat()之前的取左侧和右侧筷 子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的出现。 伪码: semaphore mutex = 1 ; semaphore chopstick[5]=; void philosopher(int i) }

哲学家就餐问题实验报告相关推荐

  1. java 第六次实验_操作系统第六次实验报告——使用信号量解决哲学家进餐问题...

    0 个人信息 张樱姿 201821121038 计算1812 1 实验目的 通过编程进一步了解信号量. 2 实验内容 在服务器上用Vim编写一个程序:使用信号量解决任一个经典PV问题,测试给出结果,并 ...

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

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

  3. ucoreOS_lab7 实验报告

    所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...

  4. C语言生产者消费者实验报告,生产者与消费者实验报告.doc

    生产者与消费者实验报告.doc 生产者和消费者实验报告[实验目的]1. 加深对进程概念的理解,明确进程和程序的区别.2. 进一步认识并发执行的实质.3. 验证用信号量机制实现进程互斥的方法.4. 验证 ...

  5. ucore_lab7实验报告

    实验目的 理解操作系统的同步互斥的设计实现: 理解底层支撑技术:禁用中断.定时器.等待队列: 在ucore中理解信号量(semaphore)机制的具体实现: 理解管程机制,在ucore内核中增加基于管 ...

  6. 哲学家就餐问题C语言实现(涉及多线程、信号量等)

    哲学家就餐问题C语言实现(涉及多线程.信号量等) 1.实验原理 2.实验内容 3.代码部分 3.1 重要代码展示 3.2 源码 3.3 运行结果展示 1.实验原理   由Dijkstra提出并解决的哲 ...

  7. php 哲学家进餐,IPC问题-哲学家就餐(示例代码)

    如上图,有五位哲学家,盘中的食物只有左右两个叉子都拿起才能吃.哲学家在桌上只有思考(等待)和吃面(执行).看起来最多是只有2个人能同时吃. 版本一:这个思路的最糟糕的就是都拿起左边叉子,那样都没法吃了 ...

  8. 2019春第二次课程设计实验报告

    2019春第二次课程设计实验报告 一.实验项目名称: 贪吃蛇游戏编写: 二.实验项目功能描述: 这个实验主要是实现游戏的正常运行,实现的目标是对小蛇移动的控制, 同时对小蛇数据的保存,如何实现转弯的效 ...

  9. JAVA第二次验证设计性实验报告

    [实验任务一]:素数输出 (3)实验报告中要求包括程序设计思想.程序流程图.源代码.运行结果截图.编译错误分析等内容. 1.   实验内容 (1)计算并输出3~100之间的素数. (2)编程满足下列要 ...

最新文章

  1. Oracle 11.2.0.1 升级到 11.2.0.3 示例
  2. 电子邮件成企业主动营销的首选工具
  3. 模拟浏览器自动化测试工具Selenium之五Centos系统命令行下部署selenium环境试验
  4. 鸟哥的Linux私房菜(服务器)- 簡易 OpenWebMail 設定
  5. Windows的Win键被自动按下解决方案
  6. 笛卡尔乘积算法的体现
  7. 玩Python遇到的问题一二三及解决办法
  8. 蓝桥杯 历届试题 剪格子
  9. 腾讯员工又双叒叕涨工资了,平均月薪已达7.4万
  10. ActiveMQ从入门到精通(二)
  11. 类似腾讯手机管家应用android源码
  12. WebApi的调用-1.前端调用
  13. Excel数据分析案例一——业绩达成分析
  14. 大数据——python爬虫
  15. C#.NET身份证验证算法
  16. android gps 获取方位_Android GPS定位 获取经纬度
  17. SAP在采购和销售中的税务处理-增值税
  18. How browsers work----Introduction
  19. Flask中蓝本(Blueprint)的使用
  20. 关于用python实现Windows笔记本自动切换强信号WiFi功能

热门文章

  1. Java编程:Java里的协程
  2. kvm切换器不了linux系统,KVM切换器使用中最常见故障排除处理
  3. 机器学习中输入空间、特征空间、假设空间
  4. 【机器学习】判别式模型和生成式模型
  5. vscode修改快捷键为idea的快捷键
  6. 不看公式自己复原魔方
  7. zipfile的压缩和解压缩
  8. 串级PID的直立控制
  9. CC254x到CC2640
  10. oracle 控制文件 dump,将控制文件dump出来研究下内容