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 操 作 , 即 wait(full) 和
wait(mutex)互换位置后,可能引起死锁。考虑系统中缓冲区全满时,若一生
产者进程先执行了 wait(mutex)操作并获得成功,则当再执行 wait(empty)操
作时,它将因失败而进入阻塞状态,它期待消费者进程执行 signal(empty)来
唤醒自己,在此之前,它不可能执行 signal(mutex)操作,从而使试图通过执
行 wait(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