Channel 9 Videoスレッドとタスクの違いを説明しようとしています。私は通常、技術的な正確さのためにChannel 9のビデオが好きですが、私の理解では、これは重要なステートメントのいくつかを間違ってしまいます。タスクとスレッドのチャンネル9の説明は正しいですか?
はここに文です:
- @〜1:48〜2:30:スレッドがメモリと時間で高価です。各スレッドは、1 MBのユーザーモードスタックを取得します。
- @〜2:30〜2:37:スレッドの作成にも時間がかかります。データ構造を割り当てて初期化する時間。
- @〜2:38〜2:45:コンテキスト切り替えにも時間がかかります。
- @〜2:58〜3:23および3:48〜:タスクはマルチコアシステムを使用します[...]したがって、計算を行うときは複数のコアを使用しています。
- @〜5:02〜5:30:スレッドは単一のコアで実行され、コンテキストの切り替えは多く発生します。
- @〜5:40〜5:51:スレッドは実行方法が異なります。それらは複数のコアで実行されます。
- @〜6:20〜6:30:この図でわかるように、スレッディングにはオーバーヘッドがあります。コールスタックの
量が設定可能です:
そして、ここでは、私が確認または反証するしたいと思います私の考えです。つまり、スレッド制限は〜1300ではなく、32ビットプロセスでは最大12000です。利用可能SysInternalsののTestlimitのコピーを持っている人は、それを試すことができます。
D:\>testlimit -t -n 64 Testlimit v5.04 - test Windows limits By Mark Russinovich - www.sysinternals.com Creating threads with 64 KB stacks... Created 12500 threads. Lasterror: 8
スタックサイズもThread Constructor for .NET
タスクにさらされている基礎としてスレッドに依存しています。これらのスレッドはスレッドプールから取得されますが、スレッドプールのスレッドを使用する前に作成する必要があります。 AFAIK、Mark Russinovichはまた、Windows Internalsの本で、カーネル構造(
_ETHREAD
)が再利用のために記憶されていると説明しました。これにより、割り当てのオーバーヘッドが最小限に抑えられ、初期化にかかる時間が短縮されます。私はそれがページ417で述べている部分1、私が探していた正確な場所を見つけることが、Windowsの内部で6ませんでした:[...]
執行スレッドオブジェクトを可能性がありますかない場合があります割り当てを解除する。
タスクは技術的な実装としてスレッドに依存するため、コンテキスト切り替えはどのような場合にも発生します。
スレッドが2つある場合は、別のプロセッサで実行することもできます。 IMHOそれはそれの全体のアイデアです。
スピーカーは、シングルコアシステム上のスレッドについて言います。 IMHOでは、そのような場合でもタスクはほとんど役に立たないでしょう。 4.を参照)。
4.と5.を参照してください。)
スライドが正しいかもしれませんが、その実際の理由は表示されません。スライドには〜15 msのタイムスライスがありません。これはコンテキスト切り替えを引き起こします。スレッドが結果を待つ必要がある場合にのみ、タスクを使用してオーバーヘッドを減らすことができます。
この場合、ワーク1の最初の部分がブロックされているように見えるため、スライドの下部も正しくありません。この場合、ワーク2のみが実行できます。ワーク2が終了すると、ワーク1を続行する条件が満たされる可能性があります。タスクがタイムスライス内で発生した場合にのみ、タスクにはメリットがあります。
いずれにしても、遅かれ早かれTasksとともにコンテキストスイッチが発生します。私は上記のSO
上のこれらの質問の助けを借りて、私の理解を確認しようとしている
は7つの個々の質問のように見えるかもしれません。
- すべて1曲のビデオでそのソースを持っているので、私はそれがSOルールを次の場所で情報を見つけることが私見より重要だ
- いくつかの質問が互いに
- に依存して一つの場所でそれらのすべてを尋ねました一度に1つの質問をすること。
私はまったく知りませんが、 'Task'はあなたが_threadプールに提出したものですね、そうですか?その場合、スレッドプールのポイントは_re-use_スレッドになります。スレッドは、あなたが言うように、作成して破壊するのに高価です。バックグラウンドで小さなジョブを連続して実行する必要のあるプログラムは、それぞれのスレッドを新しいスレッドにスピンアップさせ、ジョブが終了したときにスレッドを破棄したり、長寿命のバックグラウンドスレッドをいくつか使用したり、 Task'オブジェクトを待ち行列に入れます。後者の方がはるかに効率的です。 –
@jameslarge tasks *はスレッドプール上で実行できますが(例:task.runはこのIIRCを実行します)、これはその動作の1つの側面に過ぎません。 Task.FromResultはスレッドプールを使用しませんが、依然としてタスクです。さらに、Tasksライブラリ/ APIを使用せずにスレッドプールを使用することもできます。タスクを処理するためにスレッドプールを使用することは、一般的で効率的な戦略です。 – NPSF3000
"タスクで.NETでThreadpoolを使用すると、実行がより正確になります。 - 同意する。スレッドプールを使用しない場合、通常のスレッドと同じパフォーマンスを持つ最初から新しいスレッドを作成する必要があります。 –