1

슬래브 할당 자 또는 이와 유사한 것이 GHC의 썽크 구조에 메모리를 할당하는 데 사용됩니까? 또는 C에서 과 같은 순진한 것을 사용합니까?슬래브 할당자는 GHC에서 썽크 용 메모리를 할당하는 데 사용됩니까?

지연 기능 프로그래밍 언어에서 특히 많은 스레드가 실행되는 경우 썽크 수가 잠깐 할당 된 것 같습니다. 또는 할당이 자주 발생하지 않습니까? the GHC repository에서 코드를 찾으려고했지만 아무 것도 찾을 수 없습니다. 그것은 블록을 기반으로 https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/BlockAlloc

:

+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은 현재 할당 영역의 상한선 인 메모리 위치입니다. HpLim0으로 설정하여 스레드에 신호 (예 : 비동기 예외 또는 GC 동기화)를 보낼 수 있습니다. 할당은 매우 저렴하며 메시징도 처리합니다.

각 Haskell 기능 (하스켈 코드를 실행하는 ~ OS 스레드)은 으로 구분되는 Hp이 가리키는 별도의 "보육"또는 할당 풀을 가지고 있습니다. bennofs의 답에서 언급 된 블록 할당자는이 보육원 자체와 다른 큰 개체를 할당하는 데 사용됩니다.

관련 문제