Haskell のスレッド ( forkIOによって生成されたスレッド) が OS スレッドにどのようにマッピングされているかを正確に調べようとしました。
最初に見つけた情報源は、
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Concurrent.html#g:11
すべての軽量スレッドが実際には 1 つの OS スレッドで実行され、Haskell スレッドが安全な IO 操作でブロックする場合にのみ、GHC ランタイムが新しい OS スレッドを生成して他の Haskell スレッドを実行し、IO 呼び出しがブロックしないように指定します。プログラム全体。
2番目の情報源はここから来ています。
http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/using-smp.html
これは、Haskell スレッドが事前に定義された数の事前に作成された OS スレッドにバランスよくマップされていることを明確に示しています。つまり、80 個の軽量スレッドがあり、プログラムを実行するときにオプション +RTS -N 8 を渡した場合、少なくとも 8 つの OS スレッドが作成され、そのような各スレッドが 10 個の軽量スレッドを実行することになります。8 つの CPU コアを搭載したマシンでは、1 コアあたり約 10 の Haskell スレッドを意味します。
2番目の情報源はより正確なもののようであり、-threaded
フラグを付けてコンパイルされたプログラムを実行するときにGHCランタイムが明らかになることを望むのは、まさにこの動作です。
誰でもこれを確認できますか? また、2 番目のバージョンが正しい場合、バインドされたスレッド ( forkOSを使用して生成されたもの) の目的は何ですか?それは、スレッド ローカル データを使用するネイティブ コードを処理するためだけですか?