2 个版本

0.1.1 2024年2月6日
0.1.0 2023年6月12日

#675内存管理

MIT 许可证

33KB
591

CI crates.io docs.rs

魔幻缓冲区

一个为 Rust 设计的魔幻环形缓冲区(或虚拟环形缓冲区)实现。 magic-buffer 提供了一种简化的方式来处理通过委托逻辑到硬件的缓冲区循环。

diagram

相同的底层缓冲区在内存中以相邻地址映射两次。这允许在虚拟地址空间中读取前向的同时绕过缓冲区。

此行为对各种应用程序很有用

  • 具有固定大小缓冲区的网络协议解析器
  • 可以提供连续内存片段的 VecDec 实现(例如 SliceDeq
  • IPC 环形缓冲区实现
[dependencies]
magic-buffer = "0.1"

示例

分配缓冲区

缓冲区视口必须对齐页面,并遵循操作系统的分配粒度

use magic_buffer::*;
let buf = MagicBuffer::new(1 << 16).unwrap();
OS 架构 最小缓冲区长度
Windows x86_64 64 KiB
Linux x86_64 4 KiB
OSX x86_64 4 KiB
OSX aarch64 16 KiB

** 欢迎通过 PR 完成此列表

在缓冲区中索引

use magic_buffer::*;
let mut buf = MagicBuffer::new(1 << 16).unwrap();
buf[0] = b'1';
buf[1] = b'2';

// index wraps around
assert_eq!(buf[0], buf[1 << 16]);
assert_eq!(buf[1], buf[(1 << 16) + 1]);

切片

use magic_buffer::*;
let buf = MagicBuffer::new(1 << 16).unwrap();

// the whole underlying buffer starting at pos 0
let a = &buf[..];

// the whole underlying buffer starting at pos 1
// then wrapping around with the first byte at the end
let b = &buf[1..];

依赖项

~0.3–13MB
~109K SLoC