计算机操作系统(汤子瀛)习题答案
等待,让权等待\四条准则. 6. 在生产者-消费者问题中,如果缺
少
了
signal(full)
或
/* ************** */ signal(full); /* ************** */ until false; end
consumer: begin
signal(empty),对执行结果会有何影响?
生产者-消费者问题可描述如下: var
mutex,empty,full: repeat
wait(full);
semaphore:=1,n,0;
buffer: array[0,...,n-1] of item; wait(mutex); in,out: integer:=0,0; begin parbegin producer: begin repeat . .
produce an item in nextp; . .
wait(empty); wait(mutex); buffer(in):=nextp; in:=(in+1) mod n; signal(mutex);
11
nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); /* ************** */ signal(empty); /* ************** */ consume the item in nextc; until false; end parend end
可见,生产者可以不断地往缓冲池送消息,如果缓冲池满,就会覆盖原有数据,造成数据混乱.而消费者始终因wait(full)操作将消费进程直接
计算机操作系统(汤子瀛)习题答案
送入进程链表进行等待,无法访问缓冲池,造成无限等待.
7. 在生产者-消费者问题中,如果将两个wait 操作即wait(full)和wait(mutex)互换位置;或者是将 signal(mutex)与signal(full)互换位置结果会如何? var
/* ***************** */ signal(full); signal(mutex);
/* ***************** */ until false; end
consumer: begin
mutex,empty,full: repeat
/* **************** */
semaphore:=1,n,0;
buffer: array[0,...,n-1] of item; wait(mutex); in,out: integer:=0,0; begin parbegin producer: begin repeat . .
produce an item in nextp; . .
wait(empty); wait(mutex); buffer(in):=nextp; in:=(in+1) mod n;
12
wait(full);
/* **************** */ nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); signal(empty);
consume the item in nextc; until false; end parend end
a. wait(full)和wait(mutex)互换位置后,因为mutex 在这儿是全局变量,执行完wait(mutex),则
计算机操作系统(汤子瀛)习题答案
mutex
赋值为0,倘若full 也为0,则该生产者进程就会转入进程链表进行等待,而生产者进程会因全局变量mutex
parbegin process : begin repeat lock(W);
为0 而进行等待,使full 始终为0,critical section 这样就形成了死锁. b.
而
signal(mutex)
与
unlock(W); remainder section until false; end parend
9. 试修改下面生产者-消费者问题解法中的错误: producer: begin repeat . .
producer an item in nextp; wait(mutex);
wait(full); /* 应为wait(empty),而且还应该在wait(mutex)的前面 */
buffer(in):=nextp;
13
signal(full)互换位置后,从逻辑上来说应该是一样的.
8. 我们为某临界区设置一把锁W,当W=1 时,表示关锁;W=0 时,表示锁已打开.试写出开锁原语和关锁原语,并利用它们去实现互斥. 开锁原语: unlock(W): W=0; 关锁原语: lock(W);
if(W==1) do no_op; W=1;
利用开关锁原语实现互斥: var W: semaphore:=0; begin
计算机操作系统(汤子瀛)习题答案
/* 缓冲池数组游标应前移: 设初始值为1 的信号量c[I]表示I in:=(in+1) mod n; */ signal(mutex); /* signal(full); */ until false; end consumer: begin repeat wait(mutex);
wait(empty); /* 应为wait(full),
号筷子被拿(I=1,2,3,4,...,2n),其中n 为自然数. send(I): Begin
if I mod 2==1 then { P(c[I]);
P(c[I-1 mod 5]); Eat;
V(c[I-1 mod 5]);
而且还应该在wait(mutex)的前面 V(c[I]); */
nextc:=buffer(out);
} else
out:=out+1; /* 考虑循环,应改为: { out:=(out+1) mod n; */ signal(mutex); /* signal(empty); */ consumer item in nextc; until false; end
10 试利用记录型信号量写出一个不会出现死锁的哲学家进餐问题的算法.
14
P(c[I-1 mod 5]); P(c[I]); Eat; V(c[I]);
V(c[I-1 mod 5]); } End
11 在测量控制系统中的数据采集任务,把所采集的数据送一单缓冲
计算机操作系统(汤子瀛)习题答案
区;计算任务从该单缓冲中取出数据进行计算.试写出利用信号量机
wait(empty); wait(mutex);
制实现两者共享单缓冲的同步算法. buffer(in)=nextp; int mutex=1; int empty=n; int full=0; int in=0; int out=0; main() { cobegin send(); obtain(); coend } send() { while(1) { . .
collect data in nextp; . .
in=(in+1) mod n; signal(mutex); signal(full); } }//send obtain() { while(1) {
wait(full); wait(mutex); nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); signal(empty);
culculate the data in nextc; }//while }//obtain
12 画图说明管程由哪几部分组成?为什么要引入条件变量?
管程由三部分组成:局部于管程的共
15