1

Un allocateur de dalle ou quelque chose de similaire est-il utilisé pour allouer de la mémoire aux structures de thunk dans GHC? Ou, utilise-t-il quelque chose de naïf comme malloc en C?L'allocateur de dalle est-il utilisé pour allouer de la mémoire aux thunk dans GHC?

Je suppose que nombre de thunk sont alloués dans un court laps de temps dans les langages de programmation fonctionnels paresseux, en particulier lorsque plusieurs threads sont en cours d'exécution sur eux. Ou, les allocations ne se produisent-elles pas si souvent? J'ai essayé de chercher le code pour cela dans the GHC repository mais je n'en ai trouvé aucun.

+1

[Article pertinent sur le collecteur d'ordures de GHC] (http://simonmar.github.io/bib/papers/parallel-gc.pdf). – Alec

+1

L'allocation de mémoire pour les environnements collectés est souvent radicalement différente de ce que vous feriez en C. La raison pour laquelle 'malloc' est si cher est que les objets peuvent être libérés dans n'importe quel ordre mais ne peuvent pas être déplacés. Cependant, il est courant pour les éboueurs de déplacer des objets, ce qui signifie que vous pouvez rendre l'allocateur lui-même beaucoup plus simple. –

Répondre

3

Répartition des thunks et d'autres allocations normales, les petits sont « ouverts codés » lors de la traduction à Cmm, à faible niveau de langue intermédiaire de GHC, et regarder quelque chose comme

 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 est un registre de la machine qui pointe vers la dernier mot attribué et HpLim est un emplacement de mémoire la limite supérieure de la zone d'allocation actuelle. HpLim peut également être défini sur 0 pour envoyer un signal (par exemple, une exception asynchrone ou une synchronisation GC) au thread. Ainsi, l'allocation est très bon marché et gère également la messagerie. Chaque capacité Haskell (~ thread de système d'exploitation qui exécute le code Haskell) dispose d'un pool de pépinières ou d'allocations distinct dans lequel Hp points et qui est délimité par HpLim. L'allocateur de bloc mentionné dans la réponse de bennofs est utilisé pour allouer ces pépinières elles-mêmes et d'autres gros objets.