【问题标题】:Algorithm Producer-Consumer that fills all the buffers填充所有缓冲区的算法生产者-消费者
【发布时间】:2014-05-10 15:21:48
【问题描述】:

我正在阅读著名的操作系统概念书(Avi Silberschatz、Peter Baer Galvin、Greg Gagne)第 9 版:http://codex.cs.yale.edu/avi/os-book/OS9/

在本书第5节“进程同步”中,有如下例子:

假设我们想为消费者-生产者提供解决方案 填满所有缓冲区的问题。我们可以通过一个整数来做到这一点 跟踪完整缓冲区数量的计数器。最初, 计数器设置为 0。它在它之后由生产者递增 产生一个新的缓冲区并在它之后由消费者递减 消耗一个缓冲区。

这个问题的算法如下:

生产者算法:

while (true)
{
    /* produce an item in nextproduced */ 

    while (counter == BUFFER_SIZE) ; 
    /* do nothing */

    buffer[in] = next_produced; 
    in = (in + 1) % BUFFER_SIZE; 
    counter++; 
}

消费者算法:

while (true)
{
    while (counter == 0) ; /* do nothing */

    next_consumed = buffer[out];

    out = (out + 1) % BUFFER_SIZE;  
    counter--; 
    /* consume the item in next consumed */ 
}

您可以在进程同步一章的幻灯片中找到这些算法:http://codex.cs.yale.edu/avi/os-book/OS9/slide-dir/PPT-dir/ch5.ppt

我不明白这些算法应该如何填充所有缓冲区。据我所知,它们只填充一个缓冲区。我是对的还是我错过了什么?这些算法至少从 2007 年开始在书中已经提到过,所以我认为没有错误,但我误解了它们?

欢迎任何解释。

【问题讨论】:

  • 我不明白你怎么认为他们只会填充/消耗一个缓冲区。它们循环直到填充或消耗的缓冲区数分别为 BUFFER_SIZE 或 0。
  • 嗯,据我了解,例如生产者算法,它每次产生一个项目时都会增加计数器变量(无论当前缓冲区是否已填充),这个变量对我来说没有t 对应于缓冲区的数量......它应该只在当前缓冲区被填充并且我们想要开始填充新的缓冲区时才增加?
  • 生产者算法中的while (counter == BUFFER_SIZE);,当它填充第一个缓冲区时,它将继续循环直到消费者消费一个项目,因此它永远不会开始填充第二个缓冲区。也许我在这里遗漏了一些重要的东西。
  • 哦,我明白你的误会了!我猜 BUFFER_SIZE 的名字很糟糕。它不是单个缓冲区或所有缓冲区的大小,而只是缓冲区的总数。它应该被称为 NUMBER_OF_BUFFERS。
  • 不,这不是坏名字。 Rami 将其误解为 ITEM_SIZE,但它的大小为 buffer[]

标签: algorithm operating-system producer-consumer


【解决方案1】:

好的,我明白了,问题出在变量的语义上。 next_produced 变量将直接填充一个完整的缓冲区,因此 buffer[] 是一个 '''BUFFER_SIZE''' 缓冲区数组,生产者中的每个循环都会产生一个 next_produced 项,它将直接填充整个缓冲区(元素)缓冲区 [] 数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2011-03-21
    • 2018-05-05
    • 2015-07-03
    • 2017-04-07
    • 1970-01-01
    • 2015-06-08
    相关资源
    最近更新 更多