Algorithm Producer-Consumer填充所有缓冲区

时间:2014-05-10 15:21:48

标签: algorithm operating-system producer-consumer

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

在本书的第5节"流程同步"中,有以下示例:

  

假设我们想为消费者 - 生产者提供解决方案   填充所有缓冲区的问题。我们可以通过整数来实现   计数器,用于跟踪完整缓冲区的数量。原来,   counter设置为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 */ 
}

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

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

欢迎任何解释。

1 个答案:

答案 0 :(得分:0)

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