「ユーザースペース」スレッドを実装するための多くのソリューションがあります。 golang.org goroutines、pythonの緑のスレッド、C#の非同期、erlangのプロセスなどです。アイデアは、単一のスレッドまたは限られた数のスレッドでも並行プログラミングを可能にすることです。
抽象レイヤーです。多くの人がこの概念を把握し、多くのシナリオでより効果的に使用する方が簡単です。多くの場合、モデルが幅から引っ張りに移動することが多いため、(良い抽象を前提とした)多くのマシンでは、より簡単です。 pthreads(例として)では、あなたはすべてのコントロールを持っています。他のスレッドモデルでは、スレッドを再利用して、並行タスクを安価に作成するプロセスと、まったく異なるスレッドモデルを使用するという考えがあります。このモデルを消化するのはずっと簡単です。学び、測定することが少なく、結果は一般的に良いです。
私は理解できませんが、なぜOSスレッドが高価なのですか?私が見ているように、数十キロバイトのタスクスタック(OSスレッドまたはユーザランドスレッド)を保存しなければならず、2つのタスク間を移動するためにスケジューラが必要です。
スレッドの作成にはコストがかかり、スタックにはメモリが必要です。また、プロセスが多くのスレッドを使用している場合、コンテキスト切り替えによってパフォーマンスが低下する可能性があります。したがって、軽量のスレッドモデルは、いくつかの理由で有用になりました。 OSスレッドの作成は、中規模から大規模のタスクに適したソリューションであり、理想的には少ない数です。それは制限的であり、維持にかなりの時間がかかります。
タスク/スレッドプール/ユーザランドスレッドは、コンテキストの切り替えやスレッドの作成の多くを心配する必要はありません。多くの場合、リソースが使用可能になった時点でリソースを再利用します(準備ができていない場合は、このマシンのアクティブなスレッドの数を決定します)。
多くのcommmonly(IMO)OSレベルのスレッドは、エンジニアによって正しく使用されていないため高価です - あまりにも多くあり、コンテキスト交換のトンがあるか、同じリソースセット、タスクが小さすぎます。 OSスレッドを正しく使用する方法と、プログラムの実行のコンテキストにその最適な方法を適用する方法を理解するのに、はるかに多くの時間がかかります。
OSは、この両方の機能を無料で提供します。
利用可能ですが、無料ではありません。それらは複雑であり、優れたパフォーマンスにとって非常に重要です。 OSスレッドを作成すると、すぐに時間が与えられます。すべてのプロセスの時間はスレッド間で分けられます。それはユーザースレッドの一般的なケースではありません。リソースが利用できない場合、タスクはしばしばエンキューされます。これにより、コンテキスト切り替え、メモリ、および作成するスレッドの総数が削減されます。タスクが終了すると、スレッドに別のスレッドが与えられます。
時間分布のこのアナロジー考えてみましょう:
- は、あなたがカジノであると仮定します。カードを欲しい人がたくさんいます。
- あなたには一定数のディーラーがいます。カードがほしい人よりもディーラーが少なくなっています。
- いつでもすべての人に十分なカードがあるわけではありません。
- ゲームやハンドを完了するためには、すべてのカードが必要です。ゲーム/ハンドが完了すると、カードはディーラーに返却されます。
どのようにディーラーにカードの配布を依頼しますか?
OSスケジューラでは、(スレッド)優先度に基づいています。すべての人に1度に1枚のカード(CPU時間)が与えられ、優先順位は継続的に評価されます。
人は、タスクまたはスレッドの作業を表します。カードは時間とリソースを表します。ディーラーはスレッドとリソースを表します。
ディーラー2人と3人がいれば、どのように最速で対処しますか? 5人のディーラーと500人の人がいたら?どのようにカードを使い果たすのを最小限に抑えることができますか?スレッドでは、カードの追加やディーラーの追加は、オンデマンドで提供できる解決策ではありません。 CPUを追加することは、ディーラーを追加することと同じです。スレッドを追加することは、一度に多くの人にカードを配布するディーラーと同じです(コンテキスト切り替えを増やす)。カードをより迅速に処理するための戦略は数多くあります。特に、特定の時間内に人々のカードが不要になった後は、ディーラーと人の比率が1/50だった場合、ゲームが完了するまで、テーブルに行って人や人に対処する方が速くないでしょうか?これを優先順位に基づいてすべてのテーブルに訪問し、すべてのディーラーの間で訪問を調整すること(OSアプローチ)と比較してください。それはOSが愚かであることを意味するものではない - OSスレッドの作成は、ディーラーが合理的に処理できるよりも多くの人とテーブルを追加するエンジニアであることを意味する。幸いにも、他のマルチスレッドモデルやより高い抽象化を使用することによって、多くの場合制約が解除される可能性があります。
OSスレッドが "グリーン"スレッドよりも高価になるのはなぜですか?各「タスク」に対して専用のOSスレッドを持つことによって引き起こされると想定されるパフォーマンス低下の理由は何ですか?
パフォーマンスに重大な低レベルスレッディングライブラリ(たとえばpthreads)を開発した場合、再利用の重要性が認識されます(ユーザーが利用できるモデルとしてライブラリに実装する)。この角度から、より高いレベルのマルチスレッドモデルの重要性は、実世界の使用法に基づいた単純で明白なソリューション/最適化であり、マルチスレッドを採用し、効果的に利用するためのエントリバーを下げることができるという理想です。
軽量スレッドのモデルとプールは、多くの問題に対してより優れたソリューションであり、スレッドをよく理解していないエンジニアにとってはより適切な抽象化です。このモデルでは、マルチスレッドの複雑さが大幅に簡素化されます(実際の使用ではより多くのパフォーマンスが向上します)。 OSスレッドでは、より多くの制御を行うことができますが、これらの考慮を考慮すると、プログラムの実行/実装を大幅に再開することができます。より高いレベルの抽象化では、これらの複雑さの多くは、タスク実行の流れを完全に変更することによって最小限に抑えられます(幅と引き数)。
彼らは単に高価とはみなされません。私はいくつかの緑色のスレッド(ハスケルの?)はそれぞれわずか2キロバイトの重さ、すなわち100倍小さいと考えています。別の問題:標準的なPythonスレッドは緑色ではなく、GILによるマルチスレッドの問題がありますが、それでも実際のOSスレッドです(おそらく 'greenlets'を考えているのでしょうか?スレッド)。 – delnan
@delnan OK、聞いたことがある。しかし、私はまだ彼らがより高価でなければならない理由は不明です。両方ともスタックを節約し、コンテキストスイッチを行う必要があります(GILを無視してください、多くの非Pythonの例があります)。 –