#virtual-memory #memory-buffer #memory #virtual #lock-free #no-alloc

无 std virtual-buffer

一个跨平台的库,用于处理由原始虚拟内存支持的缓冲区

1 个稳定版本

1.0.1 2024年6月29日
1.0.0 2024年6月14日

并发 中排名 383

Download history 139/week @ 2024-06-10 10/week @ 2024-06-17 168/week @ 2024-06-24 26/week @ 2024-07-01 22/week @ 2024-07-08 16/week @ 2024-07-15 7/week @ 2024-07-22 26/week @ 2024-07-29 21/week @ 2024-08-05

每月下载量 72

MIT/Apache

59KB
1K SLoC

许可证

根据以下之一许可:

任选其一。

贡献

除非您明确声明,否则您提交的任何有意包含在作品中的贡献均应以上述方式双重许可,无需任何额外条款或条件。


lib.rs:

此crate提供了一个跨平台的API,用于处理由原始虚拟内存支持的缓冲区。

除了提供进程、分页和内存映射硬件之间的保护和隔离外,虚拟内存还解决了另一个关键问题:虚拟缓冲区的问题。它允许我们在进程的虚拟地址空间中仅保留内存范围,而不实际提交任何内存。这可以用来创建一个无限可增长和可收缩的原地缓冲区,而不会浪费任何物理内存,甚至不会过度提交任何内存。它还可以用于创建不过度提交内存的稀疏数据结构。

原地增长属性在无法进行重新分配时非常有价值,例如,因为数据结构需要并发或以其他方式固定。如果重新分配过于昂贵(比如说,数十到数百MB),它也可能适用于单线程用例。然而,在这种情况下,使用类似 Vec::with_capacity 这样的功能可能更容易。

有关并发向量的实现,请参阅vec模块

保留

保留内存涉及分配一个虚拟地址空间范围,使得同一进程中的其他分配不能为任何其他内容保留相同的虚拟地址空间。已经保留的内存没有内存成本,但是无法访问。为了访问任何页面,您必须首先提交它们。

提交

可以提交保留内存的某个范围,使其可访问。新提交的内存不会消耗任何物理内存。它只是计入过度提交,可能会增加被OOM-killed的概率,可能会占用页表的空间,并可能在页面文件中使用一些空间。提交的页面在第一次写入(“发生故障”)或预取后,才会由物理页面支持。

提交的内存可以再次提交,没有问题,因此没有必要跟踪哪些页面已被提交,以便安全地提交其中的一些。

解除提交

可以解除提交一系列已提交的内存,使其再次不可访问,并释放可能用于它们的任何物理内存,将其返回给操作系统。解除提交的内存仍然是保留的。

保留但未提交的内存可以无问题地解除提交,因此没有必要跟踪哪些页面已被提交,以便安全地解除其中的一些提交。

取消保留

未保留的内存可用于新的分配再次保留。

可以在不先解除提交的情况下取消提交已提交的内存。但是,无法取消提交保留内存的范围,只能取消整个分配。

预取

默认情况下,每个已提交的页面只有在第一次写入后才会由物理内存支持。由于这发生在每个页面上,并且由于上下文切换的开销可能会略微昂贵,因此操作系统提供了一种方式来一次预取多个页面。

页面

页面指的是处理器内存管理单元操作的最小粒度,并且在不同的处理器架构之间有所不同。因此,虚拟内存操作只能影响对齐到页面大小的范围内。

Cargo特性

特性 描述
std 启用使用std::errorstd::borrow

依赖关系

~0–5MB