2 个版本
0.0.1 | 2024 年 8 月 12 日 |
---|---|
0.0.0 | 2024 年 8 月 10 日 |
#27 在 #malloc
每月 267 次下载
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 也没有将
malloc
或free
列为异步信号安全。)
特性
- 启用
tls
以启用线程局部存储需要 nightly 编译器。启用tls
可以大幅提高性能。 - 启用
boundary-checks
可以在库边界处启用断言。这些断言会略微影响性能。
许可证
许可协议为以下之一
- Apache License,版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则任何有意提交以包含在作品中的贡献,根据Apache-2.0许可证定义,应双重许可如上所述,不附加任何额外条款或条件。
依赖项
~12MB
~301K SLoC