操作系统习题答案第Word文件下载.docx
《操作系统习题答案第Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统习题答案第Word文件下载.docx(75页珍藏版)》请在冰豆网上搜索。
processmanager;
processwriter;
beginbeginbegin
LI:
readamessageintox;
L2:
P(smanage);
L3:
P(swnte);
P(sread);
x:
=B[mptr];
=B[swrite];
B[rptr]:
=x;
mptr:
=(mptr+1)modk;
wptr:
=(wptr+1)modk;
Rptr:
=(rptr+1)modk;
managethemessageinx;
V(sread);
V(smanage);
B[mptr]:
printthemessageinx;
GotoL1;
V(swrite);
gotoL3;
End;
gotoL2;
end;
coend
2)varA,B:
array[0,k-l]ofitem;
sPut1:
semaphore:
=k;
SPut2:
semaPhore:
sget1:
sget2:
put1:
integer:
=O;
put2:
get1:
get2:
cobegin
processnmanager;
processWriter;
Ll:
readamessageintox;
P(sgetl);
P(sgetZ);
P(SPut1);
=A[get1];
=B[get2];
A[put1]:
=x;
get1:
(get1+1)modk;
get2:
=(get2+l)modk;
Put1:
=(put1+1)modk;
V(sput1);
V(sput2);
V(sget1);
managethemessageintox;
P(sput2);
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;
=y+3;
=x+5;
V(S1);
P(S1);
Z:
=Y+1;
X:
X+Y;
P(s2);
V(S2);
=z+y;
z:
=z+x;
Endend
答:
现对进程语句进行编号,以方便描述.
P1:
P2:
beginbegin
y:
=1;
①x:
=1;
⑤
=y+3;
②x:
x+5;
⑥
Y+1;
③x:
X+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;
=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;
{
processreaderi(varreadename:
string)(i=1,2…)
P(seatcount);
P(mutex);
=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);
离开阅览室;
}
2)使用管程操作:
TYPEreadbook=monitor
VARR:
condition;
I,seatcount:
integer;
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);
procedurereaderleave(readername)
seatcount--;
fori=1to100doi++
ifname[i]readernamethenname[i]:
=1OO;
name:
=null;
processreaderi(i=1,2.…)
begin
readercome(readername);
readthebook;
readerleave(readername);
leavethereadroom;
coend.
5.在一个盒子里,混装了数量相等的黑白围棋子·
现在用自动分拣系统把黑子、白子分开,设分拣系统有二个进程P1和P2,其中P1拣白子;
P2拣黑子。
规定每个进程每次拣一子;
当一个进程在拣时,不允许另一个进程去拣;
当一个进程拣了一子时,必须让另一个进程去拣.试写出两进程P1和P2能并发正确执行的程序。
答1:
实质上是两个进程的同步问题,设信号量s1和s2分别表示可拣白子和黑子,不失一般性,若令先拣白子。
varS1,S2:
semaphore;
S1:
=l;
S2:
=0;
processP1
repeat
P(S1);
拣白子
V(S2);
untilfalse;
processP2
repeat
P(S2);
拣黑子
V(S1);
coend.
答2:
TYPEpickup-chess=MONITOR
VARflag:
boolean;
S-black,s-white:
codition;
DEFINEpickup-black,pickup-white;
USEwait,signal,check,release;
procedurepickup-black;
check(IM)