GHCが各スレッドにスタックを与えるのは私の理解です。なぜこれが必要ですか? GHCはCPSにコンパイルされませんか?スレッドはクロージャーとして簡潔に表現されていませんか?なぜGHCはスレッドごとにスタックを持っていますか?
答えて
あなたの質問にはいくつかの側面があります。
GHCランタイムでの設計決定のキーリファレンスは、''Runtime Support for Multicore Haskell''です。
リコールその
GHCのランタイムシステムは、オペレーティング・システムのスレッドの一握り、各物理CPUについて およそ1にそれらを多重化することにより、軽量スレッド の何百万人をサポートしています。
そして:
各Haskellのスレッドは ヒープに割り当てられているのfi有限サイズのスタック上で実行されます。スレッドの状態は、スタックとともにヒープ割り当てスレッド状態オブジェクト(TSO)に保持されます。 TSOのサイズは、 15ワードにスタックを加えたもので、Haskell スレッドの全体の状態を構成します。 TSOを大きな領域にコピーするとスタックが大きくなり、その後 が再び縮む可能性があります。
GHCはCPSでコンパイルされません。各スレッドは再帰呼び出しを行い、スタックに割り当てる必要があります。スタックをヒープに割り当てられたオブジェクトとして表現することで、より簡単になります。
スレッドは閉鎖以上のものです。
スレッドが実行されると、ヒープとスタックに割り当てが開始されます。したがって、
スレッドのスタック、したがってそのTSOは変更可能です。 スレッドが実行されると、スタックは新しいオブジェクトへのポインタ を累積します。したがって、TSOが古い世代に存在する場合は、記憶された[GCのセット] に追加する必要があります。
スタックが指すガベージコレクションオブジェクトを最適化して、GCがスレッドと同じ物理スレッド上で確実に行われるようにすることができます。ガベージコレクタが実行さらに
、 はTSO及びデータは、それが参照するため 所与のCPU上で実行されたTSOSが同じCPU、 にガベージコレクタによって横切られることが非常に望ましいですそのCPUのローカルの キャッシュに存在する可能性があります。
GHCには、スレッドがスタックとヒープにアクセスできるようにコンパイルする必要があるため、スレッドごとにスタックがあります。各スレッドに独自のスタックを与えることで、スレッドはより効率的に並行して実行できます。スレッドは変更可能なスタックを持っているので、「単なる閉鎖」以上のものです。
- 1. GHCリンカエラー(スタック)
- 2. JQueryは、クラスごとにID関数を持っています
- 3. スレッドマネージドオブジェクトが別のスレッドのスタックに入っていない
- 4. なぜTemplateHaskellはGHCにパッケージを読み込ませますか?
- 5. GHCガベージコレクタはラージオブジェクトに対して特別な最適化を持っていますか?
- 6. なぜUmbrellaExceptionはその名前を持っていますか?
- 7. なぜ私はnet.rim.device.api.system.ControlledAccessExceptionを持っていますか?
- 8. なぜpythonはos.path.curdirを持っていますか
- 9. スレッドのスタックには何が格納されていますか?
- 10. なぜUnixはfork()を持っていますが、CreateProcess()は持っていませんか?
- 11. スレッドは、終了したときにスタックが持続していると、スタックが解除されない理由は何ですか?
- 12. なぜSchemeはリストと引用の両方を持っていますか?
- 13. なぜAlt GrはCtrlと同じkeyCodeを持っていますか?
- 14. なぜクラスメンバーはオブジェクトと同じアドレスを持っていますか?
- 15. なぜスタックはオーバーフローしますか?
- 16. WCFを持っているとサービスバスが必要なのはなぜですか?
- 17. epoll_ctlが私に悪いfdを持っていると言っているのはなぜですか?
- 18. なぜ私は '?'を持っていますか?と 'M'はクラスフォルダXcode 4にありますか?
- 19. なぜ私のスレッドはメインスレッドで始まっていませんか?
- 20. なぜセッションはjspでセッションタイムアウト後にセッションIDを持っていますか?
- 21. セグエは、私は、このビューのスタックを持っている
- 22. なぜstaticは文脈によって異なる意味を持っていますか?
- 23. 私は面白い "ファイルのスタック"問題を持っています
- 24. 私はPOSIXスレッドでいくつかの混乱を持っているPOSIXスレッド
- 25. メソッドは参照平等を持っていないのはなぜですか?
- 26. なぜ私は短いフロートを持っていないのですか?
- 27. クライアントごとのスレッドではないコードを作成する
- 28. (... ID、UUID、タイトル)私はスレッドを持つスレッドモデルを、持っているスレッド/ ID /から/スレッド/ UUID
- 29. 実行スタック/ .NET AppDomainはファイルハンドルを保持していますか?
- 30. Android Message Queueスレッドごとまたはハンドラごと
"ghcはスレッドをどのように管理していますか?"と答えるのは素晴らしい仕事でしたが、質問は "なぜ?"と尋ねます。私はそれがパフォーマンスと関係があると思っていますが、詳細を教えてください。 –
これは常にパフォーマンスです.GHCの実行モデルは、共有オブジェクトのスレッドによる競合を最小限に抑えようとします(純度を利用するため)。スタックはランタイムによって必要とされるため、スレッドごとのスタックは明白なステップです。 –