Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 现代虚拟机如何处理内存分配?_C_Memory Management_Lua_Vm Implementation - Fatal编程技术网

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,还有其他分配方法吗?其他方

我正在用C编写一个简单的堆栈机器,主要是为了学习。在使用
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这样的更大系统中,这只是在问问题),就必须对它们进行调试,这与久经考验的CRT
malloc
实现类似。

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