之。
答:为使多个进程互斥访问某临界资源,只需为该资源设置一互斥信号量mutex,并设其初值为1,然后将各进程访问该资源的临界区CS置于wait(mutex)和
signal(mutex)操作之间即可。这样,每个欲访问该临界资源的进程在进入临界区之前,都要先对mutex执行wait操作,若该资源此刻未被访问,本次wait操作必然成功,进程便可进入自己的临界区,这时若再有其他进程也欲进入自己的临界区,此时由于对mutex执行wait操作定会失败,因而该进程阻塞,从而保证了该临界资源能被互斥访问。当访问临界资源的进程退出临界区后,应对
mutex执行signal操作,释放该临界资源。利用信号量实现进程互斥的进程描述 如下:
Varmutex:semaphore:=1; begin parbegin
process1:begin repeat wait(mutex); criticalsection signal(mutex); remaindersection untilfalse; end
process2:begin repeat wait(mutex); criticalsection signal(mutex); remaindersection untilfalse; end parend
22.试写出相应的程序来描述图 2-17 所示的前驱图。
答:(a)Vara,b,c,d,e,f,g,h;semaphore:=0,0,0,0,0,0,0,0;
6
begin parbegin
beginS1;signal(a);signal(b);end;
beginwait(a);S2;signal(c);signal(d);end; beginwait(b);S3;signal(e);end; beginwait(c);S4;signal(f);end; beginwait(d);S5;signal(g);end; beginwait(e);S6;signal(h);end;
beginwait(f);wait(g);wait(h);S7;end; parend end
(b)Vara,b,c,d,e,f,g,h,i,j;semaphore:=0,0,0,0,0,0,0,0,0, 0; begin parbegin
beginS1;signal(a);signal(b);end;
beginwait(a);S2;signal(c);signal(d);end; beginwait(b);S3;signal(e);signal(f);end; beginwait(c);S4;signal(g);end; beginwait(d);S5;signal(h);end; beginwait(e);S6;signal(i);end; beginwait(f);S7;signal(j);end;
beginwait(g);wait(h);wait(i);wait(j);S8;end; parend end
23.在生产者消费者问题中,如果缺少了signal(full)或signal(empty),对执行结果有何影响?
答:如果缺少signal(full),那么表明从第一个生产者进程开始就没有改变信号量full值,即使缓冲池产品已满,但full值还是0,这样消费者进程执行 wait(full)时认为缓冲池是空而取不到产品,消费者进程一直处于等待状态。如果缺少signal(empty),在生产者进程向n个缓冲区投满产品后消费者进程才开始从中取产品,这时empty=0,full=n,那么每当消费者进程取走一个产品 empty值并不改变,直到缓冲池取空了,empty值也是0,即使目前缓冲池有n个空缓冲区,生产者进程要想再往缓冲池中投放产品也会因为申请不到空缓冲区被阻塞。 24.在生产消费者问题中,如果将两个wait操作即wait(full)和wait(mutex)互换位置,或者将signal(mutex)与signal(full)互换位置,结果如何? 答:将wait(full)和wait(mutex)互换位置后,可能引起死锁。考虑系统中缓冲区全满时,若一生产者进程先执行了wait(mutex)操作并获得成功,则当再执行 wait(empty)操作时,它将因失败而进入阻塞状态,它期待消费者进程执行 signal(empty)来唤醒自己,在此之前,它不可能执行signal(mutex)操作,从而使试图通过执行wait(mutex)操作而进入自己的临界区的其他生产者和所有消费者进程全部进入阻塞状态,这样容易引起系统死锁。若signal(mutex)和
7
signal(full)互换位置后只是影响进程对临界资源的释放次序,而不会引起系统
8
死锁,因此可以互换位置。
25.我们在为某一临界资源设置一把锁 W,当 W=1 时表示关锁,当 W=0 时表示锁已打开。试写出开锁和关锁的原语,并利用他们实现互斥。 答:整型信号量:Wlock(W):whileW=1dono-op un:l=1oc;k
(W):W:=0;
记录型信号量:iuf(W>1)thelock(W):W:=W+1; infl(oWc>0k(nblock(W,L) )Wt)h:eWn:w=aWke-u1p;( W,L)例子:Vbrepeat ea
griWn: semaphore:=0; lcourcrnlikot(W);
cikc(alsection uemaindWe)r; sectioendntilfalse; n 26.试修改下面生产者-消费者问题解法中的错误
: 答:bproducer: repeat egin …pwr
oduceraniteminnwabaiitt((mfuutllex););extp; /
*应为wait/uffer(in):=n(empty),而且还应该在wait(mutex)的前面*/ s/i*g缓冲池数组游标应前移extp;
nal(mut:in:=(in+1)modn;*/ u*signal(feuxll);
end
ntilfalse; );*/ cbonsumer: repeat
egin wwanaiitt((memutpex);
ouexty);/*应为wait(full),而且还应该在wait(mutex)的前面*/ stt:c=:ou=tbu+1ff;e/r*(考虑循环,应改为out);
:out:=(out+1cignal(mutex);/*signal(empty)modn;*/ uonntsiulmfearliste;em
innextc; );*/ 9
end
27.试利用记录型信号量写出一个不会出现死锁的哲学家进餐问题的算法. 答:Varchopstick:array[0,…,4]ofsemaphore;
所有信号量均被初始化为 1,第 i 位哲学家的活动可描述为: Repeat
Wait(chopstick[i]);
Wait(.chopstick[(i+1)mod5]); … Ea.t; … Signal(chopstick[i]);
Signal(chopstick[(i+1)mod5]) Ea.t; … Think;
Untilfalse;
28.在测量控制系统中的数据采集任务,把所采集的数据送一单缓冲区;计算任 务从该单缓冲中取出数据进行计算.试写出利用信号量机制实现两者共享单缓冲的同步算法。
答:a.Varmutex,empty,full:semaphore:=1,1,0; gather: begin repeat ……
gatherdatainnextp; wait(empty); wait(mutex); buffer:=nextp; signal(mutex); signal(full); untilfalse; end
compute: begin repeat …… wait(full); wait(mutex); nextc:=buffer; signal(mutex); signal(empty);
computedatainnextc; untilfalse;
10