C 现代虚拟机如何处理内存分配?
我正在用C编写一个简单的堆栈机器,主要是为了学习。在使用C 现代虚拟机如何处理内存分配?,c,memory-management,lua,vm-implementation,C,Memory Management,Lua,Vm Implementation,我正在用C编写一个简单的堆栈机器,主要是为了学习。在使用malloc/free进行内存操作后,我认为从现代虚拟机中读取一些特定于内存分配的代码是个好主意 我下载了Lua源代码并开始阅读。过了一段时间,我意识到涉及到很多宏的东西,我找不到真正内存分配的代码(即malloccall) 它只打印一些名称中有mallocword的Lua宏。luavm(和编程语言)根本不使用malloc 这就引出了一个问题:现代虚拟机如何处理内存分配?Lua如何从堆中分配内存?除了malloc,还有其他分配方法吗?其他方
malloc/free
进行内存操作后,我认为从现代虚拟机中读取一些特定于内存分配的代码是个好主意
我下载了Lua源代码并开始阅读。过了一段时间,我意识到涉及到很多宏的东西,我找不到真正内存分配的代码(即malloc
call)
它只打印一些名称中有malloc
word的Lua宏。luavm(和编程语言)根本不使用malloc
这就引出了一个问题:现代虚拟机如何处理内存分配?Lua如何从堆中分配内存?除了malloc
,还有其他分配方法吗?其他方法的优缺点是什么
我还想知道安全使用分配内存的最佳实践、设计模式等。我在Lua的源代码中看到,在分配内存之前有很多间接操作。我从哪里可以了解到这方面的知识?Lua最明确地使用了
malloc
,形式为realloc
(也可以传递自定义分配器),但是,由于Lua使用了类似99%基于VM的语言的GC,它使用宏自动将GC头块添加到分配中
你会发现Lua的内存都是由lmem.c
和lmem.h
中的LuaM\ucode>例程处理的,它们都使用VM的全局状态来存储分配器,分配器最初设置为l_alloc
(从lauxlib.c
),但可以通过Lua\u setallocf
进行更改
最近,LuaJIT增加了分配下沉功能,并计划开发一些非常酷的内存特性,您可以在本文中阅读这些特性。本文介绍了许多围绕VM/JIT内存分配、转储、聚合和垃圾收集的策略和设计
正如您所看到的,内存分配和下沉策略与GC(如果有的话)有着非常密切的联系
就各种内存分配器的优缺点而言,使用标准的malloc
使用起来很简单,但代价是对齐的速度和浪费以及每个分配上标记的各种额外块
转向更高级的arena、pool、slab和block分配器,我们可以大大加快速度(特别是对于固定大小的内部VM分配),并避免使用更通用的分配器(如malloc
)时可能出现的大量碎片和开销,但这些分配器当然更复杂,如果从零开始(在像VM这样的更大系统中,这只是在问问题),就必须对它们进行调试,这与久经考验的CRTmalloc
实现类似。Lua核心不使用malloc
和friends。它依赖于用户提供的内存分配函数,该函数具有类似于realloc
的语义(但在处理NULL
指针和大小为0时更精确)。看
辅助Lua库提供了一个方便的luaL\u newstate
函数,该函数使用基于标准realloc
和free
的内存分配函数,通过核心Lua\u newstate
函数创建Lua状态。其他客户端可以使用任何适合其应用程序的内存分配。谢谢,你能用malloc
告诉我它在哪里吗,因为正如我所说,我找不到它。我正计划追踪malloc中的代码,以便更好地理解内部结构。@sinan:让我快速挖掘出来谢谢,但是realloc
不需要调用malloc
或calloc
?因此应该有一些malloc
或calloc
调用。是的,但是LUA源代码不包含realloc源代码,因为realloc是一个标准函数,并且是C运行时的一部分。要查看realloc源代码,如果我没有错的话,您必须下载glibc的源代码。@sinan没有,您可以使用realloc(3)
,而不必使用malloc(3)
。从主页上看:如果ptr为NULL,realloc()与对malloc()的大小字节调用相同。您对哪种VM感兴趣?你知道,有些虚拟机可以虚拟化整个计算机。你也在问这些问题吗?@AlexeyFrunze,不,我只是对用于编程语言的VM感兴趣。好吧,这个标题看起来很混乱。这是真的应该迁移到的少数问题之一吗?@finnw错误地迁移到程序员的问题很常见吗。se?
find . -exec grep -i "malloc" '{}' \; -print