某寺庙,有小和尚、老和尚若干.庙内有一水缸,由小和尚提水入缸,供老和尚饮用。
水缸可容纳 30 桶水,每次入水、取水仅为1 桶,不可同时进行。
水取自同一井中,水井径窄,每次只能容纳一个水桶取水。
设水桶个数为5 个,试用信号量和PV 操作给出老和尚和小和尚的同步算法。
操作系统老师给出的一道题目,个人觉得同样很经典的同步与互斥问题。
题目中的互斥分析:
水缸可容纳 30 桶水,每次入水、取水仅为1 桶,不可同时进行。--->水缸中入水/取水互斥。
水取自同一井中,水井径窄,每次只能容纳一个水桶取水。--->井中取水互斥。
水缸可容纳 30 桶水,每次入水、取水仅为1 桶,不可同时进行。--->满缓冲块数目为30
水桶个数为5 个。--->水桶个数只能有5个。
进程描述:(有问题欢迎指出)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
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()); } |
总结:此类问题一定要注意分析清楚题目中存在哪些互斥操作。
Post a new comment