操作系统精髓与设计原理-第5章 并发性 - 互斥和同步 联系客服

发布时间 : 星期五 文章操作系统精髓与设计原理-第5章 并发性 - 互斥和同步更新完毕开始阅读ab2237da50e2524de5187e38

提示:允许n的值为-1,这表示不仅缓冲区为空,而且消费者也检测到这个事实并将被阻塞,直到生产者产生新数据。这个方案不需要使用图5.10中的局部变量m。

答:

这个程序来自于[BEN82] program producerconsumer; var n: integer;

s: (*binary*) semaphore (:= 1); delay: (*binary*) semaphore (:= 0); procedure producer; begin repeat produce;

semWaitB(s); append; n := n + 1;

if n=0 then semSignalB(delay); semSignalB(s) forever end;

procedure consumer; begin repeat

semWaitB(s); take;

n := n – 1; if n = -1 then begin

semSignalB(s); semWaitB(delay); semWaitB(s) end;

consume;

semSignalB(s) forever end;

begin (*main program*) n := 0; parbegin

producer; consumer parend end.

5.14考虑图5.13.如果发生下面的交换,程序的意义是否会发生改变?

a.semWait(e);semWait(s) b.semSignal(s);semSignal(n) c.semWait(n);semWait(s) d.semSignal(s);semSignal(e)

答:只要交换顺序都会导致程序错误。信号量s控制进入临界区,你只想让临界区区域包括附加或采取功能。

5.15在讨论有限缓冲区(见图5.12)生产者/消费者问题时,注意我们的定义允许缓冲区中最多有n-1个入口? a.这是为什么?

b.请修改程序,以不久这种低调? 答:如果缓冲区可以容纳n个入口,问题在于如何从一个满的缓冲区中区分出一个空的缓冲区,考虑一个有六个位置的缓冲区,且仅有一个入口,如下: A Out in

然后,当一个元素被移出,out=in。现在假设缓冲区仅有一个位置为空: D E A B C In out 这样,out=in+1.但是,当一个元素被添加,in被加1后,out=in,当缓冲区为空时同理。

b.你可以使用一个可以随意增加和减少的辅助的变量,count。

5.16这个习题说明了使用信号量协调三类进程。圣诞老人在他北极的商店中睡眠,他只能被一下两种情况之一唤醒:(1)所有九头驯鹿都从南太平洋的假期回来了,或者(2)某些小孩在制作玩具时遇到了困难。为了让圣诞老人多睡会,这些孩子只有在是那个人都遇到困难时才唤醒他。当三个孩子的问题得到解决时,其他想访问圣诞老人的孩子必须等到那些孩子返回。如果圣诞老人醒来后发现在三个孩子在他的店门口等待,并且最后一头驯鹿已经从热带回来。则圣诞老人决定让孩子门等到圣诞节之后,因为准备最后一天哦iuxunlu必须与其他unlu在暖棚中等待并且还没有套上缰绳做成雪橇前回来。请用信号量解决这个问题。 答:santa:圣诞老人reindeer:驯鹿elf:小孩子sleigh:雪橇toys:玩具

5.17通过一下步骤说明消息传递和信号量具有同等的功能:

a.用信号量实现消息传递。提示:利用一个共享缓冲区保存信箱,每个信箱由一个消息槽数组成的。

b.用消息传递实现信号量。提示:引入一个独立的同步进程。

答:b.这个方法来自于[TANE97].同步进程维护了一个计数器和一个等待进程的清单。进程调用相关用于向同步进程发送消息的生产者,wait或signal,来实现WAITHUO SIGNAL.然后生产者执行RECEIVE来接受来自于同步进程的回复。

当消息到达时,同步进程检查计数器看需要的操作是否已经足够,SIGNALs总是可以完成,但是假如信号值为0时,WAITs将会被阻塞。假如操作被允许,同步进程就发回一个空消息,因此解除调用者的阻塞。假如操作是WAIT并且信号量的值为0时,同步进程进入调

用队列,并且不发送回复。结果是执行WAIT的进程被阻塞。当SIGNAL被执行,同步进程选择一个进程在信号量上阻塞,要不就以先进先出顺序,要不以其他顺序,并且发送一个回复。跑步条件被允许因为同步进程一次只需要一个。