2个版本
使用旧的Rust 2015
0.0.2 | 2015年4月4日 |
---|---|
0.0.1 | 2015年3月6日 |
#4 in #ringbuffer
19KB
305 行
带有fd信号机制的环形缓冲区 - 不需要内存复制的快速IPC!
这是尝试在地球上实现最高效、最快、最灵活的IPC!一个用例可能是应用程序之间流式传输音频/视频,您需要高性能和低延迟。
它很高效
- 代码为您提供直接访问环形缓冲区内存(无需内存复制)的能力。
- 没有忙等待(除非您想)。
它很快
- 除非必要,否则不使用系统调用 - 只要缓冲区不是完全满或完全空,就没有必要睡眠或发送唤醒信号。
- 每读和每写只需要两个原子操作。
它很灵活
- 通过使用文件描述符进行信号,您可以同时等待多个文件描述符。也就是说,如果需要,您可以让同一个线程等待多个缓冲区。
- 您可以决定您想要的文件描述符类型 - eventfd、管道或其他类型。(如果您不知道从哪里开始,为了获得最佳性能,请使用eventfd)。
它很实用
- 没有分配 - 适用于实时使用。
- 虽然主要是为Linux设计的,但没有强制依赖性使其仅限于Linux(除了仅在Linux下运行的某些基准测试)。
限制
- 环形缓冲区容量创建后不能更改,并且它只适用于
Copy
类型。 - 环形缓冲区是单生产者和单消费者,但生产者和消费者可以是不同的线程,甚至是不同的进程(如果环形缓冲区指向共享内存)。
其他选项
每条消息只发送几个字节,所以内存复制的次数不是很重要?那么一个std::io::pipe
可能更好。
想要更灵活的东西,具有消息总线守护进程、信号、RPC等,并可以忍受一些额外的开销?尝试D-Bus。
用法
首先,您需要以您喜欢的方式为您喜欢的缓冲区分配内存。使用ringbuf::channel_size
来确定缓冲区需要多少内存。
其次,决定您想要一个ringbuf::channel
还是一个fdbuf::channel
- 您可能想要使用fdbuf
,但在您想要自己实现信号(或只是浪费电力忙等待)的情况下,您可以使用ringbuf
。
发送方可以调用 send
方法,该方法需要一个闭包作为参数。您将获得一个可变切片,用于填充您的数据。请注意,由于这是一个环形缓冲区,避免了内存复制,因此可能需要两次调用闭包才能完全填充它。同样适用于接收方,接收方调用 recv
方法。您的闭包需要返回闭包读取(对于 recv
)或写入(对于 send
)的项目数量。
如果缓冲区为空(仅在这种情况下),当可以从缓冲区读取数据时,接收方将唤醒。类似地,如果缓冲区已满(仅在这种情况下),当可以写入更多数据时,发送方将唤醒。唤醒时(仅在这种情况下),调用 wait_clear
方法来重置唤醒。请参阅 fdbuf 基准测试以了解如何相应地进行接收、发送和等待的示例。
最后,一个提示:mio 的事件循环可能在这里很有用,因为它也是基于 fd 等待的。
许可证
Apache-2.0/MIT
依赖项
~43KB