CH3应用题参考答案.docx
《CH3应用题参考答案.docx》由会员分享,可在线阅读,更多相关《CH3应用题参考答案.docx(17页珍藏版)》请在冰豆网上搜索。
CH3应用题参考答案
CH3应用题参考答案
1有三个并发进程:
R负责从输入设备读入信息块,M负责对信息块加工处理;P负责打印输出信息块。
今提供;
1)一个缓冲区,可放置K个信息块;
2)二个缓冲区,每个可放置K个信息块;
试用信号量和P、V操作写出三个进程正确工作的流程。
答:
1)varB:
array[0,k-1]ofitem;
sread:
semaphore:
=k;
smanage:
semaphore:
=0;
swrite:
semaphore:
=0;
rptr:
integer:
=0;
mptr:
integer:
=0;
wptr:
integer:
=0;
x:
item
cobegin
processreader;
begin
L1:
readamessageintox;
P(sread);
B[rptr]:
=x;
rptr:
=(rptr+1)modk;
V(smanage);
gotoL1;
end;
processmanager;
begin
L2:
P(smanage);
x:
=B[mptr];
mptr:
=(mptr+1)modk;
managethemessageinx;
B[mptr]:
=x;
V(swrite);
gotoL2;
end;
processwriter;
begin
L3:
P(swrite);
x:
=B[wptr];
wptr:
=(wptr+1)modk;
V(sread);
Printthemessageinx;
gotoL3;
end;
coend
2)varA,B:
array[0,k-1]ofitem;
sput1:
semaphore:
=k;
sput2:
semaphore:
=k;
sget1:
semaphore:
=0;
sget2:
semaphore:
=0;
put1:
integer:
=0;
put2:
integer:
=0;
get1:
integer:
=0;
get2:
integer:
=0;
cobegin
processreader;
begin
L1:
readamessageintox;
P(sput1);
A[put1]:
=x;
put1:
=(put1+1)modk;
V(sget1);
GotoL1;
end;
processmanager;
begin
L2:
P(sget1);
x:
=A[get1];
get1:
=(get1+1)modk;
V(sput1);
Managethemessageintox;
P(sput2);
B[put2]:
=x;
put2:
=(put2+1)modk;
V(sget2);
GotoL2;
end;
processwriter;
begin
L3:
P(sget2);
x:
=B[get2];
get2:
=(get2+1)modk;
V(sput2);
Printthemessageinx;
GotoL3;
end;
coend
2设有n个进程共享一个互斥段,如果:
(1)每次只允许一个进程进入互斥段;
(2)每次最多允许m个进程(m≤n)同时进入互斥段。
试问:
所采用的信号量初值是否相同?
信号量值的变化范围如何?
答:
所采用的互斥信号量初值不同。
1)互斥信号量初值为1,变化范围为[-n+1,1]。
当没有进程进入互斥段时,信号量值为1;当有1个进程进入互斥段但没有进程等待进入互斥段时,信号量值为0;当有1个进程进入互斥段且有一个进程等待进入互斥段时,信号量值为-1;最多可能有n-1个进程等待进入互斥段,故此时信号量的值应为-(n-1)也就是-n+1。
2)互斥信号量初值为m,变化范围为[-n+m,m]。
当没有进程进入互斥段时,信号量值为m;当有1个进程进入互斥段但没有进程等待进入互斥段时,信号量值为m-1;当有m个进程进入互斥段且没有一个进程等待进入互斥段时,信号量值为0;当有m个进程进入互斥段且有一个进程等待进入互斥段时,信号量值为-1;最多可能有n-m个进程等待进入互斥段,故此时信号量的值应为-(n-m)也就是-n+m。
3有两个优先级相同的进程P1和P2,各自执行的操作如下,信号量S1和S2初值均为0。
试问P1、P2并发执行后,x、y、z的值各为多少?
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+yz:
=z+x;
end.end.
答:
现对进程语句进行编号,以方便描述。
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。
4有一阅览室,读者进入时必须先在一张登记表上登记,该表为每一座位列出一个表目,包括座号、姓名,读者离开时要注销登记信息;假如阅览室共有100个座位。
试用:
1)信号量和P、V操作;2)管程,来实现用户进程的同步算法。
答:
1)使用信号量和P、V操作:
varname:
array[1..100]ofA;
A=record
number:
integer;
name:
string;
end
fori:
=1to100do{A[i].number:
=i;A[i].name:
=null;}
mutex,seatcount:
semaphore;
i:
integer;mutex:
=1;seatcount:
=100;
cobegin
{
processreaderi(varreadername:
string)(i=1,2,…)
{
P(seatcount);
P(mutex);
fori:
=1to100doi++
ifA[i].name=nullthenA[i].name:
=readername;
readergettheseatnumber=i;/*A[i].number
V(mutex)
进入阅览室,座位号i,座下读书;
P(mutex);
A[i]name:
=null;
V(mutex);
V(seatcount);
离开阅览室;
}
}
coend.
5在一个盒子里,混装了数量相等的黑白围棋子。
现在用自动分拣系统把黑子、白子分开,设分拣系统有二个进程P1和P2,其中P1拣白子;P2拣黑子。
规定每个进程每次拣一子;当一个进程在拣时,不允许另一个进程去拣;当一个进程拣了一子时,必须让另一个进程去拣。
试写出两进程P1和P2能并发正确执行的程序。
答:
实质上是两个进程的同步问题,设信号量S1和S2分别表示可拣白子和黑子,不失一般性,若令先拣白子。
varS1,S2:
semaphore;
S1:
=1;S2:
=0;
cobegin
{
processP1
begin
repeat
P(S1);
拣白子
V(S2);
untilfalse;
end
processP2
begin
repeat
P(S2);
拣黑子
V(S1);
untilfalse;
end
}
coend.
6设公共汽车上,司机和售票员的活动分别如下:
司机的活动:
启动车辆:
正常行车;到站停车。
售票员的活动:
关车门;售票;开车门。
在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?
用信号量和P、V操作实现它们的同步。
答:
在汽车行驶过程中,司机活动与售票员活动之间的同步关系为:
售票员关车门后,向司机发开车信号,司机接到开车信号后启动车辆,在汽车正常行驶过程中售票员售票,到站时司机停车,售票员在车停后开门让乘客上下车。
因此,司机启动车辆的动作必须与售票员关车门的动作取得同步;售票员开车门的动作也必须与司机停车取得同步。
应设置两个信号量:
s1、s2;s1表示是否允许司机启动汽车(其初值为0);s2表示是否允许售票员开门(其初值为0)。
用P、V原语描述如下:
vars1,s2:
semaphore;
s1=0;s2=0;
cobegin
{
driver();
busman();
}
coend
driver()
begin
while
(1)
{
P(s1)
启动车辆;
正常行车;
到站停车;
V(s2);
}
end
busman()
begin
while
(1)
{
关车门;,
V(s1)
售票;
P(s2)
开车门;
上下乘客;
}
end
7在信号量S上作P、V操作时,S的值发生变化,当S>0、S=0、S<0时,它们的物理意义是什么?
答:
S的值表示它代表的物理资源的使用状态:
S>0表示还有共享资源可供使用。
S=0表示共享资源正被进程使用但没有进程等待使用资源。
S<0表示资源已被分配完,还有进程等待使用资源。
8
(1)两个并发进程并发执行,其中,A、B、C、D、E是原语,试给出可能的并发执行路径。
ProcessPProcessQ
beginbegin
A;D;
B;E;
C;end;
end;
(2)两个并发进程P1和P2并发执行,它们的程序分别如下:
P1P2
repeatrepeat
k:
=k×2;printk;
k:
=k+1;k:
=0;
untilfalse;untilfalse;
若令k的初值为5,让P1先执行两个循环,然后,P1和P2又并发执行了一个循环,写出可能的打印值,指出与时间有关的错误。
答:
(1)共有10种交错执行的路径:
A、B、C、D、E;A、B、D、E、C;A、B、D、C、E;
A、D、B、E、C;A、D、B、C、E;A、D、E、B、C;
D、A、B、E、C;D、A、B、C、E;D、A、E、B、C;D、E、A、B、C。
(2)把语句编号,以便于描述:
P1P2
repeatrepeat
k:
=k×2;①printk;③
k:
=k+1;②k:
=0;④
untilfalse;untilfalse;
1)K的初值为5,故P1执行两个循环后,K=23。
2)语句并发执行有以下情况:
①、②、③、④,这时的打印值为:
47
③、④、①、②,这时的打印值为:
23
①、③、②、④,这时的打印值为:
46
①、③、④、②,这时的打印值为:
46
③、①、②、④,这时的打印值为:
23
③、①、④、②,这时的打印值为:
23
由于进程P1和P2并发执行,共享了变量K,故产生了‘结果不唯一’。
9另一个经典同步问题:
吸烟者问题(patil,1971)。
三个吸烟者在一个房间内,还有一个香烟供应者。
为了制造并抽掉香烟,每个吸烟者需要三样东西:
烟草、纸和火柴,供应者有丰富货物提供。
三个吸烟者中,第一个有自己的烟草,第二个有自己的纸和第三个有自己的火柴。
供应者随机地将两样东西放在桌子上,允许一个吸烟者进行对健康不利的吸烟。
当吸烟者完成吸烟后唤醒供应者,供应者再把两样东西放在桌子上,唤醒另一个吸烟者。
试采用:
(1)信号量和P、V操作,
(2)管程编写他们同步工作的程序。
答:
(1)用信号量和P、V操作。
varS,S1,S2,S3;semaphore;
S:
=1;S1:
=S2:
=S3:
=0;
flag1,flag2,flag3:
Boolean;
flag1:
=flag2:
=flag3:
=true;
cobegin
{
process供应者
begin
repeat
P(S);
取两样香烟原料放桌上,由flagi标记;/*flage1、flage2、flage3代表烟草、纸、火柴
ifflag2&flag3thenV(S1);/*供纸和火柴
elseifflag1&flag3thenV(S2);/*供烟草和火柴
elseV(S3);/*供烟草和纸
untilefalse;
end
process吸烟者1
begin
repeat
P(S1);
取原料;
做香烟;
V(S);
吸香烟;
untilefalse;
process吸烟者2
begin
repeat
P(S2);
取原料;
做香烟;
V(S);
吸香烟;
untilefalse;
process吸烟者3
begin
repeat
P(S3);
取原料;
做香烟;
V(S);
吸香烟;
untilefalse;
}
coend.
10系统有同类资源m个,被n个进程共享,问:
当m>n和m≤n时,每个进程最多可以请求多少个这类资源时,使系统一定不会发生死锁?
答:
当m≤n时,每个进程最多请求1个这类资源时,系统一定不会发生死锁。
当m>n时,如果m/n不整除,每个进程最多可以请求”商+1”个这类资源,否则为”商”个资源,使系统一定不会发生死锁?
11N个进程共享M个资源,每个进程一次只能申请/释放一个资源,每个进程最多需要M个资源,所有进程总共的资源需求少于M+N个,证明该系统此时不会产生死锁。
答:
设max(i)表示第i个进程的最大资源需求量,need(i)表示第i个进程还需要的资源量,alloc(i)表示第i个进程已分配的资源量。
由题中所给条件可知:
max
(1)+┅+max(n)=(need
(1)+┅+need(n))+((alloc
(1)+┅+alloc(n))如果在这个系统中发生了死锁,那么一方面m个资源应该全部分配出去,
alloc
(1)+┅+alloc(n)=m
另一方面所有进程将陷入无限等待状态。
可以推出
need
(1)+┅+need(n)上式表示死锁发生后,n个进程还需要的资源量之和小于n,这意味着此刻至少存在一个进程i,need(i)=0,即它已获得了所需要的全部资源。
既然该进程已获得了它所需要的全部资源,那么它就能执行完成并释放它占有的资源,这与前面的假设矛盾,从而证明在这个系统中不可能发生死锁。
12设当前的系统状态如下,系统此时Available=(1,1,2):
(1)
计算各个进程还需要的资源数Cki-Aki?
(2)系统是否处于安全状态,为什么?
(3)P2发出请求向量request1(1,0,1),系统能把资源分给它吗?
(4)若在P2申请资源后,若P1发出请求向量request0(1,0,1),系统能把资源分给它吗?
(5)若在P1申请资源后,若P3发出请求向量request0(0,0,1),系统能把资源分给它吗?
答:
(1)P1,P2,P3,P4的Cki-Aki分别为:
(2,2,2)、(1,0,2)、(1,0,3)、(4,2,0)
(3)系统处于安全状态,存在安全序:
P2,P1,P3,P4
(4)可以分配,存在安全序列:
P2,P1,P3,P4。
(5)不可以分配。
(6)不可以分配。
13系统有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发出request1(1、2、2、2),系统能分配资源给它吗?
为什么?
答:
(1)系统处于安全状态,存在安全序列:
P0,P3,P4,P1,P2。
(2)不能分配,否则系统会处于不安全状态。
14把死锁检测算法用于下面的数据,并请问:
Available=(1,0,2,0)
(1)此时系统此时处于安全状态吗?
(2)若第二个进程提出资源请求request2(0,0,1,0),系统能分配资源给它吗?
(3)若第五个进程提出资源请求request5(0,0,1,0),系统能分配资源给它吗?
答:
(1)此时可以找出进程安全序列:
P4,P1,P5,P2,P3。
故系统处于安全状态。
(2)可以分配,存在安全序列:
P4,P1,P5,P2,P3。
(3)不可分配,系统进入不安全状态。
15某系统有R1设备3台,R2设备4台,它们被P1、P2、P3和P4进程共享,且已知这4个进程均按以下顺序使用设备:
→申请R1→申请R2→申请R1→释放R1→释放R2→释放R1
(1)系统运行中可能产生死锁吗?
为什么?
(2)若可能的话,请举出一种情况,并画出表示该死锁状态的进程—资源图。
答:
(1)系统四个进程需要使用的资源数为R1各2台,R2各1台。
可见资源数不足,同时各进程申请资源在先,有可能产生死锁发生的四个条件,故系统可能产生死锁。
(2)当三个进程执行完申请资源R1,开始执行申请资源R2时,第四个进程会因没有资源R1而被阻塞。
当三个进程执行完申请资源R2后,系统还剩1个R2资源。
而这三个进程因执行申请第二个资源R1而全部被阻塞,系统进入死锁。
16假定某计算机系统有R1和R2两类可再使用资源(其中R1有两个单位,R2有一个单位),它们被进程P1,P2所共享,且已知两个进程均以下列顺序使用两类资源。
→申请R1→申请R2→申请R1→释放R1→释放R2→释放R1→
试求出系统运行过程中可能到达的死锁点,并画出死锁点的资源分配图(或称进程-资源图)。
答:
当两个进程都执行完第一步(都占用R1)时,系统进入不安全状态。
这时无论哪个进程执行完第二步,死锁都会发生。
可能到达的死锁点:
进程P1占有一个R1和一个R2,而进程P2占有一个R1。
或者相反。
这时己形成死锁。
进程---资源图为:
17桌上有一只盘子,最多可以容纳两个水果,每次仅能放入或取出一个水果。
爸爸向盘子中放苹果(apple),妈妈向盘子中放桔子(orange),两个儿子专等吃盘子中的桔子,两个女儿专等吃盘子中的苹果。
试用:
(1)信号量和P、V操作,
(2)管程,来实现爸爸、妈妈、儿子、女儿间的同步与互斥关系。
答:
(1)用信号量和P、V操作。
类似于课文中的答案,扩充如下:
1)同步信号量初值为2;2)要引进一个互斥信号量mutex,用于对盘子进行互斥;3)盘子中每一项用橘子、苹果2个枚举值。
var
plateARRAY[0,1]of(apple,orange);
flag0,flag1:
boolean;
mutex:
semaphore;
sp:
semaphore;/*盘子里可以放几个水果*/
sg1,sg2:
semaphore;/*盘子里有桔子,有苹果?
*/
sp:
=2;/*盘子里允许放入二个水果*/
sg1:
=sg2:
=0;/*盘子里没有桔子,没有苹果*/
flag0:
=flag1:
=false;mutex:
=1;
cobegin
processfather
begin
L1:
削一个苹果;
P(sp);
P(mutex);
if(flag0==false)then
{plate[0]:
=苹果;flag0:
=true;}
else{plate[1]:
=苹果;flag1:
=true;}
V(mutex);
V(sg2);
gotoL1;
end;
processmother
begin
L2:
剥一个桔子;
P(sp);
P(mutex);
if(flag0==false)then
{plate[0]:
=桔子;flag0:
=true;}
else{plate[1]:
=桔子;flag1:
=true;}
V(mutex);
V(sg1);
gotoL2;
end;
processson
begin
L3:
P(sg1);
P(mutex);
if(flag0&plate[0]==桔子)then
{x:
=plate[0];flag0:
=false;}
else{x:
=plate[1];flag1:
=false;}
V(mutex);
V(sp);
吃桔子;
gotoL3;
end;
processdaughter
begin
L4:
P(sg2);
P(mutex);
if(flag0&plate[0]==苹果)then
{x:
=plate[0];flag0:
=false;}
else{x:
=plate[1];flag1:
=false;}
V(mutex);
V(sp);
吃苹果;
gotoL4;
end;
coend.
18有P1、P2、P3三个进程共享一个表格F,P1对F只读不写,P2对F只写不读,P3对F先读后写。
进程可同时读F,但有进程写时,其他进程不能读和写。
用
(1)信号量和P、V操作,
(2)管程编写三进程能正确工作的程序。
答:
(1)信号量和P、V操作。
这是读--写者问题的变种。
其中,P3既是读者又是写者。
读者与写者之间需要互斥,写者与写者之间需要互斥,为提高进程运行的并发性,可让读者尽量优先。
varrmutex,wmutex:
semaphore;
rmutex:
=wmutex:
=1;
count:
integer;count:
=0;
cobegin
{
processP1
begin
repeat
P(rmutex);
count:
=count+1;
ifcount=1thenP(w