是否有任何slab分配器或類似的東西用於爲GHC中的thunk結構分配內存?或者,它在C中使用了一些天真像malloc
的東西嗎?是否使用slab分配器爲GHC中的thunk分配內存?
我猜在快速函數式編程語言中短時間內分配了thunk的數量,尤其是當多線程在其上運行時。或者,分配不是經常發生?我試圖在the GHC repository中尋找它的代碼,但找不到任何代碼。
是否有任何slab分配器或類似的東西用於爲GHC中的thunk結構分配內存?或者,它在C中使用了一些天真像malloc
的東西嗎?是否使用slab分配器爲GHC中的thunk分配內存?
我猜在快速函數式編程語言中短時間內分配了thunk的數量,尤其是當多線程在其上運行時。或者,分配不是經常發生?我試圖在the GHC repository中尋找它的代碼,但找不到任何代碼。
GHC使用自定義分配器,這裏descibed:https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/BlockAlloc
它是基於塊的。如果您對GHC如何管理其內存感興趣,https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage是一個好的開始。的thunk其他正常,小分配的
分配的「開放編碼」翻譯三座標測量機,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線程)都有一個單獨的「nursery」或分配池,Hp
指向哪個點,哪個由HpLim
定界。 bennofs的答案中提到的塊分配器用於分配這些苗圃本身和其他大型物體。
[GHC垃圾收集器相關論文](http://simonmar.github.io/bib/papers/parallel-gc.pdf)。 – Alec
垃圾收集環境的內存分配通常與您在C中執行操作的方式截然不同。「malloc」成本太高是因爲對象可以按任意順序釋放,但無法移動。然而,垃圾收集器移動對象是很常見的,這意味着你可以使分配器本身變得更加簡單。 –