某寺庙中有老和尚、小和尚若干。庙内有一水缸,由小和尚提水入缸,供老和尚饮用。水缸可容纳30桶水,每次入水、取水仅为1桶,不可同时进行。水取自同一井中,水井径窄,每次只能容纳一个水桶取水。设水桶个数为5个,试用信号量和P、V操作给出小和尚和老和尚的活动。
分析:
小和尚进程分析:小和尚开始工作时,先看一下水缸有没有空位(empty),如果有,就去打水,打水需要桶,所以需要申请使用水桶,有了桶之后开始到水井打水,打完水后要把水倒入水缸,此时缸中多了一桶水;
老和尚进程分析:老和尚要喝水,先看一下水缸里有没有水(full),如果有,就去喝水,喝水需要桶,所以需要申请使用水桶,有了桶之后开始到水缸喝水,喝完水后缸中少了一桶水。
设置如下信号量:
semaphore empty=30; // 缸中可装水桶数的空位
semaphore full=0; //表示缸中水量,初始时没有水
semaphore buckets=5; //可用桶数
semaphore mw=1; //实现对井的互斥
semaphore mj=1; //实现对缸的互斥
伪代码:
semaphore empty=30; // 缸中可装水桶数的空位
semaphore full=0; //表示缸中水量,初始时没有水
semaphore buckets=5; //可用桶数
semaphore mw=1; //实现对井的互斥
semaphore mj=1; //实现对缸的互斥
main()
{
cobegin
little_monk();
old_monk();
coend
}
little_monk(){
while(1)
{
P(empty); //水缸有没有空位
P(buckets); //申请使用水桶
去井边
P(mw); //申请使用水井
打水
V(mw);
打完水回去
P(mj); //申请往水缸倒水
倒水入缸;
V(mj);
V(buckets); //结束使用水桶
V(full); //缸中多了一桶水(变满了,所以是full)
}
}
old_monk()
{
while(1)
{
P(full); //水缸里有没有水
P(buckets); //申请使用水桶
P(mj); //申请从水缸喝水
从缸里取水;
V(mj);
V(buckets); //结束使用水桶
V(empty); //缸中少了一桶水(变少了,所以是empty)
}
}