スレッド化と並列処理の違いは何ですか?
どちらが他よりも有利ですか?
Daniel Moth(私の元同僚)-スレッド化/並行性と並列処理の記事ですべてを説明しています。
引用:
ソフトウェアの複数のコアを利用するには、最終的にスレッドを使用する必要があります。この事実のために、一部の開発者はマルチスレッドを並列処理と同一視するという罠に陥ります。それは正確ではありません...シングルコアマシンでマルチスレッドを使用できますが、マルチコアマシンでのみ並列処理を実行できます
クイックテスト:シングルコアマシンでスレッドを使用していて、シナリオに完全に適している場合は、「並列処理」ではなく、マルチスレッドを実行しているだけです。
スレッド化は通常、単一の CPU で複数のプロセスが同時に動作することを指します (実際にはそうではないと思いますが、それらは非常に高速に切り替わります)。
並列処理とは、複数の CPU で複数のプロセスが同時に動作することです。
オペレーティング システムで使用されるスケジューラに大きく依存するため、どちらにも長所と短所があります。通常、スレッドを作成するための計算コストは、別の CPU でプロセスを生成する場合よりもはるかに低くなりますが、「全体」の CPU を自分用に使用すると、そのプロセスの全体的な速度が向上します。ただし、そのプロセスが別の CPU 上の別のプロセスと通信する必要がある場合は、IPC (プロセス間通信) 問題を解決する必要があります。これは、同じ CPU 上のスレッドを使用する方が効果的に優れているほどのオーバーヘッドになる可能性があります。
ほとんどのオペレーティング システムは複数の CPU/コアを認識しており、それらを使用できますが、これにより通常、スケジューラが非常に複雑になります。
VM (仮想マシン) を使用する言語でプログラミングしている場合は、独自のスケジューラを実装する必要があることに注意してください (実装する場合)。たとえば、Python は GIL を使用します。これは、その VM で実行されているすべてのものが常に同じ CPU 上にあることを示しています。一部の OS は、負荷の高いプロセスを現在それほどビジーではない別の CPU に移行することができますが、もちろん、それを実行している間はプロセス全体を一時停止する必要があります。
DragonFlyBSD のような一部のオペレーティング システムは、スケジューリングに対してまったく異なるアプローチを採用していますが、現時点では「標準」のアプローチです。
この回答は、より多くの情報を検索するのに十分なキーワードを提供すると思います:-)
並列処理は、複数の命令フローを使用して計算を完了する一般的な手法です。すべての並列手法の重要な側面は、フロー間で通信して最終的な回答を共同で作成することです。
スレッド化は、並列処理の特定の実装です。命令の各フローには、ローカル変数と関数呼び出しの記録を保持する独自のスタックが与えられ、共有メモリによって暗黙的に他のフローと通信します。
1 つの例として、1 つのスレッドが単にディスク要求をキューに入れ、それをワーカー スレッドに渡し、ディスクと CPU を効果的に並列化することが考えられます。従来の UNIX パイプ方式では、これらを 2 つの完全なプログラムに分割します。たとえば、コマンドで "cat" と grep を使用します。
cat /var/log/Xorg.0.log | grep "EE"
スレッド化により、ディスク I/O を cat プロセスから grep プロセスにコピーする通信コストを削減できる可能性があります。
スレッド化はテクノロジーであり、並列処理はスレッド化を使用して実装できるパラダイムです(ただし、複数のプロセッサーで単一のスレッドを使用して同じように簡単に実行できます)
スレッディングは貧乏人の並列性です。
編集:より正確に言うと:
スレッディングは並列処理とは何の関係もありませんし、その逆も同様です。スレッド化とは、一部のプロセスが並行して実行されているように感じさせることです。ただし、これによって、すべてのアクションを合計で完了するプロセスが速くなるわけではありません。
これは、並列処理とスレッド化に関する疑問を解消するための最良の答えです。
スレッドはソフトウェア構造です。古いシングル コア プロセッサでも、必要な数の pthread を開始できます。そのため、マルチスレッドは必ずしも並列ではありません。ハードウェアがサポートできる場合にのみ、並列になります。したがって、複数のコアやハイパースレッディングがある場合、マルチスレッディングは並列になります。そして最近では、実際にはほとんどの場合です。
並行性とは、明確な時間的順序がないアクティビティに関するものです。繰り返しになりますが、ハードウェアがサポートしている場合は並行して実行できますが、サポートしていない場合はできません。
そのため、伝統的にマルチスレッドは並行性とほぼ同義です。そして、ハードウェアがサポートしている場合にのみ、両方が並列になります。それでも、ハードウェアがサポートするよりも多くのスレッドを開始でき、並行性が維持されます。
「並列処理」をどのように定義しますか? マルチスレッドは、並列プログラム実行の概念の具体的な実装です。
リンク先の RichardOD の記事は、具体的なマシン上でスレッドが実際に並列実行されるかどうかに主に関心があるようです。
ただし、あなたの質問は、マルチスレッドと並列処理を反対のものと見なしているようです。複数のスレッドではなく、複数のプロセスを使用するプログラムのことでしょうか? その場合、違いは次のとおりです。