count:=count-1;
if notfull.quene then notfull.signal; end
begin in:=out:=0; count:=0 end
在利用管程解决生产者一消费者问题时,其中的生产者和消费者可描述为:producer: begin pepeat
produce an inem in nestp PC.put(item); until false; end
consumer: begin repeat
PC.get(item);
consume the item in enxtc; until false; end
31 .什么是 AND 信号量?试利用
AND 信号量写出生产者一消费者问题的解法。
答:为解决并行带来的死锁问题,在
wait
操作中引入
AND
条件,其基本思想是将进
程在整个运行过程中所需要的所有临界资源,
一次性地全部分配给进程,
用完后一次性释放。
解决生产者-消费者问题可描述如下
:
var mutex,empty,full: semaphore:=1,n,0;
buffer: array[0,...,n-1] of item; in,out: integer:=0,0; begin parbegin
producer: begin repeat
produce an item in nextp;
wait(empty);
wait(s1,s2,s3,...,sn); //s1,s2,...,sn 为执行生产者进程除 empty 外其余的条件 wait(mutex);
buffer(in):=nextp; in:=(in+1) mod n; signal(mutex); signal(full);
signal(s1,s2,s3,...,sn); until false; end
consumer: begin
repeat wait(full);
wait(k1,k2,k3,...,kn); //k1,k2,...,kn
为执行消费者进程除
full 外其余的条件
wait(mutex);
nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); signal(empty);
signal(k1,k2,k3,...,kn);
consume the item in nextc; until false; end parend end
32 .什么是信号量集?试利用信号量集写出读者一写者问题的解法。
答:对 AND 信号量加以扩充,形成的信号量集合的读写机制。 解法: Var RN integer;
L,mx: semaphore:=RN,1; begin parbegin reader:begin repeat
Swait(L,1,1); Swait(mx,1,1);
perform read operation;
Ssignal(L,1); until false end
writer:begin repeat
Swait(mx,1,1;L,RN,0); perform write operation; Ssignal(mx,1);