题目:
某寺庙,有小和尚、老和尚若干。庙内有一水缸,由小和尚提水入缸,供老和尚饮用。水缸可容纳10桶水,每次入水、取水仅为1桶,不可同时进行。水取自同一井中,水井径窄,每次只能容纳一个水桶取水。设水桶个数为3个,试用信号量和PV操作给出老和尚和小和尚的活动。
提示:从井中取水并放入水缸是一个连续的动作可以视为一个进程,从缸中取水为另一个进程。
设水井和水缸为临界资源,引入mutex1,mutex2;三个水桶无论从井中取水还是放入
水缸中都一次一个,应该给他们一个信号量count,抢不到水桶的进程只好为等待,水缸满了时,不可以再放水了。设empty控制入水量,水缸空了时,不可取水设full。
伪代码:
int n1 = 10; /*水缸容量*/
int n2 = 3; /*水桶数量*/
semaphore mutex1 = 1; /*水井互斥信号量*/
semaphore mutex2 = 1; /*水缸互斥信号量*/
semaphore empty = n1; /*小和尚取水同步信号量*/
semaphore full = 0; /*老和尚饮水同步信号量*/
semaphore count = n2; /*水桶数信号量*/
void youngMonk(){
while (1){
P(empty);
P(count);
P(mutex1);
//小和尚从井中取水
V(mutex1);
p(mutex2);
//小和尚向缸中倒水
V(mutex2);
V(count);
V(full);
}
}
void oldMonk(){
while (1){
P(full);
P(count);
P(mutex2);
//老和尚从缸中取水饮用
V(mutex2);
V(count);
V(empty);
}
}