【正确答案】①get进程分配完64个存储区域后,再执行分配时必须等待put进程回收区域,而put进程无须等待分配进程get;get与put共享64位的标志字,它们必须互斥访问。
②mutex是互斥信号量,初值是1,对64位标志字进行保护;S是标志字的同步信号量,初值为64,表示系统开始时64个区间均空闲,可供分配。
根据以上分析,可得出如下的程序:
typedef int Semaphore;
Semaphore S=64;
Semaphore mutex=1;
COBEGIN
process get
BEGIN
while(true)
BEGIN
P(s)
P(mutex);
查找标志字“0”的位(n),修改该位为“1”
V(mutex);
分配该区域(n);
END
END
process_put
BEGIN
While(ture)
BEGIN
回收某区域
P(mutex);
查找,修改标志字对应位为“0”
V(mutex);
V(S);
END
END
问答题
试修改下面消费者一生产者问题解法中的错误。
Producer:
begin
repeat
produce an item in nextp;
wait(mutex);
wait(empty);
buffer (in):=nextp;
signal (mutex);
until false;
end
Consumer:
begin
repeat
wait(mutex);
wait(full);
nextc:=buffer(out);
out:=out+1;
signal(mutex);
consume item in nextc;
until false;
end
【正确答案】修改后的程序如下: Producer: begin repeat … produce an item in nextp; wait(empty); //必须先申请资源后申请互斥信号,以免死锁 wait(mutex); buffer(in):=nextp; signal(mutex); signal(full); //产品置入缓冲区后,应将full加1,表示缓冲区多了一个产品 until false: end consumer: begin repeat wait(full); wait(mutex); nextc:=buffer(out); out:=out+1; signal(mutex); signal(empty); consume item in nextc; until false; end