2017-06-06 7 views
1

Channel 9 Videoスレッドとタスクの違いを説明しようとしています。私は通常、技術的な正確さのためにChannel 9のビデオが好きですが、私の理解では、これは重要なステートメントのいくつかを間違ってしまいます。タスクとスレッドのチャンネル9の説明は正しいですか?

はここに文です:

  1. @〜1:48〜2:30:スレッドがメモリと時間で高価です。各スレッドは、1 MBのユーザーモードスタックを取得します。
  2. @〜2:30〜2:37:スレッドの作成にも時間がかかります。データ構造を割り当てて初期化する時間。
  3. @〜2:38〜2:45:コンテキスト切り替えにも時間がかかります。
  4. @〜2:58〜3:23および3:48〜:タスクはマルチコアシステムを使用します[...]したがって、計算を行うときは複数のコアを使用しています。
  5. @〜5:02〜5:30:スレッドは単一のコアで実行され、コンテキストの切り替えは多く発生します。
  6. @〜5:40〜5:51:スレッドは実行方法が異なります。それらは複数のコアで実行されます。
  7. @〜6:20〜6:30:この図でわかるように、スレッディングにはオーバーヘッドがあります。コールスタックの

    1. 量が設定可能です:

    そして、ここでは、私が確認または反証するしたいと思います私の考えです。つまり、スレッド制限は〜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

  8. タスクにさらされている基礎としてスレッドに依存しています。これらのスレッドはスレッドプールから取得されますが、スレッドプールのスレッドを使用する前に作成する必要があります。 AFAIK、Mark Russinovichはまた、Windows Internalsの本で、カーネル構造(_ETHREAD)が再利用のために記憶されていると説明しました。これにより、割り当てのオーバーヘッドが最小限に抑えられ、初期化にかかる時間が短縮されます。

    私はそれがページ417で述べている部分1、私が探していた正確な場所を見つけることが、Windowsの内部で6ませんでした:[...]

    執行スレッドオブジェクトを可能性がありますかない場合があります割り当てを解除する。

  9. タスクは技術的な実装としてスレッドに依存するため、コンテキスト切り替えはどのような場合にも発生します。

  10. スレッドが2つある場合は、別のプロセッサで実行することもできます。 IMHOそれはそれの全体のアイデアです。

  11. スピーカーは、シングルコアシステム上のスレッドについて言います。 IMHOでは、そのような場合でもタスクはほとんど役に立たないでしょう。 4.を参照)。

  12. 4.と5.を参照してください。)

  13. スライドが正しいかもしれませんが、その実際の理由は表示されません。スライドには〜15 msのタイムスライスがありません。これはコンテキスト切り替えを引き起こします。スレッドが結果を待つ必要がある場合にのみ、タスクを使用してオーバーヘッドを減らすことができます。

    この場合、ワーク1の最初の部分がブロックされているように見えるため、スライドの下部も正しくありません。この場合、ワーク2のみが実行できます。ワーク2が終了すると、ワーク1を続行する条件が満たされる可能性があります。タスクがタイムスライス内で発生した場合にのみ、タスクにはメリットがあります。

    いずれにしても、遅かれ早かれTasksとともにコンテキストスイッチが発生します。私は上記のSO

    上のこれらの質問の助けを借りて、私の理解を確認しようとしている

は7つの個々の質問のように見えるかもしれません。

  • すべて1曲のビデオでそのソースを持っているので、私はそれがSOルールを次の場所で情報を見つけることが私見より重要だ
  • いくつかの質問が互いに
  • に依存して一つの場所でそれらのすべてを尋ねました一度に1つの質問をすること。

答えて

1

注:純粋にOPの情報に基づいてビデオを見たことがありません。

コールスタックの量は設定可能です。

私たちが非常にぎこちない細部に陥っているのでなければ、おそらく本当に関連しているかもしれません。

for .NETタスクは、スレッドに基づいています。これらのスレッドはスレッドプールから となりますが、それでも使用するには、スレッドプール のスレッドを作成する必要があります。

多少なりとも正しいですが、抽象化と実装の間の明確な境界を維持する必要があります。タスク実行のために.NetのThreadpoolを使用する方がより正確です。

タスクは、(通常)他のコードと並行して実行できる自己完結型のコードセクションのアイデアを表します。スレッドは、同様の性質を持つOSの実装です。

タスクはテクニカル実装としてスレッドに依存しているため、どのような場合でもコンテキスト切り替えが発生します。

間違っています。 Tasksはスレッド上で実行でき、コンテキストの切り替えが可能ですが、Tasksにはより柔軟性のある抽象レイヤーが含まれています。

たとえば、スレッド間で実行をスワップするには、コンテキストスイッチがハードウェアで発生する必要があります。タスク間で実行をスワップするには、そのようなハードウェアコンテキストスイッチが発生してはなりません。タスクは、異なるハードウェアコンテキストスイッチを使用せずに、異なるスレッド間で移動し、スリープ状態にして復元することができます。

スレッドが2つある場合は、異なる プロセッサで実行することもできます。 IMHOそれはそれの全体のアイデアです。

正しい。

スピーカーは、単一のコアシステム上のスレッドについて話しています。 IMHOでは、そのような場合でもタスクはほとんど役に立たないでしょう。

間違っています。タスクは単なる抽象であるため、シングルスレッドシステムでうまく動作します。さらに、ハードウェア・コンテキスト・スイッチを使用せずに単一のスレッドで多くのタスクを実行できるため、パフォーマンスが向上する可能性があります。


ここでの主な概念上の問題は、Task = Threadであると考えられるようです。これはそうではありません。タスクとは、作業を分解する概念的な方法です。スレッドは、特定の動作特性を持つ類似のアイデアの実装です。タスクはカバーの下のスレッドで実行できますが(必ずしもそうではありません)、抽象化によってハードウェアスレッドとは非常に異なる方法で動作することができます。

+0

私はまったく知りませんが、 'Task'はあなたが_threadプールに提出したものですね、そうですか?その場合、スレッドプールのポイントは_re-use_スレッドになります。スレッドは、あなたが言うように、作成して破壊するのに高価です。バックグラウンドで小さなジョブを連続して実行する必要のあるプログラムは、それぞれのスレッドを新しいスレッドにスピンアップさせ、ジョブが終了したときにスレッドを破棄したり、長寿命のバックグラウンドスレッドをいくつか使用したり、 Task'オブジェクトを待ち行列に入れます。後者の方がはるかに効率的です。 –

+0

@jameslarge tasks *はスレッドプール上で実行できますが(例:task.runはこのIIRCを実行します)、これはその動作の1つの側面に過ぎません。 Task.FromResultはスレッドプールを使用しませんが、依然としてタスクです。さらに、Tasksライブラリ/ APIを使用せずにスレッドプールを使用することもできます。タスクを処理するためにスレッドプールを使用することは、一般的で効率的な戦略です。 – NPSF3000

+0

"タスクで.NETでThreadpoolを使用すると、実行がより正確になります。 - 同意する。スレッドプールを使用しない場合、通常のスレッドと同じパフォーマンスを持つ最初から新しいスレッドを作成する必要があります。 –

関連する問題