美文网首页
生产者-消费者

生产者-消费者

作者: e9f3ca3721bc | 来源:发表于2018-12-17 08:57 被阅读5次

    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/epxqkqtx.html