计算机操作系统(第四版)汤小丹课后答案完整版 下载本文

parend end

23 .在生产者消费者问题中,如果缺少了 响?答:

如果缺少 signal(full) ,那么表明从第一个生产者进程开始就没有改变信号量 即使缓冲池产品已满,但

full 值还是 0,这样消费者进程执行

full 值,

signal(full) 或 signal(empty),

对执行结果有何影

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) 来唤醒自己, 在此之前,

wait(mutex) 操作而进入自己的临界

它不可能执行 signal(mutex) 操作,从而使试图通过执行

区的其他生产者和所有消费者进程全部进入阻塞状态,这样容易引起系统死锁。 若 signal(mutex) 和 signal(full) 互换位置后只是影响进程对临界资源的释放次序,而不会引起系统死锁,因此可以互换位置。 25 .我们在为某一临界资源设置一把锁

W,当 W=1 时表示关锁, 当 W=0 时表示锁已打开。

试写出开锁和关锁的原语,并利用他们实现互斥。 答:整型信号量: lock(W): while W=1 do no-op W:=1;

unlock(W): W:=0;

记录型信号量: lock(W): W:=W+1; if(W>1) then block(W, L) unlock(W): W:=W-1; if(W>0) then wakeup(W, L) 例子:

Var W:semaphore:=0 ; begin repeat lock(W);

critical section unlock(W); remainder section until false; end

26 .试修改下面生产者-消费者问题解法中的错误 :

答: producer: begin repeat

producer an item in nextp; wait(mutex); wait(full); buffer(in):=nextp;

signal(mutex);

until false; end consumer: begin repeat wait(mutex); wait(empty); nextc:=buffer(out); out:=out+1; signal(mutex);

consumer item in nextc; until false; end

27 .试利用记录型信号量写出一个不会出现死锁的哲学家进餐问题的算法答: Var chopstick:array[0,

,4] of semaphore;

.

所有信号量均被初始化为 1 ,第 i 位哲学家的活动可描述为:

Repeat

Wait(chopstick[i]);

Wait(. chopstick[(i+1) mod 5]);

Ea.t ;

Signal(chopstick[i]);

Signal(chopstick[(i+1) mod 5]) Ea.t ;

Think; Until false;

28 .在测量控制系统中的数据采集任务,把所采集的数据送一单缓冲区;计算任务从该单缓冲中取出数据进行计算 .试写出利用信号量机制实现两者共享单缓冲的同步算法。 答:

a. Var mutex, empty, full: semaphore:=1, 1, 0; gather: begin repeat

gather data in nextp; wait(empty); wait(mutex); buffer:=nextp; signal(mutex); signal(full); until false; end compute: begin repeat

wait(full); wait(mutex); nextc:=buffer; signal(mutex); signal(empty); compute data in nextc; until false; end

b. Var empty, full: semaphore:=1, 0; gather: begin repeat

gather data in nextp; wait(empty); buffer:=nextp; signal(full); until false; end compute: begin repeat

wait(full); nextc:=buffer; signal(empty); compute data in nextc; until false; end

29 .画图说明管程由哪几部分组成,为什么要引入条件变量?

答:管程由四部分组成: ①管程的名称; ②局部于管程内部的共享数据结构说明; 据结构进行操作的一组过程;④对局部于管程内部的共享数据设置初始值的语句;

③对该数

当一个进程调用了管程, 在管程中时被阻塞或挂起, 直到阻塞或挂起的原因解除, 间,如果该进程不释放管程,则其它进程无法进入管程,

而在此期

被迫长时间地等待。为了解决这个