1

Является ли какой-либо распределитель slab или что-то подобное, используемое для выделения памяти для thunk-структур в GHC? Или он использует что-то наивное, как malloc в C?Используется ли распределитель slab для распределения памяти для громкоговорителей в GHC?

Я думаю, что количество громких звонков выделяется в течение короткого времени в ленивых функциональных языках программирования, особенно когда на них работает несколько потоков. Или, не так ли распределений происходят так часто? Я пробовал искать код для него в the GHC repository, но не смог найти.

+1

[Соответствующая статья о сборщике мусора GHC] (http://simonmar.github.io/bib/papers/parallel-gc.pdf). – Alec

+1

Распределение памяти для собранных мусора обычно сильно отличается от того, как вы делали вещи в C. Причина «malloc» настолько дорога, потому что объекты могут быть освобождены в любом порядке, но не могут быть перемещены. Однако коллекторы мусора обычно перемещают объекты, а это значит, что вы можете сделать сам распределитель намного проще. –

ответ

3

Распределение санков и других обычных, небольших отчислений «открытым закодированы» при переводе на 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) имеет отдельный «питомник» или пул распределения, в который Hp точек и который разделен HpLim. Блок-распределитель, упомянутый в ответе bennofs, используется для распределения этих самих питомников и других крупных объектов.