欢迎来到天天文库
浏览记录
ID:46803612
大小:30.00 KB
页数:6页
时间:2019-11-28
《和尚挑水、猴子过桥问题》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、1.和尚挑水问题:寺庙里有多个小、老和尚,一水缸。小和尚取水,老和尚饮水。水缸容积10桶水,水取自同一水井,水井每次只容一个桶取水,桶总数3个,每次入、取水缸水仅为一桶。试用P、V操作描述和尚取水、饮水的互斥与同步过程。mutex1=mutex2=1;分别代表水井和水缸empty=10;水缸的入水量full=0;水缸的取水量count=3;水桶个数打水:beginp(empty)p(count)p(mutex1)从水井打水;v(mutex1)p(mutex2)往缸中放水v(mutex2)v(full)v(count)end取水:beginp(full)p(count)p(mutex2
2、)从水缸取水v(mutex2)v(count)v(empty)end1.花果山有一处峡谷,横跨峡谷拉了一根绳索(假设为左右方向),猴子可以攀着绳索越过峡谷。只要它们朝着相同的方向,同一时刻可以有多只猴子通过。但是如果在相反的方向上同时有猴子通过则会发生死锁(这些猴子将被卡在绳索中间,假设这些猴子无法在绳索上从另一只猴子身上翻过去)。如果一只猴子相越过峡谷,它必须看当前是否有别的猴子在逆向通过。请使用信号量写一个避免死锁的程序来解决该问题。mutex=1左右过桥公用信号量,实现先来先过桥leftmutex=rightmutex=1从左往右过桥示意如下,从右往左基本和从左往右相同:P(l
3、eftmutex);Ifleftcount=0P(mutex);Leftcount++;V(leftmutex);左至右过桥;P(leftmutex);Leftcount--;Ifleftcount=0V(mutex);V(leftmutex);写者优先(绝对优先)Readable=writable=rmutex=wmutex=1读者:P(readable);P(rmutex);Ifreadcount==0P(wmutex);Readcount++;V(rmutex);V(readable);读操作;P(rmutex);Readcount--;Ifreadcount=0thensig
4、nal(wrmutex);V(rmutex);写者:P(writable);Writecount++;Ifwritecount==1P(readable);V(writable);P(wmutex);写操作;V(wmutex);P(writable);Writecount--;Ifwritecount==0V(readable);V(writable);花果山有一处峡谷,横跨峡谷拉了一根绳索(假设为左右方向),猴子可以攀着绳索越过峡谷。按照“先来先过桥”的原则,只要它们朝着相同的方向,而相反方向又没有猴子排队等待过绳索时,同一时刻可以有多只猴子通过。但是如果相反方向已经有猴子在通过绳
5、索,或更早来到排队过桥,则必须让相反方向猴子先通过,否则可能会发生死锁(假设这些猴子无法在绳索上从另一只猴子身上翻过去)。请使用信号量写一个避免死锁的程序来解决该问题。mutex=1左右过桥公用信号量,实现先来先过桥leftmutex=rightmutex=1从左往右过桥示意如下,从右往左基本和从左往右相同P(mutex);P(leftmutex);Ifleftcount=0P(rightmutex);Leftcount++;V(leftmutex);V(mutex)左至右过桥;P(leftmutex);Leftcount--;Ifleftcount=0V(rightmutex);V
6、(leftmutex);哲学家进餐(同时拿起两根筷子):方法一:(AND)semaphorechopstick[5]={1,1,1,1,1};voidphilosopher(intI){while(true){think();Swait(chopstick[(I+1)]%5,chopstick[I]);eat();Ssignal(chopstick[(I+1)]%5,chopstick[I]);}}方法二:(错误)semaphoremutex=1;semaphorechopstick[5]={1,1,1,1,1};voidphilosopher(intI){while(true){t
7、hink();wait(mutex);wait(chopstick[(I+1)]%5);wait(chopstick[I]);signal(mutex);eat();signal(chopstick[(I+1)]%5);signal(chopstick[I]);}}方法三:semaphoremutex=1;semaphorechopstick[5]={1,1,1,1,1};voidphilosopher(intI){while(true){think();
此文档下载收益归作者所有