美文网首页
生产者—消费者问题

生产者—消费者问题

作者: i_2c86 | 来源:发表于2018-10-10 10:30 被阅读0次

    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;

    相关文章

      网友评论

          本文标题:生产者—消费者问题

          本文链接:https://www.haomeiwen.com/subject/gsxpaftx.html