操作系统习题问题详解第3.docx
《操作系统习题问题详解第3.docx》由会员分享,可在线阅读,更多相关《操作系统习题问题详解第3.docx(93页珍藏版)》请在冰豆网上搜索。
操作系统习题问题详解第3
CH3应用题参考答案
1、有三个并发进程:
R负责从输入设备读入信息块,M负责对信息块加工处理;P负责打印输出信息块。
今提供;
l)一个缓冲区,可放置K个信息块;
2)二个缓冲区,每个可放置K个信息块;
试用信号量和P、V操作写出三个进程正确工作的流程。
答:
1)varB:
array[0,k-1]ofitem;
sread:
semaPhore:
=k;
smanage:
semaPhore:
=0;
swrite:
semaphore:
=0;
rptr:
integer:
=O;
mptr:
integer:
=O;
wptr:
integer:
=0;
x:
item
cobegin
processreader;processmanager;processwriter;
beginbeginbegin
LI:
readamessageintox;L2:
P(smanage);L3:
P(swnte);
P(sread);x:
=B[mptr];x:
=B[swrite];
B[rptr]:
=x;mptr:
=(mptr+1)modk;wptr:
=(wptr+1)modk;
Rptr:
=(rptr+1)modk;managethemessageinx;V(sread);
V(smanage);B[mptr]:
=x;printthemessageinx;
GotoL1;V(swrite);gotoL3;
End;gotoL2;end;
End;
coend
2)varA,B:
array[0,k-l]ofitem;
sPut1:
semaphore:
=k;
SPut2:
semaPhore:
=k;
sget1:
semaPhore:
=0;
sget2:
semaphore:
=0;
put1:
integer:
=O;
put2:
integer:
=0;
get1:
integer:
=O;
get2:
integer:
=O;
cobegin
processreader;processnmanager;processWriter;
beginbeginbegin
Ll:
readamessageintox;L2:
P(sgetl);L3:
P(sgetZ);
P(SPut1);x:
=A[get1];x:
=B[get2];
A[put1]:
=x;get1:
(get1+1)modk;get2:
=(get2+l)modk;
Put1:
=(put1+1)modk;V(sput1);V(sput2);
V(sget1);managethemessageintox;printthemessageinx;
GotoL1;P(sput2);gotoL3;
Put2:
=(put2+1)modk;
V(sget2);
GotoL2;
End;
Coend
2设有n个进程共享一个互斥段,如果:
(1)每次只允许一个进程进入互斥段;
(2)每次最多允许m个进程(m簇n)同时进入互斥段。
试问:
所采用的信号量初值是否相同?
信号量值的变化范围如何?
答:
所采用的互斥信号量初值不同。
1)互斥信号量初值为1,变化范围为[-n+l,1]。
当没有进程进入互斥段时,信号量值为1;当有1个进程进入互斥段但没有进程等待进入互斥段时,信号量值为O;当有1个进程进入互斥段且有一个进程等待进入互斥段时,信号量值为-1;最多可能有n-1个进程等待进入互斥段,故此时信号量的值应为-(n-1)也就是-n+1。
2)互斥信号量初值为m,变化范围为[-n+m,m]。
当没有进程进入互斥段时,信号量值为m;当有1个进程进入互斥段但没有进程等待进入互斥段时,信号量值为m-1:
当有m个进程进入互斥段且没有一个进程等待进入互斥段时,信号量值为0:
当有m个进程进入互斥段且有一个进程等待进入互斥段时,信号量值为一l;最多可能有n-m个进程等待进入互斥段,故此时信号量的值应为-(n-m)也就是-n+m.
3有两个优先级相同的进程P1和P2,各自执行的操作如下,信号量S1和S2初值均为0。
试问Pl、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+y;z:
=z+x;
Endend
答:
现对进程语句进行编号,以方便描述.
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;⑧
Endend
①、②、⑤和⑥是不相交语句,可以任何次序交错执行,而结果是唯一的。
接着无论系统如何调度进程并发执行,当执行到语句⑦时,可以得到x=10,y=4。
按Bernstein条件,语句③的执行结果不受语句⑦的影响,故语句③执行后得到z=5。
最后,语句④和⑧并发执行,这时得到了两种结果为:
语句④先执行:
x=10,y=9,z=150
语句⑧先执行:
x=10,y=19,z=15
此外,还有第三种情况,语句③被推迟,直至语句⑧后再执行,于是依次执行以下三个语句:
7:
二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。
4有一阅览室,读者进入时必须先在一张登记表上登记,该表为每一座位列出一个表目,包括座号、姓名,读者离开时要注销登记信息;假如阅览室共有100个座位。
试用:
l)信号量和P、V操作;2)管程,来实现用户进程的同步算法。
答:
1)使用信号量和P、v操作:
varname:
array[l…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:
=l;seatcount:
=100;
cobegin
{
processreaderi(varreadename:
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
2)使用管程操作:
TYPEreadbook=monitor
VARR:
condition;
I,seatcount:
integer;
name:
array[l:
100]ofstring;
DEFINErcadercome,readerleave;
USEcheck,wait,signal,release;
Procedurereadercome(readername)
begin
check(IM);
ifseatcount≥100wait(R,IM)
seatcount:
=seatcount+1;
fori=1to100doi++
ifname[i]==nullthenname[i]:
=readername;
gettheseatnumber=i;
release(IM);
end
procedurereaderleave(readername)
begin
check(IM);
seatcount--;
fori=1to100doi++
ifname[i]readernamethenname[i]:
null;
release(IM);
end
begin
seatcount:
=1OO;name:
=null;
end
cobegin
{
processreaderi(i=1,2.…)
begin
readercome(readername);
readthebook;
readerleave(readername);
leavethereadroom;
end
}
coend.
5.在一个盒子里,混装了数量相等的黑白围棋子·现在用自动分拣系统把黑子、白子分开,设分拣系统有二个进程P1和P2,其中P1拣白子;P2拣黑子。
规定每个进程每次拣一子;当一个进程在拣时,不允许另一个进程去拣;当一个进程拣了一子时,必须让另一个进程去拣.试写出两进程P1和P2能并发正确执行的程序。
答1:
实质上是两个进程的同步问题,设信号量s1和s2分别表示可拣白子和黑子,不失一般性,若令先拣白子。
varS1,S2:
semaphore;
S1:
=l;S2:
=0;
cobegin
{
processP1
begin
repeat
P(S1);
拣白子
V(S2);
untilfalse;
end
processP2
begin
repeat
P(S2);
拣黑子
V(S1);
untilfalse;
end
}
coend.
答2:
TYPEpickup-chess=MONITOR
VARflag:
boolean;
S-black,s-white:
codition;
DEFINEpickup-black,pickup-white;
USEwait,signal,check,release;
procedurepickup-black;
begin
check(IM);
ifflagthenwait(s-black,IM);
flag:
=true;
pickupablack;
signal(S-white,IM);
release(IM);
end
procedurepickup-white;
begin
check(IM);
ifnotflagthenwait(S-white,IM);
flag:
=false;
pickupawhite;
signal(S-black,IM);
release(IM);
end
begin
flag:
=true;
end
main()
{cobegin
process-B();
process-W();
coend
}
process-B()
begin
pickup-chess.pickup-black();
other;
end
process-W()
begin
pickup-chess.pickup-white();
other;
end
6管程的同步机制使用条件变量和wait及signal,尝试为管程设计一种仅仅使用一个原语操作的同步机制。
答:
可以采用形如waituntil<条件表达式>的同步原语。
如waituntil(numbersum+number7设公共汽车上,司机和售票员的活动分别如下:
司机的活动:
启动车辆:
正常行车;到站停车。
售票员的活动:
关车门;售票;开车门。
在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?
用信号量和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(51)
售票;
P(S2)
开车门;
上下乘客;
}
end
8、一个快餐厅有4类职员:
(l)领班:
接受顾客点菜;
(2)厨师:
准备顾客的饭菜;(3)包工:
将做好的饭菜打包;(4)出纳员:
收款并提交食品。
每个职员可被看作一个进程,试用一种同步机制写出能让四类职员正确并发运行的程序。
答:
典型的进程同步问题,可设四个信号量51、S2、S3和S4来协调进程工作。
varS1,S2,S3,S4:
semaphore;
S1:
=1;S2:
=S3:
=S4:
=0;
cobegin
{processP1
begin
repeat
有顾客到来;
P(S1);
接受顾客点菜;
V(52);
untilefalse;
end
processP2
begin
repeat
P(S2);
准备顾客的饭菜;
v(S3);
untilefalse;
end
processP3
begin
repeat
P(S3);
将做好的饭菜打包;
V(S4);
untilefalse;
end
processP4
begin
repeat
P(54);
收款并提交食品;V(51);
ufltilefalse;
end
}
coend.
9、在信号量S上作P、v操作时,S的值发生变化,当S>0、S=0、S<0时,它们的的物理意义是什么?
答:
S的值表示它代表的物理资源的使用状态:
S>0表示还有共享资源可供使用。
S阅表示共享资源正被进程使用但没有进程等待使用资源。
S<0表示资源已被分配完,还有进程等待使用资源。
10
(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+l;②k:
=0;④
untilfalse;untilfalse;
l)K的初值为5,故P1执行两个循环后,K=23。
2)语句并发执行有以下情况:
①、②、③、④,这时的打印值为:
47
③、④、①、②,这时的打印值为:
23
①、③、②、④,这时的打印值为:
46
①、③、④、②,这时的打印值为:
46
③、①、②、④,这时的打印值为:
23
③、①、④、②,这时的打印值为:
23
由于进程P1和P2并发执行,共享了变量K,故产生了‘结果不唯一’。
11证明信号量与管程的功能是等价的:
(l)用信号量实现管程;
(2)用管程实现信号量。
答:
(1)用信号量实现管程;
Hoare是用信号量实现管程的一个例子,详见课文内容。
下面介绍另一种简单方法:
每一个管程都对应一个mutex,其初值为1,用来控制进程互斥调用管程。
再设一个初值为0的信号量,用来阻塞等待资源的进程。
相应的用信号量实现的管程库过程为:
Varmutex,c:
semaphore;
mutex:
=1;c:
=0;
voidenter-monitor()/*进入管程代码,保证互斥
P(mutex);
}
voidleave-monitor-normally()/*不发信号退出管程
{
V(mutex);
}
voidleave-with-sigal(c)/*在条件c上发信号并退出管程,释放一个等待c条件的进程。
{注意这时没有开放管程,因为刚刚被释放的进程己在管程中。
V(c);
}
voidwait(c)/*等待条件c,开放管程
{
V(mutex);
P(c);
}
(2)用管程实现信号量。
TYPEsemaphore=monitor
VARS;condition;
C:
integer;
DEFINEP,V;
USEcheck,wait,signal,release;
procedureP
begin
check(IM);
C:
=C-1:
ifC<0thenwait(S,IM);
release(IM);
end
procedureV
begin
check(IM):
C:
=C+1;
ifC≤0thensignal(S,IM);
release(IM);
end
begin
C:
=初值;
End.
12证明消息传递与管程的功能是等价的:
(1)用消息传递实现管程;
(2)用管程实现消息传递。
答:
(1)用消息传递实现管程;
用消息传递可以实现信号量(见13
(2)),用信号量可以实现管程(见11
(1)),那么,把两种方法结合起来,就可以用用消息传递实现管程。
(2)用管程实现消息传递。
TYPEmailbox=monitor
VARr,k,count:
integer;
buffer:
array[0…n-1]ofmessage;
full,empty:
condition;
DEFINEadd,get;
USEcheck,wait,signal,release;
procedureadd(r);
begin
check(IM);
ifcount=nthenwait(full,IM);
buffer[r]:
=message;
r:
=(r+1)modn
count:
=count+1;
ifcount=1thensighal(empty,IM);
release(IM);
end
procedureget(m);
begin
check(IM);
ifcount=0thenwait(empty,IM);
m:
=buffer[k」;
count:
=count-1;
ifcount=n-1thensignal(full,IM);
release(IM);
end
begin
r:
=0;k:
=0;count:
=0;
end
13证明信号量与消息传递是等价的:
(1)用信号量实现消息传递;
(2)用消息传递实现信号量。
答:
(l)用信号量实现消息传递;
1)把消息队列组织成一个共享队列,用一个互斥信号量管理对该队列的入队操作和出队操作.
2)发送消息是一个入队操作,当队列存储区满时,设计一个同步信号量阻塞send操作。
3)接收消息是一个出队操作,当队列存储区空时,设计另一个同步信号量阻塞receive操作。
(2)用消息传递实现信号量。
l)为每一个信号量建