doj:
=j+1;⑥
untilj≧n;
criticalsection;
flag[i]:
=idle;⑦
…
(1)满足互斥条件
当所有的Pj都不在临界区中,满足flag[j]≠in_cs(对于所有j,j≠i)条件时,Pi才能进入它的临界区,而且进程Pi不会改变除自己外的其他进程所对应的flag[j]的值。
另外,进程Pi总是先置自己的flag[i]为in_cs后,才去判别Pj进程的flag[j]的值是否等于in_cs,所以,此算法能保证n个进程互斥地进入临界区。
(2)不会发生无休止等待进入临界区
由于任何一个进程Pi在执行进入临界区代码时先执行语句①,其相应的flag[i]的值不会是idle。
注意到flag[i]=in_cs并不意味着turn的值一定等于i。
我们来看以下情况,不失一般性,令turn的初值为0,且P0不工作,所以,flag[turn]=flag[0]=idle。
但是若干个其他进程是可能同时交替执行的,假设让进程Pj(j=1,2,..,n-1)交错执行语句①后(这时flag[j]=want_in),再做语句②(第一个while语句),来查询flag[turn]的状态。
显然,都满足turn≠i,所以,都可以执行语句③,让自己的turn为j。
但turn仅有一个值,该值为最后一个执行此赋值语句的进程号,设为k、即turn=k(1≤k≦n-1)。
接着,进程Pj(j=1,2,..,n-1)交错执行语句④,于是最多同时可能有n-1个进程处于in_cs状态,但不要忘了仅有一个进程能成功执行语句④,将turn置为自己的值。
假设{P1,P2,…Pm}是一个已将flag[i]置为in_cs(i=1,2,…,m)(m≤n-1)的进程集合,并且已经假设当前turn=k(1≤k≤m),则Pk必将在有限时间内首先进入临界区。
因为集合中除了Pk之外的所有其他进程终将从它们执行的语句⑤(第二个while循环语句)退出,且这时的j值必小于n,故内嵌until起作用,返回到起始语句①重新执行,再次置flag[i]=want_in,继续第二轮循环,这时的情况不同了,flag[turn]=flag[k]必定≠idle(而为in_cs)。
而进程Pk发现最终除自身外的所有进程Pj的flag[j]≠in_cs,并据此可进入其临界区。
P183第21题:
公园有一个恐龙博物馆和一个花园,有m个旅客和n辆车,每辆车仅能乘一个旅客。
旅客在博物馆逛了一会,然后,排队乘坐旅行车,当一辆车可用时,它载入一个旅客,再绕花园行驶任意长的时间。
若n辆车都已被旅客乘坐游玩,则想坐车的旅客需要等待。
如果一辆车已经空闲,但没有游玩的旅客了,那么,车辆要等待。
试用信号量和P、V操作同步m个旅客和n辆车子。
答:
这是一个汇合机制,有两类进程:
顾客进程和车辆进程,需要进行汇合、即顾客要坐进车辆后才能游玩,开始时让车辆进程进入等待状态。
varscl,sck,sc,kx,xc,mutex:
semaphore;
sck:
=kx:
=sc:
=xc:
=0;
sc1:
=n;mutex:
=1;
sharearea:
一个登记车辆\被服务乘客信息的共享区;
cobegin
process顾客i(i=1,2,…)
begin
P(scl);/*车辆最大数量信号量
P(mutex);/*封锁共享区,互斥操作
在共享区sharearea登记被服务的顾客的信息:
起始和到达地点,行驶时间
V(sck);/*释放一辆车,即顾客找到一辆空车
P(kx);/*车辆要配备驾驶员,顾客等待被载,
上车;
V(sc);/*顾客进程已汇合到车辆进程,即顾客坐进车里
P(xc);/*待游玩结束后后,顾客等待下车
V(scl);/*空车辆数加1
end
Process车辆j(j=1,2,…)
begin
L:
P(sck);/*车辆等待有硕客来使用
在共享区sharearea登记那一辆车被使用,并与顾客进程汇合;
V(mutex);/*这时可开放共享区,让另一顾客雇车
V(kx);/*允许顾客用此车辆
P(sc);/*车辆等待顾客上车
车辆载着顾客开行到目的地;
v(xc);/*允许顾客下车
gotoL;
end
coend
P184第24题:
24.系统有A、B、C、D共4种资源,在某时刻进程P0、P1、P2、P3和P4对资源的占有和需求情况如表,试解答下列问题:
Process
Allocation
Claim
Available
ABCD
ABCD
ABCD
P0
0032
0044
1622
P1
1000
2750
P2
1354
361010
P3
0332
0984
P4
0014
06610
(1)系统此时处于安全状态吗
(2)若此时P2发出request2(1、2、2、2),系统能分配资源给它吗为什么
答:
(1)系统处于安全状态,存在安全序列:
P0,P3,P4,P1,P2。
(2)不能分配,否则系统会处于不安全状态。
P185第26题:
答:
1.由于系统目前还有=40个单元,P4进程到达,把25个单元分给它。
这时系统还余15个单元,可把15个单元分给P3,它执行完后会释放60个单元。
于是可供P1(还要45个单元),P2(还要20个单元),P4(还要35个单元)任何一个执行。
安全序列为:
P1,P2,P3,P4,P3,P1,P2,P4
P1,P2,P3,P4,P3,P1,P4,P2
P1,P2,P3,P4,P3,P2,P1,P4
P1,P2,P3,P4,P3,P2,P4,P1
P1,P2,P3,P4,P3,P4,P1,P2
P1,P2,P3,P4,P3,P4,P2,P1
进程到达,P4最大需求60,最初请求35。
如果把35个单元分给P4,系统还余5个单元,不再能满足任何一个进程的需求,系统进入不安全状态。
P185第31题:
解:
semaphonewait,mutex1,mutex2;
mutex1=mutex2=1;
wait=1;
intcounter1,counter2;
counter1=0;counter2=0;
cobegin
processP东()
{P(mutex1);
counter1++;
if(counter1==1)
P(wait);
V(mutex1);
{过独木桥};
P(mutex1);
counter1--;
if(counter1==0)
V(wait);
V(mutex1);
}
processP西()
{P(mutex2);
counter2++;
if(counter2==1)
P(wait);
V(mutex2);
{过独木桥};
P(mutex2);
counter2--;
if(counter2==0)
V(wait);
V(mutex2);
}
coend
P185第32题:
解:
semaphonewait,mutex1,mutex2,bridge;
mutex1=mutex2=1;
bridge=k;
wait=1;
intcounter1,counter2;
counter1=0;counter2=0;
cobegin
processP东()
{P(mutex1);
counter1++;
if(counter1==1)
P(wait);
V(mutex1);
P(bridge);
{过独木桥};
V(bridge);
P(mutex1);
counter1--;
if(counter1==0)
V(wait);
V(mutex1);
}
processP西()
{P(mutex2);
counter2++;
if(counter2==1)
P(wait);
V(mutex2);
P(bridge);
{过独木桥};
V(bridge);
P(mutex2);
counter2--;
if(counter2==0)
V(wait);
V(mutex2);
}
coend
P185第33题:
解:
semaphonewait,mutex1,mutex2;
mutex1=mutex2=1;
wait=1;
intcounter1,counter2;
counter1=0;counter2=0;
semaphones1,s2;
s1=3;s2=0;
cobegin
processP东()
{P(s1);
P(mutex1);
counter1++;
if(counter1==1)
P(wait);
V(mutex1);
{过独木桥};
V(s2);
P(mutex1);
counter1--;
if(counter1==0)
V(wait);
V(mutex1);
}
processP西()
{P(s2);
P(mutex2);
counter2++;
if(counter2==1)
P(wait);
V(mutex2);
{过独木桥};
V(s1);
P(mutex2);
counter2--;
if(counter2==0)
V(wait);
V(mutex2);
}
coend
P186第34题:
解:
semaphonewait,mutex1,mutex2;
mutex1=mutex2=1;
wait=1;
intcounter1,counter2;
counter1=0;counter2=0;
semaphonestop;
stop=1;
cobegin
processP东()
{P(stop);
P(mutex1);
counter1++;
if(counter1==1)
P(wait);
V(mutex1);
V(stop);
{过独木桥};
P(mutex1);
counter1--;
if(counter1==0)
V(wait);
V(mutex1);
}
processP西()
{P(stop);
P(mutex2);
counter2++;
if(counter2==1)
P(wait);
V(mutex2);
V(stop);
{过独木桥};
P(mutex2);
counter2--;
if(counter2==0)
V(wait);
V(mutex2);
}
coend
P185第36题:
解:
36.答:
当两个进程都执行完第一部(都占用R1)时,系统进入不安全状态。
这时无论哪个进程执行完第二步,死锁都会发生。
可能达到死锁点:
进程P1占有一个R1和一个R2,而进程P2占有一个R1;或者相反,这时已经形成死锁。
如图所示: