是否有任何slab分配器或类似物用于为GHC中的thunk结构分配内存?或者,它是否在C中使用像malloc
这样天真的东西?
我想在懒惰的函数式编程语言中很快就会分配thunks的数量,特别是当多个线程在它们上面运行时。或者,分配是否经常发生?我尝试在the GHC repository中查找代码,但找不到任何代码。
答案 0 :(得分:3)
分配thunks和其他正常的小分配是"开放编码"在翻译成Cmm,GHC的低级中级语言时,看起来像
Hp = Hp + 16;
if (Hp > HpLim) goto cV2; else goto cV1;
cV2:
HpAlloc = 16;
/* jump to garbage collector */
cV1:
/* Write to the newly-allocated memory and continue */
/* ... */
Hp
是指向最后分配字的机器寄存器,HpLim
是当前分配区域上限的内存位置。 HpLim
也可以设置为0
以向线程发送信号(例如,异步异常或GC同步)。因此,分配非常便宜并且还处理消息传递。
每个Haskell功能(〜执行Haskell代码的OS线程)都有一个单独的"托儿所"或Hp
指向的HpLim
分配池或Startdt
分隔的分配池。 bennofs的答案中提到的块分配器用于分配这些托儿所本身和其他大型对象。
答案 1 :(得分:1)
GHC使用自定义分配器,在此处描述:https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/BlockAlloc
它基于块。如果您对GHC如何管理其记忆感兴趣,https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage是一个好的开始。