web-dev-qa-db-ja.com

スレッドと並列処理の違いは何ですか?

スレッド化と並列処理の違いは何ですか?

どちらが他よりも優れていますか?

37
Dhana

Daniel Moth(私の元同僚)-スレッド化/並行性vs並列処理 記事ですべてを説明しています。

引用:

ソフトウェアの複数のコアを利用するには、最終的にスレッドを使用する必要があります。このため、一部の開発者は、マルチスレッドを並列処理と同等の罠に陥っています。それは正確ではありません...シングルコアマシンでマルチスレッドを実行できますが、並列処理はマルチコアマシンでのみ実行できます

簡単なテスト:シングルコアマシンでスレッドを使用していて、それがシナリオに最適である場合、「並列処理」を行わず、マルチスレッドを実行するだけです。

40
RichardOD

並列処理は、複数の命令フローを使用して計算を完了する一般的な手法です。すべての並列技術の重要な側面は、フロー間で通信して最終的な回答を共同で作成することです。

スレッディングは、並列処理の特定の実装です。命令の各フローには、ローカル変数と関数呼び出しの記録を保持する独自のスタックが与えられ、共有メモリによって暗黙的に他のフローと通信します。

1つの例として、1つのスレッドでディスク要求をキューに入れてワーカースレッドに渡すだけで、ディスクとCPUを効率的に並列化することができます。従来のUNIXパイプ方式では、これらを2つの完全なプログラムに分割します。たとえば、コマンドで「cat」とgrepを実行します。

cat /var/log/Xorg.0.log | grep "EE"

スレッド化により、ディスクI/Oをcatプロセスからgrepプロセスにコピーする際の通信コストを削減できると考えられます。

6
jldugger

スレッディングとは、通常、単一のCPUで複数のプロセスが同時に動作していることを指します(実際にはそうではないと思いますが、プロセス間で非常に高速に切り替えます)。

並列処理とは、複数のCPUで複数のプロセスが同時に動作することです。

どちらにも長所と短所があり、オペレーティングシステムで使用されるスケジューラによって大きく異なります。通常、スレッドを作成する計算コストは​​、別のCPUでプロセスを生成するよりもはるかに低くなりますが、「全体」のCPUを自分で持つと、そのプロセスの全体的な速度が向上します。ただし、そのプロセスが別のCPU上の別のプロセスと通信する必要がある場合は、IPC(プロセス間通信))の問題を解決する必要があります。同じCPU上のスレッド。

ほとんどのオペレーティングシステムは複数のCPU /コアを認識しており、それらを使用できますが、これによりスケジューラは通常非常に複雑になります。

VM(仮想マシン))を使用する言語でプログラミングしている場合は、(もしあれば)独自のスケジューラを実装する必要があることに注意してください。Python =たとえば、GILを使用します。これは、そのVMで実行されているすべてが常に同じCPUに留まることを示しています。OSによっては、重いプロセスを別のCPUに移行することができますが、現時点では非常にビジーです。これはもちろん、その間、プロセス全体を一時停止する必要があることを意味します。

DragonFlyBSDのような一部のオペレーティングシステムでは、まったく異なる方法でスケジューリングを行っていますが、現時点では「標準」の方法です。

この答えはあなたがより多くの情報を検索するのに十分なキーワードを与えると思います:-)

6

並列処理とスレッド化に関連する疑問を解消するための最良の答えは次のとおりです。

スレッドはソフトウェア構造です。古いシングルコアプロセッサでも、必要なだけpthreadを開始できます。したがって、マルチスレッドは必ずしも並列である必要はありません。ハードウェアがそれをサポートできる場合にのみ並列です。したがって、複数のコアやハイパースレッディングがある場合、マルチスレッドは並列になります。そして、最近ではほとんどの場合そうです。

同時実行性とは、明確な時間的順序がないアクティビティに関するものです。繰り返しになりますが、ハードウェアがサポートしていれば、並行して実行できます。

