我正在阅读着名的操作系统概念书(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年开始就已经在书中提到过这些算法,所以我认为没有错误,但是我误解了它们?
欢迎任何解释。
答案 0 :(得分:0)
好的,我明白了,问题在于变量的语义。 next_produced变量将直接填充一个完整的缓冲区,因此buffer []是一个'''BUFFER_SIZE'''缓冲区的数组,生成器中的每个循环都会生成一个next_produced项,它将直接填充整个缓冲区(元素)int buffer []数组。