作业参考答案.docx
- 文档编号:28393537
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:15
- 大小:164.49KB
作业参考答案.docx
《作业参考答案.docx》由会员分享,可在线阅读,更多相关《作业参考答案.docx(15页珍藏版)》请在冰豆网上搜索。
作业参考答案
第三章作业参考答案(总9页)
第三章作业参考答案
P181第3题:
答:
现对进程语句进行编号,以方便描述。
P1:
P2:
beginbegin
y:
=1;①x:
=1;⑤
y:
=y+3;②x:
=x+5;⑥
V(S1);P(S1);
z:
=y+1;③x:
=x+y;⑦
P(S2);V(S2);
y:
=z+y④z:
=z+x;⑧
end.end.
①、②、⑤和⑥是不相交语句,可以任何次序交错执行,而结果是唯一的。
接着无论系统如何调度进程并发执行,当执行到语句⑦时,可以得到x=10,y=4。
按Bernstein条件,语句③的执行结果不受语句⑦的影响,故语句③执行后得到z=5。
最后,语句④和⑧并发执行,这时得到了两种结果为:
语句④先执行:
x=10,y=9,z=15。
语句⑧先执行:
x=10,y=19,z=15。
此外,还有第三种情况,语句③被推迟,直至语句⑧后再执行,于是依次执行以下三个语句:
z:
=z+x;
z:
=y+1;
y:
=z+y;
这时z的值只可能是y+1=5,故y=z+y=5+4=9,而x=10。
第三种情况为:
x=10,y=9,z=5。
P181第5题:
解:
设信号量empty,mutex;
empty:
=100;
mutex:
=1;
parbegin
读者进入:
begin
P(empty);
P(mutex);
登记;
P(mutex);
End;
读者离开:
begin
P(mutex);
撤消登记;
V(mutex);
V(empty);
End;
Parend;
P181第6题:
答:
实质上是两个进程的同步问题,设信号量S1和S2分别表示可拣白子和黑子,不失一般性,若令先拣白子。
Main()
{intS1=1,S2=0;
Cobegin
P1();
P2();
Coend
}
P182第15题:
Dijkstra临界区软件算法描述如下:
varflag:
array[0…n]of(idle,want-in,in_cs);
turn:
integer;tune:
0or1or…or,n-1;
processPi(i=0,1,…,n-1)
varj;integer;
begin
repeat
repeat
flag[i]:
=want_in;
whileturn≠ido
ifflag[turn]==idlethenturn:
=i;
flag[i]:
=in_cs;
j:
=0;
while(j doj: =j+1; untilj≧n; criticalsection; flag[i]: =idle; … untilfalse; end. 试说明该算法满足临界区原则。 答: 为方便描述,把Dijkstra程序的语句进行编号: repeat flag[i]: =want_in;① whileturn≠ido② ifflag[turn]==idlethenturn: =i;③ flag[i]: =in_cs;④ j: =0; while(j 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;或者相反,这时已经形成死锁。 如图所示:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 作业 参考答案