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本身和其他大对象的。
是否有任何 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本身和其他大对象的。