微软开放了mimalloc内存分配系统的代码

微软在麻省理工学院许可下开放了一个图书馆 米马洛克 来自最初为语言的运行时组件创建的内存分配系统的实现 古柯 и 精益。 Mimalloc 适合在标准应用程序中使用,无需更改其代码,并且可以充当 malloc 函数的透明替代品。 支持在 Windows、macOS、Linux、BSD 和其他类 Unix 系统上工作。

mimalloc 的主要特点是其紧凑的实现(少于 3500 行代码)和非常高的性能。 在 进行的测试 mimalloc 的性能优于所有竞争的内存分配库,包括 杰马洛克, tcmalloc, smalloc, rpmalloc и .

为了评估性能,需要使用一组现有的 标准测试 在一些测试中,mimalloc 比其他系统快很多倍;例如,在不同线程间对象迁移的测试中,mimalloc 竟然比 tcmalloc 和 jemalloc 快了 2.5 倍以上。 同时,在大多数测试中,还观察到较低的内存消耗;在某些情况下,内存消耗可以减少 25%。

微软开放了mimalloc内存分配系统的代码

高性能主要是通过使用空闲列表分片来实现的。 mimalloc 没有使用一个大列表,而是使用一系列较小的列表,每个列表都绑定到一个内存页。 这种方法减少了碎片并增加了内存中的数据局部性。 内存页是一组大小相似的块的分组。 在 64 位系统上,页面大小通常为 64 KB。 如果页面中没有剩余占用的块,则将其完全释放并将内存返回给操作系统,这会减少长时间运行的程序中的内存成本和碎片。

该库可以包含在链接阶段或为已组装的程序加载(“LD_PRELOAD=/usr/bin/libmimalloc.so myprogram”)。 图书馆还提供 API 用于将功能集成到运行时和细粒度行为控制中,例如,用于连接惰性内存释放处理程序和单调递增引用计数器。 可以在应用程序中创建和使用多个“堆”,以便分布在不同的内存区域中。 也可以完全释放堆,而无需遍历并单独释放放置在其中的对象。

可以以安全模式构建库,其中在块边界处替换特殊内存检查页(保护页),并使用块分布的随机化和已释放块列表的加密。 此类措施允许您阻止利用基于堆的缓冲区溢出的最典型技术。 启用安全模式后,性能会下降大约 3%。

在mimalloc的特性中,还值得注意的是它不易受到大碎片导致的膨胀问题的影响。 在最坏的情况下,元数据的内存消耗会增加 0.2%,分布式内存的内存消耗会达到 16.7%。 为了避免访问资源时发生冲突,mimalloc 仅使用原子操作。

来源: opennet.ru

添加评论