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原语概述 ...此外,对于复杂的多进程同步问题,如哲学家问题,PV原语也能提供有效的解决策略。通过理解和应用PV原语,可以更好地设计出高效、稳定的多进程系统。
3. **哲学家就餐问题**:利用PV操作可以解决五个哲学家如何在不导致死锁的情况下共享筷子的问题。 #### 五、PV原语的局限性 尽管PV原语是一种非常有用的同步工具,但它也有一些局限性: 1. **死锁**:不当使用PV...
哲学家进餐问题(Dining Philosophers Problem)是计算机科学中的一个经典同步问题,由艾兹格·迪杰斯特拉在1965年提出。它以五个正在进餐的哲学家为背景,每个哲学家都有两个习惯:思考和吃饭。在餐桌上有五根筷子...
PV原语是操作系统中用于进程间同步和互斥的关键机制,由荷兰计算机科学家Dijkstra于1965年提出。PV原语的核心在于它们是一段不可分割、不可中断的程序,确保了操作的原子性。PV操作是通过信号量(semaphore)这一...
哲学家就餐linux下C编程源代码
PV原语是由荷兰科学家E.W.Dijkstra提出的,用于解决并发进程之间的互斥和同步问题。在操作系统中,PV原语是不可分割的操作,确保在执行过程中不会被中断,从而保证了对共享资源的正确访问。 P原语操作主要包括三个...
### 操作系统PV原语详解与实例解析 ...通过以上实例,我们可以看到PV原语如何有效地解决了资源竞争和进程同步的问题,确保了程序的正确性和高效运行。在实际开发中,合理运用PV原语能够显著提高系统的稳定性和性能。
### 如何用PV原语实现进程间的互斥与同步 #### PV原语概念与作用 在计算机科学领域,特别是操作系统理论中,PV操作是用于控制并发进程之间互斥与同步的关键机制之一。PV操作(也称作信号量操作)是由荷兰科学家...
在哲学家吃面问题中,每根筷子对应一个信号量。 一种解决方案是为每根筷子设置一个信号量,初始值为1。当哲学家想要拿起筷子时,他会先对左边的筷子执行P操作,如果成功,则继续对右边的筷子执行P操作。吃完面后,...
这个问题由Dijkstra提出,通常用PV操作(P代表“Procedure Wait”,V代表“Procedure Signal”)来解决,也就是我们常说的信号量机制。在本课题中,我们将使用VC++作为编程工具来实现这个模型。 生产者与消费者问题...
【计算机操作系统之 PV 原语分析及计算】 在计算机操作系统中,进程间的同步与互斥是关键问题,而PV原语就是解决这类问题的重要工具。PV原语是由荷兰计算机科学家Dijkstra提出的,它们基于信号量机制,确保了对共享...
8. **并发控制**:理解并解决哲学家就餐问题有助于深入理解操作系统中的并发控制技术,如信号量、管程、 monitors 和其他同步原语。 通过实际编写和运行哲学家就餐问题的代码,学生可以更好地理解和掌握并发环境中...
3. 进程同步:通过PV操作,可以协调多个进程的执行顺序,避免数据不一致性,例如在哲学家问题中的解决方案,通过调整进程获取筷子的顺序,可以防止死锁的发生。 在哲学家问题中,初始设置5个信号量c[0]~c[4],值为1...
《用多线程同步方法解决哲学家就餐问题》 在计算机科学领域,操作系统的设计与实现是至关重要的一环,其中涉及到的并发控制问题尤为引人关注。"哲学家就餐问题"(Dining Philosophers Problem)就是一个经典的并发...
解决哲学家问题的一种常见方法是使用"避免死锁"策略,例如"先取低编号筷子,再取高编号筷子"的规则。在Java中,可以创建一个代表每根筷子的对象,并将它们作为共享资源,每个哲学家线程在尝试拿起筷子时会先尝试获取...
实现了Windows下的PV原语操作,即传统上的生产者与消费者 设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个自定义的确定的数值,例如N=32)。你需要使用如下信号量...
哲学家进餐问题,是计算机科学中的一个著名同步问题,由艾兹格·迪杰斯特拉在1965年提出,用以模拟五个哲学家(代表并发进程)在餐桌旁用餐的情景。这个问题旨在揭示并发控制中的死锁现象,并为解决这类问题提供思路...
在描述中,“设计pv原语”是关键的IT知识点,这通常指的是进程间通信(IPC)中的信号量机制,特别是Peterson算法或Valiant算法,它们用于解决多线程环境中的同步问题。PV操作是信号量的一种基本操作,P操作表示请求...