#ring-buffer #mpsc #scrollback #no-alloc

无 std scroll-ring

针对字符数据滚动回退优化的 MPSC 覆写环形缓冲区

1 个不稳定版本

0.1.1 2023年2月10日
0.1.0 2023年2月10日

39#mpsc

Download history 47/week @ 2024-04-01 24/week @ 2024-04-08 23/week @ 2024-04-15 7/week @ 2024-04-22 26/week @ 2024-04-29 3/week @ 2024-05-06 228/week @ 2024-05-13 4/week @ 2024-05-20 17/week @ 2024-05-27 8/week @ 2024-06-03 10/week @ 2024-06-10 3/week @ 2024-06-17 120/week @ 2024-06-24 251/week @ 2024-07-01 261/week @ 2024-07-08 141/week @ 2024-07-15

773 每月下载量
3crate中使用(2 直接使用)

MIT/Apache

23KB
282

scroll-ring

MPSC 文本流结构体

此 crate 提供的数据结构旨在满足在损耗网络上的 stdout 风格文本流的需求,这导致以下要求

  • 在无 std/no-alloc 缓冲区中存储字节数据流
  • 多生产者(以便线程或甚至信号/中断可以写入它)
  • 永不阻塞(处理数据的调用可能需要 O(n) 的时间,但即使有大量的读写,它也不应该显著更长——理想情况下是常数时间,但考虑到原子操作通常不是常数时间的,可能是“尽可能快”吗?)
  • 不交错连续写入
  • 不丢失任何写入(可以接受溢出,但需要跟踪有多少字节溢出)
  • 尽可能长时间保留旧数据,直到它被覆盖
  • 当写入速度远远慢于当前写入时,给读者一个获取合理数据块的机会(想想获取数据滚动的快照)
  • 尽可能少地溢出。

溢出的数据甚至可能不会进入缓冲区,例如当写入的切片大于缓冲区时,或者当(大量)数据在读取发生时写入,或者在慢速进程写入时——无论是哪种情况,写入的字节都会被计数,只是不可读(就像如果读者只是太慢一样)。

这是仅基于“尽可能少地溢出”的最小实现,以便获得一个非常简单的实现。更好的选择是

  • 完美的实现将在每个地方都使用原子操作,只要没有读取(或没有从低优先级线程写入,这些低优先级线程的写入在低优先级写入完成 memcpy 之前就绕过了高优先级写入),就不会有溢出。这将是最理想的,但非常困难。

  • 中间的实现将允许并行写入,但会在操作开始和停止时短暂锁定数据结构的行政部分。(因此,溢出可能只是因为中断在不适时触发了)。

    这两种版本都可能需要一些有效字节的位字段(或忙碌写入器的列表),因为由于线程优先级的可变性,并发写入不会按照开始时的相反顺序完成。

  • 目前提供的是最简单的版本。在整个读取或写入过程中,数据结构都保持锁定状态,任何溢出都会记录在锁定的结构旁边的原子字段中。

    这里使用的是单线程模式的 [ringbuf] 数据结构;还有一个多线程模式,可以部分实现其他版本。

许可:MIT OR Apache-2.0

依赖项

~250KB