​<--------个人网站传送门------->​

某寺庙,有小和尚、老和尚若干.庙内有一水缸,由小和尚提水入缸,供老和尚饮用。

水缸可容纳 30 桶水,每次入水、取水仅为1 桶,不可同时进行。

水取自同一井中,水井径窄,每次只能容纳一个水桶取水。

设水桶个数为5 个,试用信号量和PV 操作给出老和尚和小和尚的同步算法。

操作系统老师给出的一道题目,个人觉得同样很经典的同步与互斥问题。

题目中的互斥分析:

水缸可容纳 30 桶水,每次入水、取水仅为1 桶,不可同时进行。—>水缸中入水/取水互斥。

水取自同一井中,水井径窄,每次只能容纳一个水桶取水。—>井中取水互斥。

水缸可容纳 30 桶水,每次入水、取水仅为1 桶,不可同时进行。—>满缓冲块数目为30

水桶个数为5 个。—>水桶个数只能有5个。

进程描述:(有问题欢迎指出)


semaphore mutex1=1,mutex2=1,empty=30,full=0,cnt=5;
/*
mutex1实现从井中取水互斥,mutex2实现从缸中入水/取水互斥;
empty初值为30,指示空缓冲块数目。
full初值为0,指示满缓冲块数目。
cnt为水桶数,只有5个水桶。
*/
void young()//小和尚
{
p(empty);
p(cnt);
p(mutex1);
从井中取水;
v(mutex1);
p(mutex2);
送水到水缸;
v(mutex2);
v(cnt);
v(full);
}
void senior()//老和尚
{
p(full);
p(cnt);
p(mutex2)
从缸中取水;
v(mutex2);
v(cnt);
v(empty);
}
void main()
{
parbegin(young(),senior());
}


总结:此类问题一定要注意分析清楚题目中存在哪些互斥操作。