环形缓冲区Ring buffer
在固定容量存储上循环推进读写位置。
- 核心约束
- 读写位置回绕;需区分空与满。
- 适用问题
- 有界流、生产者消费者、低分配开销缓冲。
- 边界与取舍
- 容量耗尽策略和并发内存序需要单独设计。
常见操作#
C 为固定容量;n 为当前元素数;b 为一次批量复制的元素数。
| 操作 | 时间复杂度 | 条件与说明 |
|---|---|---|
| 入队 / 出队一个元素 | 推进读写位置并回绕;满时拒绝、覆盖或等待由调用方约定。 | |
| 查看空闲量 / 已用量 | 维护读写位置,并明确空满判定;并发读到的量可能只是边界估计。 | |
| 批量读写 | 回绕时至多拆成两段;不包含等待数据的时间。 | |
| 遍历现存数据 | 从读位置访问到写位置;并发修改时需额外协议。 |
时间与空间#
- 时间复杂度
- 单元素入队 / 出队
- 存储空间
固定容量不自动扩容。单生产者单消费者仍需正确的发布顺序与内存屏障。
工程中的应用#
1 个案例 · 附源码Linux IIO 的 kfifo 缓冲在采样进入内核与用户态读取之间暂存数据,按先进先出顺序交付采样记录。
附源码片段 · 内存管理
基础原理参考资料
Linux 6.12 · Circular Buffers环形下标、可用空间计算与单生产者单消费者的内存屏障。