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