【深入浅出-系统架构师】(14):操作系统基础知识——生产者消费者模型

栏目: 后端 · 发布时间: 6年前

内容简介:生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题,主要解决的是两者速率不一致而产生的阻抗不匹配。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。1.一个生产者,一个消费者,一个缓冲区。问题关键:只有生产了产品,消费者才能消费(同步)

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题,主要解决的是两者速率不一致而产生的阻抗不匹配。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

PV原语

1.一个生产者,一个消费者,一个缓冲区。

问题关键:只有生产了产品,消费者才能消费(同步)

其中包含的有2个同步条件:

  • 只有当缓冲区是空的情况下,生产者才能往缓冲区写数据
  • 只有当缓冲区是满的情况下,消费者才能往缓冲区读数据

所以要定义2个同步信号量: empty–表示缓冲区是否为空,初值为1.

full–表示缓冲区中是否为满,初值为0

生产者进程

while(true){
   produce();
   P(empty);
   toBuffer();
   V(full);
}

消费者进程

while(true){
    P(full);
    getBuffer();
    V(empty);
    consume();
}

2.一个生产者,一个消费者,N个环形缓冲区

定义2个同步信号量:

empty–表示缓冲区是否为空,初值为n

full–表示缓冲区是否为满,初值为0

设缓冲区的编号为1~n-1,定义2个指针in和out,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。

生产者进程

while(true){
  produce();
  P(empty);
  toBuffer(in);
  in = (in + 1) mod n;
  V(full);
}

消费者进程

while(true){
  P(full);
  getBuffer(out);
  out=(out+1) mode n;
  V(empty);
  consume();
}

3.一组生产者,一组消费者,N个环形缓冲区

问题关键:生产者生产了产品,消费者才能消费;生产者之间不能往同一个缓冲区写数据;消费者也不能从同一个缓冲区读数据;

同步关系

  • 只有当缓冲区是空的情况下,生产者才能往缓冲区写数据
  • 只有当缓冲区是满的情况下,消费者才能往缓冲区读数据

互斥关系:

  • 生产者往一个缓冲区写数据了,另外一个生产者不能往该缓冲区写数据
  • 消费者往一个缓冲区读数据了,另外一个生产者不能往该缓冲区读数据

所以定义4个信号量:(几种关系,几个信号量)

  • empty–表示缓冲区是否为空,初值为N
  • full–表示缓冲区是否为满,初值为0
  • mutex1–生产者之间的互斥信号量,初值为1
  • mutex2–消费者之间的互斥信号量,初值为1

该缓冲区的编号为1~n-1,定义两个指针in和out,分别是生产者进程和消费者进程使用的指针

生产者进程

while(true){
  produce();
  P(empty);
  P(mutex1);
  tobuffer(in);
  in = (in + 1) mod n;
  V(mutex1);
  V(full);
}

消费者进程

while(true){
  P(full);
  P(mutex2);
  getBuffer(out);
  out = (out + 1) mod n;
  V(mutex2);
  V(empty);
}

实际上互斥还是同步,虽然有以上2种方式实现,但其根本还是原语的原子性。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

共享经济大趋势

共享经济大趋势

倪云华 虞仲轶 / 2016-1-1 / 49.00

2015年互联网界乃至整个商界的最热门字眼,恐怕就是“共享经济”了。共享经济模式正以前所未有的速度与规模席卷全球。那么,共享经济为什么会产生?其本质是什么?共享经济会为我们带来什么价值?成功的共享经济商业模式是怎样的?如何管理和运作一家共享经济企业?在未来,共享经济还将面临哪些挑战?共享经济的下一个发展机会在哪里?传统经济又该如何应对? 作为国内第一本系统性阐述共享经济的书籍,本书通过对全球......一起来看看 《共享经济大趋势》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具