|
ring buffer称作环形缓冲区,也称作环形队列(circular queue),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。如下为环形缓冲区(ring buffer) 的概念示意图。' F9 H- d/ M5 e( r
8 Y# X/ t9 O' s
6 n- v1 q, k7 _/ [/ H2 {
在任务间的通信、串口数据收发、log缓存、网卡处理网络数据包、音频/视频流处理中均有环形缓冲区(ring buffer) 的应用。在RT-Thread的ringbuffer.c和ringbuffer.h文件中,Linux内核文件kfifo.h和kfifo.c中也有**环形缓冲区(ring buffer)**的代码实现。/ G2 L5 T: p# p, h
% z( @6 X7 P- z2 X, g
环形缓冲区的一些使用特点如下:
4 z! A# X7 |: N _# c
. u; H0 q8 \% V+ X M当一个数据元素被读取出后,其余数据元素不需要移动其存储位置;1 r P/ C3 e7 e7 T) a% b5 u
适合于事先明确了缓冲区的最大容量的情形。缓冲区的容量(长度)一般固定,可以用一个静态数组来充当缓冲区,无需重复申请内存;# h( x) {" R6 R
如果缓冲区的大小需要经常调整,就不适合用环形缓冲区,因为在扩展缓冲区大小时,需要搬移其中的数据,这种场合使用链表更加合适;' s* H* y) v V( T
因为缓冲区成头尾相连的环形,写操作可能会覆盖未及时读取的数据,有的场景允许这种情况发生,有的场景又严格限制这种情况发生。选择何种策略和具体应用场景相关。1 _+ z9 S, \: \; G9 j
2 原理. |: `" |# D" C1 S- p/ k
由于计算机内存是线性地址空间,因此**环形缓冲区(ring buffer)**需要特别的算法设计才可以从逻辑上实现。 |
|