1.无论生产者、消费者使用缓冲池时应保证互斥使用(互斥信号量mutex )
2.生产者和消费者间交叉有序:
有序的控制最根源在产品数量上。
设置两个信号量:
分别针对生产者、消费者设置不同的信号量,empty和full分别表示缓冲池中空缓冲池和满缓冲池(即产品)的数量。
1)两个生产者同时的情况
假设的时间片轮转顺序如下
produce;
produce;
wait(e);
wait(m);
buffer(in):=nexp;
wait(e);
wait(m);
buffer(in):=nexp;
in:=(in+1)mod n;
signal(m);
signal(f);
in:=(in+1)mod n;
signal(m);
signal(f);
1号生产者的wait操作使e=n-1,m=0
当1号正在in=0的buffer[0]放入产品时,2号来到,wait(e)仍通过,e=n-2;但wait(m)会使2号阻塞。m=-1,e=n-2。
转入1号生产者执行使in=1,,唤醒m上的等待者——2号生产者,但可能并不立即切换到2号运行,而是其分到的cpu时间完成后再转到2号。此时m=0,f=1。
回到2号进程后,将产品放入缓冲区;in=2;m=1;f=2。
2)生产者等待消费者情况
假设的时间片轮转顺序如下
produce;
wait(e);
wait(m);
buffer(in):=nexp;
wait(f);
wait(m);
nextc:=buffer(out);
in:=(in+1)mod n;
signal(m);
signal(f);
out:=(out+1) mod n;
signal(m);
signal(e);
consume;
设当前运行到一个临界点,缓冲区满了,而生产者先来了要生产。
e=0;m=1;f=n
注意:signal原语唤醒的因wait阻塞的进程后该进程并不需再重新执行wait。
3)2个生产者2个消费者同步模拟分析
produce;
wait(f);
wait(m);
nextc:=buffer(out);
produce;
wait(e);
wait(m);
buffer(in):=nexp;
out:=(out+1) mod n;
signal(m);
signal(e);
wait(e);
wait(m);
buffer(in):=nexp;
in:=(in+1)mod n;
signal(m);
signal(f);
consume;
in:=(in+1)mod n;
signal(m);
signal(f);
wait(f);
wait(m);
nextc:=buffer(out);
out:=(out+1) mod n;
signal(m);
signal(e);
AND信号量的方式
consumer :
repeat
Swait(full, mutex);
nextc:=buffer(out);
out:=(out+1) mod n;
Ssignal(mutex, empty);
consume the item in nexc;
until false;
网友评论