106826考研真题和参考答案6补充应用题.docx
- 文档编号:27685036
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:40
- 大小:43.88KB
106826考研真题和参考答案6补充应用题.docx
《106826考研真题和参考答案6补充应用题.docx》由会员分享,可在线阅读,更多相关《106826考研真题和参考答案6补充应用题.docx(40页珍藏版)》请在冰豆网上搜索。
106826考研真题和参考答案6补充应用题
Ch2-补充应用题
1.在UNIX系统中运行以下程序,最多可产生出多少进程?
画出进程家属树。
main(){
fork();/*←pc(程序计数器),进程A
fork();
fork();
}
解:
首先采用fork()创建的子进程,其程序是复制父进程的;其次,父、子进程都从调用后的那条语句开始执行。
当进程A执行后,派生出子进程B,其程序及状态如下:
main(){main(){
fork();fork();
fork();/*←pc(程序计数器),进程A*/fork();/*←pc(程序计数器),进程B*/
fork();fork();
}}
当进程A、B执行后,各派生出子进程C、D,其程序及状态如下:
main(){main(){
fork();fork();
fork();fork();
fork();/*←pc(程序计数器),进程A*/fork();/*←pc(程序计数器),进程B*/
}}
main(){main(){
fork();fork();
fork();fork();
fork();/*←pc(程序计数器),进程C*/fork();/*←pc(程序计数器),进程D*/
}}
当进程A、B、C、D执行后,各派生出子进程E、F、G、H,且所有进程的PC均指向程序结束处。
这时进程A共派生出7个子进程。
2.UNIXSystemⅤ的进程优先数计算公式如下:
P-pri=P-cpu/2+PUSER+P-nice+NZERO,其中,P-pri
为优先数(优先数越大,优先级越低)、PUSER和NZERO是基本用户优先级阈值(UNIX版本确定的常量)、P-nice是用户可调节的进程优先数偏置值(接近常量)、P-cpu是进程最近时间段中使用处理器的时间。
试叙述该调度策略实现了“循环多级反馈动态优先级”进程调度算法。
解:
在“循环多级反馈动态优先级”调度中,一个进程从它开始被调度起到进程执行结束期间,会经历多次循环反馈过程。
系统为进程划分的时间片和进程的优先数是进程调度的决定参数,而进程的优先数是动态改变的,它是由该进程在这段时间内占用的处理器时间和它的偏置值决定的。
对于新创建的进程,由于它未开始使用处理器,所以P-cpu/2为0,这时它的优先级取得最大值,而随着该进程被调度,它的P-cpu不断增加,那么它的优先级就不断降低,从而有可能被其他的P-cpu值较小的进程抢先,自己则进入到下一个等待调度队列的轮转中。
同时计算中将占用处理器的时间除以2,这样对不占用CPU的进程来说P-cpu值会衰减很快,使得等待进程的优先级不断变大。
这种策略可以保证各个进程能够被合理的调度执行。
Ch3-补充应用题
1.在信号量S上作P、V操作时,S的值发生变化,当S>0、S=0、S<0时,它们的物理意义是什么?
答:
S的值表示它代表的物理资源的使用状态:
S>0表示还有共享资源可供使用。
S=0表示共享资源正被进程使用但没有进程等待使用资源。
S<0表示资源已被分配完,还有进程等待使用资源。
2.使用
(1)消息传递,
(2)管程,实现生产者和消费者问题。
答:
(1)
intcapacity,i;//缓冲大小
creat-mailbox(producer);//创建信箱
creat-mailbox(consumer);
for(i=0;i send(producer,null);//发送空消息 voidproducer_i(){//i=1,…,n messagepmsg; while(true){ produce();//生产消息 receive(producerer,null);//等待空消息 build();//构造一条消息 send(consumer,pmsg);//发送消息 } } voidconsumer_j(){//j=1,…,m messagecmsg; while(true){ receive(consumer,cmsg);//接收消息 extract();//取消息 send(producer,null);//回送空消息 consume(csmg);//消耗消息 } } cobegin producer_i();consumer_j(); coend (2) typeproducer_consumer=monitor itemB[k];//缓冲区个数 intin,out;//存取指针 intcount;//缓冲中产品数 condnotfull,notempty;//条件变量 intnotfull_count,notempty_count; notfull=notempty=notfull_count=notempty_count=0; InterfaceModuleIM; DEFINEappend,take; USEenter,leave,wait,signal; voidappend(itemx){ enter(IM); if(count==k)//缓冲已满 wait(notfull,notfull_count,IM); B[in]=x; in=(in+1)%k; count++;//增加一个产品 signal(notempty,notempty_count,IM);//唤醒等待消费者 leave(IM); } voidtake(item&x){ enter(IM); if(count==0) wait(notempty,notempty_count,IM);//缓冲已空 x=B[out]; out=(out+1)%k; count--;//减少一个产品 signal(notfull,notfull_count,IM);//唤醒等待生产者 leave(IM); } cobegin processproducer_i(){//i=1,…,n itemx; produce(x); producer_consumer.append(x); } processconsumer_j(){//j=1,…m itemx; producer_consumer.take(x); consume(x); } coend 3.设有三组进程Pi、Qj、Rk,其中Pi、Qj构成一对生产者和消费者,共享一个由M1个缓冲区构成的循环缓冲池buf1。 Qj、Rk构成另一对生产者和消费者,共享一个由M2个缓冲区构成的循环缓冲池buf2。 如果Pi每次生产一个产品投入buf1,Qj每次从中取两个产品组装成一个后并投入buf2,Rk每次从中取三个产品包装出厂。 试用信号量和P、V操作写出它们同步工作的程序。 答: semaphoremutex1,mutex2,mutex3; semaphoreempty1,empty2,full1,full2; intin1,in2,out1,out2,counter1,counter2; itembuffer1[M1],buffer2[M2]; empty1=M1;empty=M2; in1=in2=out1=out2=0;counter1=counter2=0; full1=full2=0;mutex1=mutex2=mutex3=1; cobegin processPi(){ while(true){ P(empty1); P(mutex1); putanitemintobuffer[in1]; in1=(in1+1)%M1; counter++; if(counter1==2){counter1=0;V(full1);} V(mutex); } } processQj(){ while(true){ P(full1); P(mutex1); takeanitemfrombuffer1[out1]; out1=(out1+1)%M1; takeanitemfrombuffer1[out1]; out1=(out1+1)%M1; V(mutex1); V(empty1); V(empty1); Processtheproducts; P(empty2); P(mutex2); putanitemintobuffer2[in2]; in2=(in2+1)%M2; counter2++; if(counter2==3){counter2=0;V(full2);} V(mutex2); } } processRk(){ while(true){ P(full2); P(mutex2); takeanitemfrombuffer2[out2]; out2=(out2+1)%M2; takeanitemfrombuffer2[out2]; out2=(out2+1)%M2; takeanitemfrombuffer2[out2]; out2=(out2+1)%M2; V(mutex2); V(empty2); V(empty2); V(empty2); packettheproducts; } } coend 4.在一个实时系统中,有两个进程P和Q,它们循环工作。 P每隔1秒由脉冲寄存器获得输入,并把它累计到整型变量W上,同时清除脉冲寄存器。 Q每隔1小时输出这个整型变量的内容并将它复位。 系统提供了标准例程INPUT和OUTPUT供I/O,提供了延时系统调用Delay(seconds)。 试写出两个并发进程循环工作的算法。 答: intW,V; semaphoremutex; W=0;V=0;mutex=1; cobegin processP(){ while(true){ P(mutex); delay (1); V=INPUT; W=W+V; {清除脉冲寄存器}; V(mutex); } } processQ(){ while(true){ P(mutex); delay(60); OUTPUT(W); W=0; V(mutex); } } coend. 5.试证明层次分配策略的变种按序分配策略能防止系统死锁。 答: 把系统的所有资源排列成一个顺序,例如,系统若共有n个进程,共有m个资源,用ri表示第i个资源,于是这m个资源是: r1,r2……,rm 规定如果进程不得在占用资源ri(1<=i<=m)后再申请rj(j 不难证明,按这种策略分配资源时系统不会发生死锁。 可以用反证法来证明按序分配不会产生死锁,事实上,若在时刻t1,进程P1处于等资源rk1的状态,则rk1必为另一进程假定是P2所占用,若P2在有限时间里可以运行结束,P1就不会处于永远等待状态;所以,一定在某个时刻t2,进程P2占有了资源rk1而处于永远等待资源rk2状态。 如此推下去,按假定系统只有有限个进程,即必有某个n,在时刻tn时,进程Pn永远等待资源rkn的状态,而rkn必为前面的某一个进程Pi占用(1<=i 于是,按照上述的按序分配策略,当P2占用了rk1后再申请rk2必有: k1<k2 依此类推,可得: k2<k3<… 但是,由于进程Pi是占有了rkn却要申请资源rki,那么,必定有: kn<ki 这就产生了矛盾。 所以,按序分配策略可以防止死锁。 6.修改读者-写者的同步算法,使它对写者优先,即一旦有写者到达,后续的读者必须等待。 (1)用信号量和P、V操作实现; (2)用管程实现。 答: (1)用信号量和P、V操作实现。 为了提高写者的优先级,增加一个信号量s,用于在写进程到达后封锁后续的读者。 其控制流程如下: semaphorermutex,wmutex,S; rmutex=1;wmutex=1;S=1; intcount=0; main(){ cobegin reader();writer(); coend } processreader(){ while(true){ P(S); P(rmutex); if(count==0)P(wmutex); count++; V(rmutex); V(S); 读文件; p(rmutex); count--; if(count==0)V(wmutex); V(rmutex); } } processwriter(){ while(true){ P(S); P(wmutex); 写文件; V(wmutex); V(S); } } (2)用管程实现。 TYPEread-write=monitor intrc,wc; condR,W;R=0;W=0;R_count=W_count=0; intR_count,W_count; rc=0;wc=0; InterfaceModuleIM; DEFINEstart_read,end_read,start_writer,end_writer; USEwait,signal,enter,leave; voidstart_read(){ enter(IM); if(wc>0)wait(R,R_count,IM); rc++; signal(R,IM); leave(IM); } voidend_read(){ enter(IM); rc--; if(rc==0)signal(W,W_count,IM); leave(IM); } voidstart_write(){ enter(IM); wc++; if(rc>0‖wc>1)wait(W,W_count,IM); leave(IM); } voidend_write(){ enter(IM); wc--; if(wc>0)signal(W,W_count,IM); elsesignal(R,IM); leave(IM); } cobegin processP1(){ …… read-writ.start_read(); {read}; read-write.end_read(); …… } processP2(){ …… read-write.start_write(); {write}; rear-write.end_write(); …… } coend. 7.桌上有一只盘子,每次只能放入一只水果。 爸爸专向盘子中放苹果(apple),妈妈专向盘子中放桔子(orange),一个儿子专等吃盘子中的桔子,一个女儿专等吃盘子里的苹果。 写出能使爸爸、妈妈、儿子和女儿正确同步工作的管程。 解: 这个问题实际上是两个生产者和两个消费者被连接到仅能放一个产品的缓冲器上,生产者各自生产不同的产品,消费者各自取需要的产品消费。 用一个包括两个过程: put和get的管程来实现同步: //管程实现父母子女水果问题 typeFMSD=MONITOR enumFRUIT{apple,orange}plate; boolfull; condSP,SS,SD;SP=SS=SD=0; intSP_count,SS_count,SD_count;SP_count=SS_count=SD_count=0; full=false; InterfaceModuleIM; DEFINEput,get; USEenter,leave,wait,signal; voidput(FRUITfruit){//fruit: appleororange enter(IM); if(full)wait(SP,SP_count,IM); full=true; plate=fruit; if(fruit==orange) signal(SS,SS_count,IM); else signal(SD,SD_count,IM); leave(IM); } voidget(FRUITfruit,FRUIT&x){ enter(IM); if(! full‖plate! =fruit){ if(fruit==orange)wait(SS,SS_count,IM); else wait(SD,SD_count,IM); } x=plate; full=false; signal(SP,SP_count,IM); leave(IM); } cobegin processfather(){ {准备好苹果}; FMSD.put(apple); } processmother(){ {准备好桔子}; FMSD.put(orange); } processson(){ FMSD.get(orange,x); {吃取到的桔子}; } processdaughter(){ FMSD.get(apple,x); {吃取到的苹果}; } coend 爸爸妈妈向盘中放水果时调用过程put,儿子女儿取水果时调用过程get。 8.设有三个进程P、Q、R共享一个缓冲区,P进程负责循环地从磁带机读入一批数据并放入缓冲区,Q进程负责循环地从缓冲区取出P进程放入的数据进行加工处理并把结果放入缓冲区,R进程负责循环地从缓冲区读出Q进程放入的数据并在打印机上打出。 请用: (1)信号量和P、V操作, (2)管程,写出能够正确执行的程序。 答: (1)信号量和P、V操作 semaphoreSp,Sq,Sr; intbuf;Sp=1;Sq=Sr=0; cobegin processP(){ while(true){ {从磁带读入数据}; P(Sp); buf=data; V(Sq); } } processQ(){ while(true){ P(Sq); data=buf; {加工处理data}; buf=data; V(Sr); } } processR(){ while(true){ P(Sr); data=buf; V(Sp); {打印数据}; } } coend. (2)管程。 TYPEPQR=MONITOR intbuf,SP_count,SQ_count,SR_count; SP_count=SQ_count=SR_count=0; condSP,SQ,SR;SP=SQ=SR=0; enum{p,q,r}turn; turn=p; InterfaceModuleIM; DEFINEPPUT,QGET,QPUT,RGET; USEwait,signal,check,release; voidPPUT(intdata;){ enter(IM); if(turn! =p)wait(SP,SP_count,IM); turn=q; buf=data; signal(SQ,SQ_count,IM); leave(IM); } voidQGET(int&data;){ enter(IM); if(turn! =q)wait(SQ,SQ_count,IM) data=buf; leave(IM); } voidQPUT(intdata;); enter(IM); turn=r; buf=data; signal(SR,SR_count,IM); leave(IM); } voidRGET(int&data;){ enter(IM); if(turn! =r)wait(SR,SR_count,IM); turn=p; data=buf; signal(SP,SP_count,IM); leave(IM); } cobegin processP(){ intx; while(true){ {从文件读入一个数据到x}; PPUT(x); } } processQ(){ intx; while(true){ QGET(x); {加工处理x}; QPUT(x); } } processR(){ intx; while(true){ RGET(x); {打印x}; } } coend 9.分析下列算法是否正确,为什么? While(true){ key=true; do{ swap(lock,key); }while(key==true); criticalsection;/*临界区*/ lock=false; othercode; } 答: 由于lock的初值未定,如果它的值false,则可通过swap实现上锁操作。 但如果lock的初值为true,那么,进程会永远等待而进不了临界区。 10.以下并发执行的程序,仅当数据装入寄存器后才能加1。 constn=50; inttally; voidtotal(){ for(intcount=1;count<=n;count++;)tally++; } main(){ tally=0; cobegin total();total(); coend; writeln(tally); } 给出该并发程序输出的tally值的上限和下限。 答: tally值的上限和下限为100和50。 11.有一材料保管员,他保管纸和笔若干。 有A、B两组学生,A组学生每人都备有纸,B组学生每人都备有笔。 任一学生只要能得到其他一种材料就可以写信。 有一个可以放一张纸或一支笔的小盒,当小盒中无物品时,保管员就可任意放一张纸或一支笔供学生取用,每次允许一个学生从中取出自己所需的材料,当学生从盒中取走材料后允许保管员再存放一件材料,请用: 1)信号量与P、V操作,2)管程,写出他们并发执行时能正确工作的程序。 答: 1)信号量与P、V操作
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 106826 考研 参考答案 补充 应用题