slab 分配器是否用于为 GHC 中的 thunk 分配内存?

Is slab allocator used to allocate memory for thunks in GHC?

是否有任何 slab 分配器或类似的东西用于为 GHC 中的 thunk 结构分配内存?或者,它是否在 C 中使用了像 malloc 这样天真的东西?

我猜想在惰性函数式编程语言中,短时间内分配了 thunk 的数量,尤其是当多个线程 运行 在它们上面时。或者,分配不是经常发生吗?我尝试在 the GHC repository 中寻找它的代码,但找不到。

GHC 使用自定义分配器,在此处描述:https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/BlockAlloc

它基于块。如果您对 GHC 如何管理其内存感兴趣,https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage 是一个好的开始。

分配 thunk 和其他正常的小分配 "open coded" 在转换为 GHC 的 low-level 中间语言 Cmm 期间,看起来像

       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 能力(~ OS 执行 Haskell 代码的线程)都有一个单独的 "nursery" 或分配池,Hp 指向其中,由 HpLim 分隔。 bennofs的回答中提到的block allocator就是用来分配这些nurseries本身和其他大对象的。