したがって、従来のマルチスレッドは、並行性とほぼ同義です。そして、ハードウェアがサポートする場合にのみ、どちらも並列になります。それでも、ハードウェアがサポートするよりも多くのスレッドを開始でき、同時実行性が残ります。

QuoraのVictor Eijkhoutによる回答 から。

3
Iqra.

スレッディングはテクノロジーであり、並列処理は、スレッディングを使用して実装できるパラダイムです(ただし、複数のプロセッサでシングルスレッドを使用して簡単に実行できます)。

3
PaulJWilliams

並行性には2つの異なる種類があります。

  1. スレッド化:CPUは異なるスレッド間を非常に高速に切り替え、並行性の誤りをもたらします。キーポイント:常に1つのスレッドのみが実行されています。 1つのスレッドが実行されているとき、他のスレッドはブロックされます。手続き的に実行するだけでなく、これはどのように役立つのでしょうか。まあ、それを優先キューと考えてください。スレッドをスケジュールできます。 CPUスケジューラは、各スレッドの実行に一定の時間を与え、それらを一時停止し、データを他のスレッドに渡し、後で実行するために異なる優先順位を与えることができます。 相互に対話する即時実行プロセスではないの必需品です。これはサーバーで広く使用されています。数千のクライアントが同時に何かを要求し、後で要求したものを取得できます(手順で実行すると、一度に1つのクライアントしか処理できません)。 哲学:さまざまなことを一緒に実行します。合計時間は短縮されません(1つのクライアントが他のクライアントの合計要求を気にしないため、サーバーのスムーズポイント)。
  2. 並列処理:スレッドは通常、異なるCPUコアで真の同時実行性で並列実行されます。キーポイント:複数のスレッドが常に実行されています。重い計算に役立ちます超長時間実行プロセス。シングルコアマシンのフリートでも同じことが言えます。計算するデータをマシンごとにセクションに分割し、最後にそれらをプールします。異なるマシン/コアは互いに相互作用するのが難しいです。 哲学:より短い時間で1つのことを行う。

ご覧のとおり、まったく異なる種類の問題を解決します。

2

会社としてのCPUとそのワーカーとしてのスレッドと考えると、スレッド化と並列処理をより簡単に理解するのに役立ちます。

会社に多くの労働者がいるように、CPUにも多くのスレッドがあります。

また、複数の会社が存在する可能性があるため、複数のCPUが存在する場合があります。

したがって、ワーカー(スレッド)が会社(CPU)で働く場合、それはthreadingと呼ばれます。

また、2つ以上の会社(CPU)が独立して、または一緒に動作する場合、それはparallelismと呼ばれます。

1
Sonu

「並列処理」をどのように定義しますか?マルチスレッドは、並列プログラム実行の概念の具体的な実装です。

RichardODがリンクしている記事は、具体的なマシンでスレッドが実際に並行して実行されるかどうかに主に関係しているようです。

ただし、あなたの質問では、マルチスレッド化と並列化が反対であるように見えます。複数のスレッドではなく、複数のプロセスを使用するプログラムを意味しているのでしょうか?その場合、違いは次のとおりです。

  • スレッドの作成は、プロセスよりもはるかに安価です。このため、プロセスではなくスレッドを使用すると、Webアプリケーションが大幅に高速化されました。これは「FastCGI」と呼ばれていました。
  • 同じマシン上の複数のスレッドが共有メモリにアクセスできます。これにより、スレッド間の通信がはるかに簡単になりますが、非常に危険でもあります(診断や修正が非常に難しい競合状態などのバグを作成するのは簡単です)。
1

スレッド化は貧乏人の並列性です。

編集:より正確には:

スレッド化は並列処理とは関係がなく、逆もまた同様です。スレッド化とは、一部のプロセスが並行して実行されていると感じさせることです。ただし、これによってプロセスがcomplete ALLになり、全体としてアクションが速くなるわけではありません。

1
Thevs