现代VM如何处理内存分配?

时间:2012-07-04 07:12:50

标签: c memory-management lua vm-implementation

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

我下载了Lua源代码并开始阅读它。过了一会儿,我意识到涉及到很多宏的东西,我找不到真正的内存分配完成的代码(即。malloc调用)。

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

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

所以这引出了一个问题:现代虚拟机如何处理内存分配? Lua如何从堆中分配内存?除了malloc之外,还有什么方法可以进行分配吗?其他方法的优缺点是什么?

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

2 个答案:

答案 0 :(得分:14)

Lua最明确地使用malloc,形式为realloc(也可以传递自定义分配器),但是,因为Lua使用GC类似99%的基于VM的语言,它使用用于自动将GC标头块添加到分配的宏。

您会发现Lua的内存全部由LuaM_lmem.c中的lmem.h例程处理,这些例程都使用VM的全局状态来存储allocator,最初设置为l_alloc(来自lauxlib.c),但可以由lua_setallocf更改。

最近,LuaJIT增加了分配下沉和计划一些非常酷的内存功能,你可以在LuaJIT Garbage Collection上阅读这篇文章。本文介绍了围绕VM / JIT内存分配,下沉,聚合和垃圾收集的许多策略和设计。

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

就各种内存分配器的专业人士而言,使用标准malloc很简单,但是以速度和浪费为代价对齐和各种额外的块标记到每个分配。

转向更高级的竞技场,池,slab和块分配器,我们可以大大加快速度(特别是对于固定大小的内部VM分配),并避免使用更通用的分配器(如{)进行大量碎片和开销。 {1}},但当然这些分配器更复杂,如果从头开始(在像VM一样的大型系统只是要求问题),你必须调试它们,就像经过试验和测试一样CRT malloc实施。

答案 1 :(得分:5)

Lua核心不使用malloc和朋友。它依赖于用户提供的内存分配函数,它具有realloc - 类似语义(但在处理NULL指针和大小为0时更精确)。请参阅lua_Alloc

辅助Lua库提供了一个方便luaL_newstate函数,它使用基于标准lua_newstaterealloc的内存分配函数通过核心free函数创建一个Lua状态。其他客户端可以使用适合其应用程序的任何内存分配。