首页 > 编程知识 正文

go ringbuffer,balking是什么意思

时间:2023-05-06 01:43:05 阅读:34455 作者:1144

什么是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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。