|
ring buffer称作环形缓冲区,也称作环形队列(circular queue),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。如下为环形缓冲区(ring buffer) 的概念示意图。
1 ?. @5 E) o1 H+ A) W6 U F- Q% c' B+ x2 J( c5 D2 C4 z# z- r; Z. r8 c
0 D& r# A1 u; `; f N5 p/ W- L, T
在任务间的通信、串口数据收发、log缓存、网卡处理网络数据包、音频/视频流处理中均有环形缓冲区(ring buffer) 的应用。在RT-Thread的ringbuffer.c和ringbuffer.h文件中,Linux内核文件kfifo.h和kfifo.c中也有**环形缓冲区(ring buffer)**的代码实现。
) g' r& b. k M9 p$ X: x! P: Z9 B j5 j* n$ M, V, G( X" w0 P
环形缓冲区的一些使用特点如下:* |8 {) F/ v: R& J
) L0 v/ S( ^" \, g/ a o
当一个数据元素被读取出后,其余数据元素不需要移动其存储位置;) @( b& J9 I6 ~
适合于事先明确了缓冲区的最大容量的情形。缓冲区的容量(长度)一般固定,可以用一个静态数组来充当缓冲区,无需重复申请内存;
8 U1 Q0 o+ F% ~$ n如果缓冲区的大小需要经常调整,就不适合用环形缓冲区,因为在扩展缓冲区大小时,需要搬移其中的数据,这种场合使用链表更加合适;
. N, i/ j' Y/ B% m因为缓冲区成头尾相连的环形,写操作可能会覆盖未及时读取的数据,有的场景允许这种情况发生,有的场景又严格限制这种情况发生。选择何种策略和具体应用场景相关。; e2 l$ I( A* q' m) E8 l
2 原理
; I# P& ~5 V3 B: |9 b" Q6 |由于计算机内存是线性地址空间,因此**环形缓冲区(ring buffer)**需要特别的算法设计才可以从逻辑上实现。 |
|