c - 为什么在使用共享内存的生产者-消费者范式中缓冲区中只允许 BUFFER_SIZE-1 项?

标签 c operating-system producer-consumer circular-buffer

这是“操作系统概念”第 7 版 Galvin,Gagne 第 3 章硬拷贝本身的摘录:


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

#define BUFFER_SIZE 10

typedef struct {
 . . .
} item;

item buffer[ BUFFER_SIZE ];
int in = 0;
int out = 0;

共享缓冲区实现为一个循环数组,有两个逻辑指针:inout。变量in指向下一个空闲缓冲区中的位置;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的index不能超过BUFFER_SIZE-1吗?但是后来,他明明写了items的数量不能超过BUFFER_SIZE-1 同时。请解释整个事情。

最佳答案

当你有环形缓冲区时,你通常有 2 个指针或偏移量,它们表示缓冲区中数据的 startend。当 start == end 时判断缓冲区是否为空的典型约定。

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

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

关于c - 为什么在使用共享内存的生产者-消费者范式中缓冲区中只允许 BUFFER_SIZE-1 项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16128798/

相关文章:

c++ - Erlang - C 和 Erlang

C: fread 没有读完整 block

c - 在 c 上使用 getchar() 输入后得到 'Enter'

java - 交替 PipedOutputStream PipedInputStream Numbers 示例

c - C 在编译和执行程序之间有区别吗?

c# - 如何仅从 Request.UserAgent 获取操作系统?

python - 递归python文件复制程序的问题

linux - 在 Unix 中列出已完成的进程

java - 生产者消费者模式——处理生产者失败