操作系统习题问题详解第3.docx

上传人:b****7 文档编号:11225009 上传时间:2023-02-25 格式:DOCX 页数:93 大小:59.11KB
下载 相关 举报
操作系统习题问题详解第3.docx_第1页
第1页 / 共93页
操作系统习题问题详解第3.docx_第2页
第2页 / 共93页
操作系统习题问题详解第3.docx_第3页
第3页 / 共93页
操作系统习题问题详解第3.docx_第4页
第4页 / 共93页
操作系统习题问题详解第3.docx_第5页
第5页 / 共93页
点击查看更多>>
下载资源
资源描述

操作系统习题问题详解第3.docx

《操作系统习题问题详解第3.docx》由会员分享,可在线阅读,更多相关《操作系统习题问题详解第3.docx(93页珍藏版)》请在冰豆网上搜索。

操作系统习题问题详解第3.docx

操作系统习题问题详解第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+number

7设公共汽车上,司机和售票员的活动分别如下:

司机的活动:

启动车辆:

正常行车;到站停车。

售票员的活动:

关车门;售票;开车门。

在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?

用信号量和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)为每一个信号量建

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 其它考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1