1

是否有任何slab分配器或類似的東西用於爲GHC中的thunk結構分配內存?或者,它在C中使用了一些天真像malloc的東西嗎?是否使用slab分配器爲GHC中的thunk分配內存?

我猜在快速函數式編程語言中短時間內分配了thunk的數量,尤其是當多線程在其上運行時。或者,分配不是經常發生?我試圖在the GHC repository中尋找它的代碼,但找不到任何代碼。

+1

[GHC垃圾收集器相關論文](http://simonmar.github.io/bib/papers/parallel-gc.pdf)。 – Alec

+1

垃圾收集環境的內存分配通常與您在C中執行操作的方式截然不同。「malloc」成本太高是因爲對象可以按任意順序釋放,但無法移動。然而,垃圾收集器移動對象是很常見的,這意味着你可以使分配器本身變得更加簡單。 –

回答

3

分配的「開放編碼」翻譯三座標測量機,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的答案中提到的塊分配器用於分配這些苗圃本身和其他大型物體。