PV原语解决哲学家吃通心面问题之个人观点
PV信号量有互斥信号量,整型信号量还有记录型信号量以及多信号量(如AND信号量、一般信号量集),我们这里采用互斥信号量和整型信号量来解决哲学家吃通心面问题。
我们先用代码(可能不满足具体的某种编程语言规范)来描述哲学家吃面问题的场景。(自然语言描述是五个哲学家围坐在一张圆桌旁,桌子中央一盘通心面(面假设无限),每个人面前有一只空盘,每两个人之间放一把叉子。为了吃面,每个哲学家都必须获得两把叉子,且只能从自己左边或右边取。则叉子就相当于临界资源,我们为每把叉子设置一个互斥信号量Si(i=0,1,2,3,4),初值均为1,表示均为被使用)。
var fork:array[0...4] of mutex;
forki := 1;
cobegin
process Pi //i=0...4
begin
while(true){
思考;
P(fork[i]);
P(fork[i+1]mod5);
吃通心面;
V(fork[i]);
V(fork[i+1]mod5);
}
end;
coend
哲学家问题要解决的其实是死锁问题:
在上述情景下,假如五个哲学家同时拿起右手边的叉子,那么五个人都将等待相邻哲学家手中的叉子,出现“死锁”。
要解决这种死锁,有很多方法,我采用的是:至多允许四个哲学家同时吃面。即我增加一个整型信号量,初值设为4,用于记录某一时刻正在吃面的哲学家总数。
则有如下代码:
var fork:array[0...4] of mutex;
int count: semaphore;
forki := 1;
count:=4;
cobegin
process Pi //i=0...4
begin
while(true){
思考;
P(count); //在吃面前先check下当前吃面的哲学家总数,如果为4,则等待
P(fork[i]);
P(fork[i+1]mod5);
吃通心面;
V(fork[i]);
V(fork[i+1]mod5);
V(count);
}
end;
coend
上述就解决了哲学家吃面的问题。
具体的采用某种编程语言解决哲学家吃面问题(如JAVA)时,我们可以采用如下办法。
PV 原语由于是不可被中断的“原子操作”。
我们可以借鉴JAVA中的synchronized关键词。
拿互斥信号量来说:
我们可以这样定义它对应的P、V原语操作
boolean binary_semaphore; //定义互斥信号量
synchronized void p(boolean binary_semaphore){
while(!binary_semaphore){ //信号量被占用,此时空等 }
binary_semaphore = FALSE; //取得信号量,并将信号量置为占用标识
}
synchronized void v(boolean binary_semphore){
binary_semaphore = TRUE; //归还信号量,重新置信号量为可用标识
}
其他单信号量的PV原语操作类似。
分享到:
相关推荐
在资料中有吸烟者问题,哲学家问题,的各种PV原语题目及其解答。与考研直接相关。还有死锁问题
pv原语试题集锦 各种典型例题 有利于理解,典型易懂
计算机操作系统PV原语分析,介绍PV原语通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序……
哲学家就餐linux下C编程源代码
如何用PV原语实现进程间的互斥...PV原语及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量sem是一整数,sem大于等于零时代表可供并发进程使用的资源实体数,但sem小于零时则表示正在等待使用临界区的进程数。
这是一个关于pv原语的详细介绍,里面还有几个实例供大家参考
PV原语通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。 信号量的概念1965年由著名的荷兰计算机科学家Dijkstra提出,其基本思路是用一种新的变量类型(semaphore)来记录当前...
操作系统作业,生产者与消费者,编程软件vc++
实现了Windows下的PV原语操作,即传统上的生产者与消费者 设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个自定义的确定的数值,例如N=32)。你需要使用如下信号量...
使用java解决的哲学家问题,但并不是用的P,V原语的方法,使用的是加锁的解决方法,算是一种伪PV吧。
让我们更加容易的了解书本上的一些知识点,希望大家来看看
编写程序完成单处理机系统中的进程调度,要求采用①先进先出;②优先数;③最短作业优先调度算法的进程调度。实验具体包括:首先确定进程...然后完成进程创建原语和进程调度原语;最后编写主函数对所做工作进行测试。
p431 - p441如何查看PV原语操作
经典的哲学家就餐问题,这里是6个哲学家就餐,用p,v原语实现避免死锁,linux下运行
pv操作实现前驱图
用pv原语实现进程同步的模拟,是经典的生产者与消费者问题
PV原语及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量sem是一整数,sem大于等于零时代表可供并发进程使用的资源实体数,但sem小于零时则表示正在等待使用临界区的进程数。 P原语操作的动作是: (1...
。。。
。。。
本资源包括PV操作的源代码和报告,通过PV操作实现同步机制