和尚挑水、猴子过桥问题
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
V(writable);
P(wmutex);
写操作;
V(wmutex);
P(writable);
Writecount--;
If writecount == 0 V(readable);
V(writable);
花果山有一处峡谷,横跨峡谷拉了一根绳索(假设为左右方向),猴子可以攀着绳索越过峡谷。按照“先来先过桥”的原则,只要它们朝着相同的方向,而相反方向又没有猴子排队等待过绳索时,同一时刻可以有多只猴子通过。但是如果相反方向已经有猴子在通过绳索,或更早来到排队过桥,则必须让相反方向猴子先通过,否则可能会发生死锁(假设这些猴子无法在绳索上从另一只猴子身上翻过去)。请使用信号量写一个避免死锁的程序来解决该问题。
1.和尚挑水问题:寺庙里有多个小、老和尚,一水缸。小和尚取水,老和尚饮水。水缸容积10桶水,水取自同一水井,水井每次只容一个桶取水,桶总数3个,每次入、取水缸水仅为一桶。试用P、V操作描述和尚取水、饮水的互斥与同步过程。
mutex1=mutex2=1;分别代表水井和水缸empty=10;水缸的入水量
signal(chopstick[(I+1)]%5);
signal(chopstick[I]);
}
}
v(mutex2)
v(count)
v(empty)
end
2.花果山有一处峡谷,横跨峡谷拉了一根绳索(假设为左右方向),猴子可以攀着绳索越过峡谷。只要它们朝着相同的方向,同一时刻可以有多只猴子通过。但是如果在相反的方向上同时有猴子通过则会发生死锁(这些猴子将被卡在绳索中间,假设这些猴子无法在绳索上从另一只猴子身上翻过去)。如果一只猴子相越过峡谷,它必须看当前是否有别的猴子在逆向通过。请使用信号量写一个避免死锁的程序来解决该问题。
mutex = 1左右过桥公用信号量,实现先来先过桥
leftmutex=rightmutex=1
从左往右过桥示意如下,从右往左基本和从左往右相同:
P(leftmutex);
If leftcount = 0 P(mutex);
Leftcount++;
V(leftmutex);
左至右过桥;
P(leftmutex);
void philosopher(int I)
{
while(true)
{
think();
wait(mutex);
wait(chopstick[(I+1)]%5);
wait(chopstick[I]);
signal(mutex);
eat();
signal(chopstick[(I+1)]%5);
signal(chopstick[I]);
mutex = 1左右过桥公用信号量,实现先来先过桥
leftmutex=rightmutex=1
从左往右过桥示意如下,从右往左基本和从左往右相同
P(mutex);
P(leftmutex);
If leftcount = 0 P(rightmutex);
Leftcount++;
V(leftmutex);
else if flag(i) == 1 {signal(mutex); wait(chopstick(i))}
else {
flag([i+1]%5) = flag(i) = 1
wait(chopstick[(I+1)]%5);
wait(chopstick[I]);
signal(mutex);
eat();
Leftcount--;
If leftcount = 0 V(mutex);
V(leftmutex);
3.
写者优先(绝对优先)
Readable=writable=rmutex=wmutex=1源自读者:P(readable);
P(rmutex);
If readcount ==0 P(wmutex);
Readcount++;
V(mutex)
左至右过桥;
P(leftmutex);
Leftcount--;
If leftcount = 0 V(rightmutex);
V(leftmutex);
哲学家进餐(同时拿起两根筷子):
方法一:(AND)
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int I)
{
while(true)
{
think();
Swait(chopstick[(I+1)]%5,chopstick[I]);
eat();
Ssignal(chopstick[(I+1)]%5,chopstick[I]);
}
}
方法二:(错误)
semaphore mutex = 1 ;
semaphore chopstick[5]={1,1,1,1,1};
V(rmutex);
V(readable);
读操作;
P(rmutex);
Readcount--;
If readcount = 0 then signal (wrmutex);
V(rmutex);
写者:
P(writable);
Writecount++;
If writecount == 1 P(readable);
}
}
方法三:
semaphore mutex = 1 ;
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int I)
{
while(true)
{
think();
wait(mutex);
if flag([i+1]%5) == 1 {signal(mutex); wait(chopstick[(i+1)%5])}
full=0;水缸的取水量count=3;水桶个数
打水:
begin
p(empty)
p(count)
p(mutex1)
从水井打水;
v(mutex1)
p(mutex2)
往缸中放水
v(mutex2)
v(full)
v(count)
end
取水:
begin
p(full)
p(count)
p(mutex2)
从水缸取水
P(wmutex);
写操作;
V(wmutex);
P(writable);
Writecount--;
If writecount == 0 V(readable);
V(writable);
花果山有一处峡谷,横跨峡谷拉了一根绳索(假设为左右方向),猴子可以攀着绳索越过峡谷。按照“先来先过桥”的原则,只要它们朝着相同的方向,而相反方向又没有猴子排队等待过绳索时,同一时刻可以有多只猴子通过。但是如果相反方向已经有猴子在通过绳索,或更早来到排队过桥,则必须让相反方向猴子先通过,否则可能会发生死锁(假设这些猴子无法在绳索上从另一只猴子身上翻过去)。请使用信号量写一个避免死锁的程序来解决该问题。
1.和尚挑水问题:寺庙里有多个小、老和尚,一水缸。小和尚取水,老和尚饮水。水缸容积10桶水,水取自同一水井,水井每次只容一个桶取水,桶总数3个,每次入、取水缸水仅为一桶。试用P、V操作描述和尚取水、饮水的互斥与同步过程。
mutex1=mutex2=1;分别代表水井和水缸empty=10;水缸的入水量
signal(chopstick[(I+1)]%5);
signal(chopstick[I]);
}
}
v(mutex2)
v(count)
v(empty)
end
2.花果山有一处峡谷,横跨峡谷拉了一根绳索(假设为左右方向),猴子可以攀着绳索越过峡谷。只要它们朝着相同的方向,同一时刻可以有多只猴子通过。但是如果在相反的方向上同时有猴子通过则会发生死锁(这些猴子将被卡在绳索中间,假设这些猴子无法在绳索上从另一只猴子身上翻过去)。如果一只猴子相越过峡谷,它必须看当前是否有别的猴子在逆向通过。请使用信号量写一个避免死锁的程序来解决该问题。
mutex = 1左右过桥公用信号量,实现先来先过桥
leftmutex=rightmutex=1
从左往右过桥示意如下,从右往左基本和从左往右相同:
P(leftmutex);
If leftcount = 0 P(mutex);
Leftcount++;
V(leftmutex);
左至右过桥;
P(leftmutex);
void philosopher(int I)
{
while(true)
{
think();
wait(mutex);
wait(chopstick[(I+1)]%5);
wait(chopstick[I]);
signal(mutex);
eat();
signal(chopstick[(I+1)]%5);
signal(chopstick[I]);
mutex = 1左右过桥公用信号量,实现先来先过桥
leftmutex=rightmutex=1
从左往右过桥示意如下,从右往左基本和从左往右相同
P(mutex);
P(leftmutex);
If leftcount = 0 P(rightmutex);
Leftcount++;
V(leftmutex);
else if flag(i) == 1 {signal(mutex); wait(chopstick(i))}
else {
flag([i+1]%5) = flag(i) = 1
wait(chopstick[(I+1)]%5);
wait(chopstick[I]);
signal(mutex);
eat();
Leftcount--;
If leftcount = 0 V(mutex);
V(leftmutex);
3.
写者优先(绝对优先)
Readable=writable=rmutex=wmutex=1源自读者:P(readable);
P(rmutex);
If readcount ==0 P(wmutex);
Readcount++;
V(mutex)
左至右过桥;
P(leftmutex);
Leftcount--;
If leftcount = 0 V(rightmutex);
V(leftmutex);
哲学家进餐(同时拿起两根筷子):
方法一:(AND)
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int I)
{
while(true)
{
think();
Swait(chopstick[(I+1)]%5,chopstick[I]);
eat();
Ssignal(chopstick[(I+1)]%5,chopstick[I]);
}
}
方法二:(错误)
semaphore mutex = 1 ;
semaphore chopstick[5]={1,1,1,1,1};
V(rmutex);
V(readable);
读操作;
P(rmutex);
Readcount--;
If readcount = 0 then signal (wrmutex);
V(rmutex);
写者:
P(writable);
Writecount++;
If writecount == 1 P(readable);
}
}
方法三:
semaphore mutex = 1 ;
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int I)
{
while(true)
{
think();
wait(mutex);
if flag([i+1]%5) == 1 {signal(mutex); wait(chopstick[(i+1)%5])}
full=0;水缸的取水量count=3;水桶个数
打水:
begin
p(empty)
p(count)
p(mutex1)
从水井打水;
v(mutex1)
p(mutex2)
往缸中放水
v(mutex2)
v(full)
v(count)
end
取水:
begin
p(full)
p(count)
p(mutex2)
从水缸取水