小和尚挑水(信号量和PV操作)
原创
©著作权归作者所有:来自51CTO博客作者mb614decb9ad0b0的原创作品,请联系作者获取转载授权,否则将追究法律责任
<--------个人网站传送门------->
某寺庙,有小和尚、老和尚若干.庙内有一水缸,由小和尚提水入缸,供老和尚饮用。
水缸可容纳 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());
}
总结:此类问题一定要注意分析清楚题目中存在哪些互斥操作。