2011-06-22 51 views

回答

5

你的問題有幾個方面。

GHC運行環境中設計決策的關鍵參考文件是''Runtime Support for Multicore Haskell''

回想

的GHC運行時系統支持數以百萬計的輕量線程 的通過複用它們到少數的操作系統線程, 大致一個用於每個物理CPU。

和:

每個的Haskell線程運行上的無限大小的堆棧,它在 堆中分配。線程的狀態及其堆棧保存在堆分配線程狀態對象(TSO) 中。一個TSO的大小大約是 加上堆棧的15個字,並構成一個Haskell線程的整個狀態。堆棧可以通過將TSO複製到更大的區域而增長,並且隨後可以再次收縮

GHC不通過CPS進行編譯。每個線程都進行遞歸調用,並且它們必須分配給堆棧。通過將堆棧表示爲堆分配對象,事情變得更簡單。

線程不僅僅是一個閉包。

當線程執行時,它開始分配給堆和堆棧。因此:

線程的堆棧,因此它的TSO是可變的。當一個 線程執行時,堆棧將累積指向新對象的指針,即 ,所以如果TSO駐留在舊代中,則必須將其添加到記錄的[GC]集合的 。

堆棧指向的垃圾收集對象可以進行優化,以確保GC在與線程相同的物理線程上發生。

此外,垃圾收集器運行時, 它是高度期望的是已被一個 給定的CPU上執行的TSOS由相同的CPU上的垃圾收集器穿過, 因爲TSO和數據是指可能位於該CPU的本地緩存中。

因此,GHC爲每個線程都有一個堆棧,因爲編譯要求線程可以訪問堆棧和堆。通過爲每個線程提供自己的堆棧,線程可以更高效地並行執行。線程不僅僅是「封閉」,因爲它們有一個可變的堆棧。

+0

您在回答「ghc管理線程如何?」方面做得很好,但問題明確提出「爲什麼?」。我認爲這是與性能有關,但你是否願意詳細說明。 –

+0

它始終是性能 - GHC的執行模型試圖最小化線程對共享對象的爭用(以利用純度)。由於運行時需要堆棧,因此每個線程堆棧是一個明顯的步驟。 –