gpt4 book ai didi

c - 现代虚拟机如何处理内存分配?

转载 作者:太空狗 更新时间:2023-10-29 16:32:24 28 4
gpt4 key购买 nike

我正在开发一个用 C 语言编写的简单堆栈机器,主要用于学习目的。在使用 malloc/free 进行内存操作后,我认为从现代虚拟机中读取一些特定于内存分配的代码是个好主意。

我下载了 Lua 源代码并开始阅读它。一段时间后,我意识到其中涉及很多宏内容,而且我找不到完成真正内存分配的代码(即 malloc 调用)。

find . -exec grep -i "malloc" '{}' \; -print

它只打印了一些名称中有 malloc 单词的 Lua 宏。 Lua VM(和编程语言)根本不使用 malloc!

所以这让我想到了一个问题:现代虚拟机如何处理内存分配? Lua 如何从堆中分配内存?除了malloc,还有其他分配方式吗?其他方法的优缺点是什么?

我也想知道安全地处理分配的内存的最佳实践、设计模式等。我在 Lua 的源代码中看到在分配内存之前有很多间接寻址。我在哪里可以了解这些内容?

最佳答案

Lua 绝对使用 malloc,以 realloc 的形式(也可以传递自定义分配器),但是,因为 Lua 99% 都使用 GC基于 VM 的语言,它使用宏自动将 GC header block 添加到分配中。

你会发现Lua的内存都是由lmem.clmem.h中的LuaM_例程处理的,这些都使用全局用于存储分配器的 VM 状态,最初设置为 l_alloc(来自 lauxlib.c),但可以通过 lua_setallocf 更改。

最近,LuaJIT 添加了分配下沉并计划实现一些非常酷的内存功能,您可以阅读这篇关于 LuaJIT Garbage Collection 的文章.这篇文章涵盖了很多围绕 VM/JIT 内存分配、下沉、聚合和垃圾收集的策略和设计。

如您所见,内存分配和下沉策略与所使用的 GC(如果有)密切相关。

就各种内存分配器的优缺点而言,使用标准的malloc使用起来很简单,但代价是速度和浪费对齐以及各种额外的 block 标记到每个分配。

转向更高级的 arena、pool、slab 和 block 分配器,我们可以显着加快速度(尤其是对于固定大小的内部 VM 分配)并避免使用更通用的分配器可能发生的大量碎片和开销,例如 malloc,但是当然这些分配器更复杂,如果您从头开始(在像 VM 这样的更大系统中只是自找问题),您必须调试它们,而不是经过尝试的-并经过测试的 CRT malloc 实现。

关于c - 现代虚拟机如何处理内存分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11324117/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com