並列処理と並行処理は別物だとよく読んでいます。非常に多くの場合、回答者/コメンターは、2つのまったく異なるものであると書いています。しかし、私の見解ではそれらは関連していますが、それについていくつかの説明をお願いします。
たとえば、マルチコアCPUを使用していて、計算をxより小さな計算(たとえば、fork/joinを使用)に分割して実行している場合独自のスレッド、私は両方とも並列計算を実行しているプログラムを持っています(おそらく、いつの時点でも、複数のスレッドが複数のコアで実行されるためです)andは同時実行ですか?
Javaを使用して、UIイベントを処理し、Event Dispatch Threadで再描画し、自分で作成した唯一のスレッドを実行している場合は、同時に実行されるプログラムがあります。 (EDT + GCスレッド+私のメインスレッドなど)しかし、並列ではありません。
私がこれを正しく行っているかどうか、および並列化(「シングルコアですがマルチコア」システムで)が常に並行性を意味するかどうかを知りたいですか?
また、マルチスレッドプログラムはマルチコアCPUで実行されていますが、異なるスレッドが「並列処理」を使用していると見なされるまったく異なる計算を実行しているのでしょうか。
並列計算は、多くの計算が同時に実行される計算の形式であり、大きな問題はしばしば小さな問題に分割でき、それを同時に(「並列に」)解決できるという原則に基づいて動作します。
つまり、並列処理は常に同時実行性を意味します。
また、マルチスレッドのプログラムはマルチコアCPUで実行されていますが、異なるスレッドが「並列処理」を使用していると見なされるまったく異なる計算を実行しているのでしょうか。
いいえ。並列処理の本質は、大きな問題を小さな問題に分割して、小さな部分を同時に解決できることです。ピースは相互に独立しています(少なくともある程度)が、それらは依然としてより大きな問題の一部であり、現在並行して解決されています。
並行性の本質は、いくつかのスレッド(またはプロセス、またはコンピューター)が何かを同時に実行しており、何らかの方法で(必ずしもそうではないが)相互作用していることです。 再びウィキペディア :
並行性は、いくつかの計算が同時に実行され、潜在的に互いに相互作用しているシステムの特性です。
コードは並行にすることはできますが、並列にすることはできません。
シングルコアマシンで複数のスレッドが実行されているとします。このシングルコアマシンは一度に1つのスレッドしか処理しないため、操作の並列処理は行われません。ただし、各スレッドは、OSが複数のスレッドを処理する方法のおかげで、他のすべてのスレッドが同時に実行されていると想定する必要があります。
並列処理とは、単純に多くのタスクを同時に実行することを意味します。一方、並行性とは、多くのプロセス間で絶えず切り替えることにより、カーネルが多くのタスクを実行する能力です。
並列処理を実現するためには、システムに多くのコアがあり、並列処理を効率的に実行できることが重要です。また、単一コアマシンで並列処理を試みると、パフォーマンスに多くの影響が及び、多くのオーバーヘッドが発生します。
たとえば、以前のシステムにはコアが1つしかなかったため、CPUスケジューラはプロセスを絶えず切り替えることで並列処理のような錯覚を起こし、各プロセスの進行を可能にしていました。