生产者—消费者问题

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;

你可能感兴趣的:(生产者—消费者问题)