为什么在使用共享内存的Producer-Consumer范例中,缓冲区中只允许使用BUFFER_SIZE-1项?

Rüp*_*ure 3 c operating-system producer-consumer circular-buffer

以下是摘自"操作系统概念"第7版高尔文,加涅第3章的硬拷贝本身:


以下变量驻留在生产者和使用者进程共享的内存区域中:

#define BUFFER_SIZE 10

typedef struct {
 . . .
} item;

item buffer[ BUFFER_SIZE ];
int in = 0;
int out = 0;
Run Code Online (Sandbox Code Playgroud)

共享缓冲器被实现为具有两个逻辑指针的圆形阵列: .The变量指向在缓冲器中的下一个自由位置; out指向缓冲区中的第一个完整位置.当in==out;缓冲区已满时,缓冲区为空((in+1)%BUFFER_SIZE)==out.

该方案允许BUFFER_SIZE-1缓冲区中的大多数项目同时存在.


我用粗体突出了我的困惑.这是该章的在线幻灯片的链接(但它编辑了本书的几行).转到"使用共享内存的生产者 - 消费者示例"部分

http://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/3_Processes.html

为什么BUFFER_SIZE-1缓冲区中有项目?如果我们从开始buffer[0]buffer[BUFFERSIZE-1],是不是等于BUFFER_SIZE项目数?作者是否意味着说缓冲区的索引不能超过BUFFER_SIZE-1?但是,他已经明确写出了同时不能超过的项目BUFFER_SIZE-1.请解释整件事.

mvp*_*mvp 13

当你有环形缓冲器,则通常有2个指针或偏移,这意味着startend在缓冲器中的数据的.start= = 时判断缓冲区是否为空的典型约定end.

该约定导致对BUFFER_SIZE - 1环形缓冲区中的项目总数的限制.如果我们允许填充它BUFFER_SIZE,这将意味着start== end,因此无法判断缓冲区是完全空的还是完全填满.

如果再创建一个保持缓冲区中项目数的变量,则可以区分并允许将缓冲区填充到最大值.但是,不这样做更容易,只需将项目的最大数量减少1.

  • 如果“in”和“out”是环形缓冲区偏移量,则它们都必须在“0”到“BUFFER_SIZE-1”之间。这样,“(in-out)%BUFFER_SIZE”是当前梯级缓冲区中的元素数量(如果“in==out”,则为“0”)。但是,如果元素数量为“BUFFER_SIZE”,则“(in-out)%BUFFER_SIZE”也为“0”。如果“in==out”(或者当缓冲区为空时),您的表达式不成立。 (2认同)