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

时间:2017-01-15 06:55:49

标签: haskell memory-management functional-programming ghc lazy-evaluation

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

我想在懒惰的函数式编程语言中很快就会分配thunks的数量,特别是当多个线程在它们上面运行时。或者,分配是否经常发生?我尝试在the GHC repository中查找代码,但找不到任何代码。

2 个答案:

答案 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是一个好的开始。