您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第3章-部分习题答案
第3章部分习题答案3.2.为什么进程在进入临界区之前,应先执行进入区代码,在退出临界区后又执行退出区代码?为了实现多个进程对临界资源的互斥访问,必须在临界区前面增加一段用于检查欲访问的临界资源是否正被访问的代码,如果未被访问,该进程便可进入临界区对资源进行访问,并设置正被访问标志,如果正被访问,则本进程不能进入临界区,实现这一功能的代码成为进入区代码;在退出临界区后,必须执行退出区代码,用于恢复未被访问标志.3.3同步机构应遵循哪些基本准则?为什么?a.空闲让进.b.忙则等待.c.有限等待.d.让权等待.3.6你认为整型信号量机制和记录型信号量机制,是否完全遵循了同步机构的四条准则?a.在整型信号量机制中,未遵循让权等待的准则.b.记录型信号量机制完全遵循了同步机构的空闲让进,忙则等待,有限等待,让权等待四条准则.3.9在生产者-消费者问题中,如果缺少了signal(full)或signal(empty),对执行结果会有何影响?生产者-消费者问题可描述如下:varmutex,empty,full:semaphore:=1,n,0;buffer:array[0,...,n-1]ofitem;in,out:integer:=0,0;beginparbeginproducer:beginrepeat..produceaniteminnextp;..wait(empty);wait(mutex);buffer(in):=nextp;in:=(in+1)modn;signal(mutex);/****************/signal(full);/****************/untilfalse;endconsumer:beginrepeatwait(full);wait(mutex);nextc:=buffer(out);out:=(out+1)modn;signal(mutex);/****************/signal(empty);/****************/consumetheiteminnextc;untilfalse;endparendend可见,生产者可以不断地往缓冲池送消息,如果缓冲池满,就会覆盖原有数据,造成数据混乱.而消费者始终因wait(full)操作将消费进程直接送入进程链表进行等待,无法访问缓冲池,造成无限等待.3.10在生产者-消费者问题中,如果将两个wait操作即wait(full)和wait(mutex)互换位置;或者是将signal(mutex)与signal(full)互换位置结果会如何?varmutex,empty,full:semaphore:=1,n,0;buffer:array[0,...,n-1]ofitem;in,out:integer:=0,0;beginparbeginproducer:beginrepeat..produceaniteminnextp;..wait(empty);wait(mutex);buffer(in):=nextp;in:=(in+1)modn;/*******************/signal(full);signal(mutex);/*******************/untilfalse;endconsumer:beginrepeat/******************/wait(mutex);wait(full);/******************/nextc:=buffer(out);out:=(out+1)modn;signal(mutex);signal(empty);consumetheiteminnextc;untilfalse;endparendendwait(full)和wait(mutex)互换位置后,因为mutex在这儿是全局变量,执行完wait(mutex),则mutex赋值为0,倘若full也为0,则该生产者进程就会转入进程链表进行等待,而生产者进程会因全局变量mutex为0而进行等待,使full始终为0,这样就形成了死锁.而signal(mutex)与signal(full)互换位置后,从逻辑上来说应该是一样的.3.11我们为某临界区设置一把锁W,当W=1时,表示关锁;W=0时,表示锁已打开.试写出开锁原语和关锁原语,并利用它们去实现互斥.开锁原语:unlock(W):W=0;关锁原语:lock(W);if(W==1)dono_op;W=1;利用开关锁原语实现互斥:varW:semaphore:=0;beginparbeginprocess:beginrepeatlock(W);criticalsectionunlock(W);remaindersectionuntilfalse;endparend3.12试修改下面生产者-消费者问题解法中的错误:producer:beginrepeat..produceraniteminnextp;wait(mutex);wait(full);/*应为wait(empty),而且还应该在wait(mutex)的前面*/buffer(in):=nextp;/*缓冲池数组游标应前移:in:=(in+1)modn;*/signal(mutex);/*signal(full);*/untilfalse;endconsumer:beginrepeatwait(mutex);wait(empty);/*应为wait(full),而且还应该在wait(mutex)的前面*/nextc:=buffer(out);out:=out+1;/*考虑循环,应改为:out:=(out+1)modn;*/signal(mutex);/*signal(empty);*/consumeriteminnextc;untilfalse;end3.13试利用记录型信号量写出一个不会出现死锁的哲学家进餐问题的算法.设初始值为1的信号量c[I]表示I号筷子被拿(I=1,2,3,4,...,2n),其中n为自然数.send(I):BeginifImod2==1then{P(c[I]);P(c[I-1mod5]);Eat;V(c[I-1mod5]);V(c[I]);}else{P(c[I-1mod5]);P(c[I]);Eat;V(c[I]);V(c[I-1mod5]);}End3.14在测量控制系统中的数据采集任务,把所采集的数据送一单缓冲区;计算任务从该单缓冲中取出数据进行计算.试写出利用信号量机制实现两者共享单缓冲的同步算法.intmutex=1;intempty=n;intfull=0;intin=0;intout=0;main(){cobeginsend();obtain();coend}send(){while(1){..collectdatainnextp;..wait(empty);wait(mutex);buffer(in)=nextp;in=(in+1)modn;signal(mutex);signal(full);}}//sendobtain(){while(1){wait(full);wait(mutex);nextc:=buffer(out);out:=(out+1)modn;signal(mutex);signal(empty);culculatethedatainnextc;}//while}//obtain3.19什么是AND信号量?试利用AND信号量写出生产者-消费者问题的解法.为解决并行所带来的死锁问题,在wait操作中引入AND条件,其基本思想是将进程在整个运行过程中所需要的所有临界资源,一次性地全部分配给进程,用完后一次性释放.解决生产者-消费者问题可描述如下:varmutex,empty,full:semaphore:=1,n,0;buffer:array[0,...,n-1]ofitem;in,out:integer:=0,0;beginparbeginproducer:beginrepeat..produceaniteminnextp;..wait(empty);wait(s1,s2,s3,...,sn);//s1,s2,...,sn为执行生产者进程除empty外其余的条件wait(mutex);buffer(in):=nextp;in:=(in+1)modn;signal(mutex);signal(full);signal(s1,s2,s3,...,sn);untilfalse;endconsumer:beginrepeatwait(full);wait(k1,k2,k3,...,kn);//k1,k2,...,kn为执行消费者进程除full外其余的条件wait(mutex);nextc:=buffer(out);out:=(out+1)modn;signal(mutex);signal(empty);signal(k1,k2,k3,...,kn);consumetheiteminnextc;untilfalse;endparendend3.21试比较进程间的低级通信工具与高级通信工具.用户用低级通信工具实现进程通信很不方便,因为其效率低,通信对用户不透明,所有的操作都必须由程序员来实现.而高级通信工具则可弥补这些缺陷,用户可直接利用操作系统所提供的一组通信命令,高效地传送大量的数据.
本文标题:第3章-部分习题答案
链接地址:https://www.777doc.com/doc-6018968 .html