可执行代码的高性能malloc实现

时间:2018-08-02 10:59:10

标签: c linux memory-management malloc x86-64

我正在动态生成成吨的可执行机器代码小片段,所有这些片段的大小和生存期都无法预测。当前,我使用的是天真的可执行文件mmap的预分配区域,但这只是临时的,因为最终会耗尽内存。我没有实现任何内存回收机制,而且我也不想这样做:这是一个难题(难以调试错误,碎片,多线程等)。

我需要一个实现malloc / free协议但启用了可执行位的库。

是否有任何malloc实现提供此选项(可以是编译时标志)?

回答评论的更多详细信息:

  • 我当前的平台是x86_64上的Linux,但是将欢迎Windows和ARM 32/64支持(但不是必须的)。
  • 内存永远不会与不同的进程共享,但是在这种情况下,分配器必须支持多线程,并且在可能的情况下可以扩展。

1 个答案:

答案 0 :(得分:3)

最简单的方法是使用池(区域)分配器。例如:https://github.com/philip-wernersbach/memory-pool-allocator。该实现在初始化期间调用一次malloc(),但是在大多数系统上,如果您调用malloc()的大小足够大,它将使用mmap()。因此,您可以修改该库以调用mprotect()或类似方法以使页面可执行,甚至可以将malloc()的调用直接替换为mmap()(因为malloc()的阈值调用mmap()是可配置的,因此您可能不想依赖它。