スラブアロケータなど、GHCのサンク構造にメモリを割り当てるために使用されるものはありますか?あるいは、Cでmalloc
のようなナイーブなものを使用していますか?スラブアロケータはGHCのサンクにメモリを割り当てるために使用されていますか?
遅延関数プログラミング言語では、特に複数のスレッドが実行されている場合に、その数が短時間で割り当てられると思います。または、割り当てが頻繁に行われないのですか? the GHC repositoryのコードを探してみましたが、何も見つかりませんでした。
スラブアロケータなど、GHCのサンク構造にメモリを割り当てるために使用されるものはありますか?あるいは、Cでmalloc
のようなナイーブなものを使用していますか?スラブアロケータはGHCのサンクにメモリを割り当てるために使用されていますか?
遅延関数プログラミング言語では、特に複数のスレッドが実行されている場合に、その数が短時間で割り当てられると思います。または、割り当てが頻繁に行われないのですか? 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が良いスタートです。
サンクや他の正常な、小さな割り当ての配分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
は、スレッドに信号(例えば、非同期例外またはGC同期)を送信するために0
に設定することもできる。したがって、割り当てはかなり安く、メッセージングも処理します。
各Haskell機能(Haskellコードを実行する〜OSスレッド)は、Hp
が指し示す別の "保育所"または割り当てプールを持ち、HpLim
で区切られています。 bennofsの答えに記載されているブロックアロケータは、これらの保育園自身と他の大きなオブジェクトを割り当てるために使用されます。
[GHCのガベージコレクタに関する関連文書](http://simonmar.github.io/bib/papers/parallel-gc.pdf)。 – Alec
ガベージコレクションされた環境のメモリ割り当ては、Cでのやり方と根本的に異なることがよくあります。なぜなら、mallocは非常に高価です。なぜなら、オブジェクトは任意の順序で解放できますが移動できないからです。ただし、ガベージコレクタがオブジェクトを移動するのは一般的です。つまり、アロケータ自体をもっと簡単にすることができます。 –