什么是ringbuffer
嗯,正如名字所示,是戒指(首尾一贯的戒指)。 它可以用作在不同上下文(线程、协议)之间传递数据的缓冲区。
基本上,ringbuffer有固定长度,各位置有序号,是连续的。
随着你继续填充这个buffer (可能会相应地被读取),这个序列号将继续增加直到绕过这个环。
ringbuffer通常通过数组实现,但由于其在内存中的连续性,性能非常好。
从排列上看,看起来是这样的。 不再是戒指了。
一般定义的数据结构
typeringbufferstruct { buffer [ ] interface { } read uint 64//读取位置writeuint64 //写入位置size uint64 //缓冲区大小}几大概念:
如果read==write,缓冲区为空
(写入1 ) % size==read,缓冲区已满
一些大的困难是绕着ringbuffer看起来像一个循环,但实际上它是一个数组,在写入数组末尾后,必须返回数组的开头。 但是,因为分组的大小不确定,所以需要在开头合并分组的一半,在对应读取的情况下,分组的一半在结尾,一半在开头合并。
如果写入太快,取消复盖的写入速度大于读取速度,则新写入数据将被复盖为未读取数据。 在这种情况下,有两个决定:是复盖未读数据还是丢弃新写入数据。
避免重复读取的ringbuffer通过复盖写入数据,不删除未读取数据,因此在ringbuffer的读取中判断是否有未读取数据。
假设消费场景,重读/重写的需求需要花费时间,消费者确认时,该对象被消耗后才能释放资源。 此时,需要重新阅读/重写
使用名为优点Ring Buffer的数据结构是因为它提供了可靠的消息传递特性。
这个理由就足够了,但还有其他几个优点。
首先,Ring Buffer比链表还快。 因为是数组,有容易预测的访问模式。
CPU缓存易用性-由于数据在硬件级别预加载到缓存中,因此CPU无需始终返回主内存RAM以查找Ring Buffer中的以下数据:
Ring Buffer是一个数组,可以分配内存,使数组元素永远有效。 这意味着在这种情况下,内存垃圾收集(GC )几乎什么都不用做。 另外,并不是像链表那样每次添加数据时都创建对象。 当这些数据从链表中删除后,对象将被清理。
转载于:https://my.oschina.net/lwl 1989/blog/3098086