#memory-allocator #allocator #malloc #alloc #no-std

no-std bin+lib emma

一个完全兼容 no_std 和 “no-libc” 的内存分配器

2 个版本

0.0.1 2024 年 8 月 12 日
0.0.0 2024 年 8 月 10 日

#27#malloc

Download history 96/week @ 2024-08-05 171/week @ 2024-08-12

每月 267 次下载

MIT/Apache

79KB
2K SLoC

Emma 是一个可嵌入内存分配器。这意味着

  • 完全兼容 no_std
  • 没有直接或间接的二进制依赖,包括对 libc 的依赖:emma 使用原始系统调用。请注意,您的 rustc 目标可能依赖于 libc - 如果您想避免这种情况,请使用与 emma 兼容的 x86_64-unknown-linux-unknown 目标。
  • 不使用任何共享资源:emma 不像 brk/sbrk 那样修改共享数据段,而是始终使用 mmap 映射其自己的段。

多个 emma 实例可以与同一进程中的其他分配器共存。如果其符号被重命名,emma 甚至可以与其他副本和/或版本共存而不会相互干扰!

用法

像使用任何其他分配器一样使用 emma

#[global_allocator]
static EMMA: emma::DefaultEmma = emma::DefaultEmma::new();

性能

Emma 与(其他)最先进的分配器似乎相差不远。

目标架构

目前,emma 仅针对 x86_64 上的 Linux。

已知问题

  • 不清楚 emma 在进程被 fork 时的行为。(注意:多线程进程的子进程可能只能访问异步信号安全的函数,直到它们调用 execve。)
  • 只要没有线程当前正在分配或释放内存,调用 fork(或执行等效的 clone 调用)是安全的。但是,如果 fork 进程在多个线程上分配了内存,则内存使用将不最优,直到新主线程终止。
  • 将多个 emma 实例嵌入到单个进程中应该可以工作,但除非它们的符号被重命名,否则它们可能在幕后共享数据结构。
  • 即使所有分配都返回,emma 实例也不会释放所有资源。这对于全局分配器来说是合理的,但使其不如临时分配器有用。
  • Emma 不是异步信号安全的,即您不能在信号处理程序中分配或释放内存。(同样,对于您的默认内存分配器,这也可能成立;POSIX 也没有将 mallocfree 列为异步信号安全。)

特性

  • 启用 tls 以启用线程局部存储需要 nightly 编译器。启用 tls 可以大幅提高性能。
  • 启用 boundary-checks 可以在库边界处启用断言。这些断言会略微影响性能。

许可证

许可协议为以下之一

由您选择。

贡献

除非您明确声明,否则任何有意提交以包含在作品中的贡献,根据Apache-2.0许可证定义,应双重许可如上所述,不附加任何额外条款或条件。

依赖项

~12MB
~301K SLoC