我的问题是关于计算机科学中的消费者-生产者问题的类比

时间:2018-11-09 00:36:32

标签: java multithreading thread-safety producer-consumer

我对有界缓冲区中的生产者-消费者问题有基本的了解,但我无法将其与此类比喻联系起来:描述高速公路到本地道路的匝道如何是生产者/消费者 与有限缓冲区的关系。特别是讨论设计师如何选择尺寸 的匝道。

我知道的事情:(我觉得这只是基础,但无论如何) 在有界缓冲区中,我们需要一个线程安全的使用者和生产者。 生产者只能在缓冲区未满时执行。 使用者只能在缓冲区不为空时执行。 生产者可以一次执行,或者消费者可以一次执行。

我假设高速公路是汽车的生产商。这些车辆将通过匝道驶向当地道路。因此,匝道是缓冲区,本地道路是消费者。我以正确的方式服用吗?但我不知道如何将其与匝道的大小联系起来!

1 个答案:

答案 0 :(得分:0)

如果生产者是高速公路,匝道是有界缓冲区,而本地道路是消费者,那么您可能会将数据吞吐量视为一种交通流。 如果高速公路向匝道供料的速度快于车辆进入小巷的速度,则匝道将被填满。如果高速公路驶入匝道的速度慢于车辆进入小巷的速度,则小巷有时将不会有来自高速公路的交通。如果匝道已满,则部分交通将回到高速公路上,或者不得不使用备用高速公路出口。

生产者-消费者模式具有相似的行为。如果生产者将数据写入边界缓冲区的速度快于消费者从边界缓冲区读取数据的速度,则缓冲区将被填充。当缓冲区填满时,生产者必须等待缓冲区中的空间才能将新值写入缓冲区。当缓冲区清空时,使用者必须等待缓冲区中的数据可用,然后才能从缓冲区读取数据。

这是类比开始使我们失败的地方。生产者-消费者模式可能会阻塞,以确保生产者产生的所有数据都被消费者消耗。但是,也可以设计一个生产者-消费者模式,该模式可以认识到生产者将永远比消费者快,因此消费者将永远不会处理连续系统中产生的所有数据。在这种情况下,生产者必须能够在消费者读取数据之前覆盖一些数据。这就是所谓的采样系统。使用者仅读取数据样本,而不是每个数据值。

采样系统的一个示例可能是引擎控制系统。监视气缸压力的传感器可能能够以每毫秒一个读数或每秒1000次的速率生成数据,但是发动机气门控制器可能只能以每秒500次的速率响应气缸压力。如果边界缓冲区无限大,那么使用者(气门控件)将始终在处理非常旧的数据,从而导致引擎对过去几秒钟的气缸压力做出响应。引擎将失控。相反,如果气门控制器仅读取最新数据,而忽略最后一次读数和当前读数之间的任何数据,则发动机可以维持适当的控制。永远不会处理过时的数据。

使用采样缓冲区的生产者-消费者通常只需要一个元素缓冲区。生产者以其自然速率写入缓冲区。消费者以自然速率读取数据。使用单个元素缓冲区,可以确保使用者仅看到缓冲区中的最新值。消费者甚至看不到所有中间值。