同時実行と並列実行という用語の違いは何ですか?私はその違いを理解することができませんでした。
このタグは、2つのプロセスを同時に実行する方法として同時実行性を定義しますが、並列処理はまったく同じもの、つまり、別々のプロセッサで実行される可能性のある別々のスレッドまたはプロセスであると考えました。
また、非同期I / Oのようなものを検討する場合、並行性と並列性のどちらを扱いますか?
同時実行と並列実行という用語の違いは何ですか?私はその違いを理解することができませんでした。
このタグは、2つのプロセスを同時に実行する方法として同時実行性を定義しますが、並列処理はまったく同じもの、つまり、別々のプロセッサで実行される可能性のある別々のスレッドまたはプロセスであると考えました。
また、非同期I / Oのようなものを検討する場合、並行性と並列性のどちらを扱いますか?
回答:
並行性と並列性は、2つの関連する別個の概念です。
並行性とは、本質的に、タスクAとタスクBの両方が互いに独立して発生する必要があり、Aが実行を開始し、Aが完了する前にBが開始することを意味します。
並行性を実現するにはさまざまな方法があります。それらの1つは並列処理です。複数のCPUが異なるタスクを同時に処理します。しかし、それが唯一の方法ではありません。もう1つは、次のように機能するタスクスイッチングによるものです。タスクAは特定のポイントまで機能し、そこで動作しているCPUは停止し、タスクBに切り替わり、しばらくの間動作し、その後タスクAに戻ります。タイムスライスが十分に小さいため、実際にはマルチタスクCPUによってシリアルで処理されている場合でも、両方が並行して実行されているように見える場合があります。
2つの概念は関連していますが、異なっています。
同時実行とは、同じ時間枠内で2つ以上の計算が行われることを意味し、通常、それらの間に何らかの依存関係があります。
並列処理とは、2つ以上の計算が同時に発生することを意味します。
大胆に言えば、並行性は問題を表し(2つのことを一緒に行う必要がある)、並列性はソリューションを表します(2つのプロセッサコアを使用して2つのことを同時に実行します)。
並列処理は同時実行性を実装する1つの方法ですが、それだけではありません。もう1つの一般的なソリューションは、インターリーブ処理(コルーチン)です。両方のタスクをアトミックなステップに分割し、2つのタスクを交互に切り替えます。
非並列同時実行の最もよく知られている例は、JavaScriptの動作方法です。スレッドは1つだけで、非同期コールバックは前のコードチャンクの実行が完了するまで待機する必要があります。これは、記述する関数がアトミックであることを保証するため、知っておくことが重要です。コールバックは、戻るまで中断できません。ただし、「ビジーループ」が機能しないことも意味します。タイムアウトを設定してから起動するまでループすることはできません。ループはタイムアウトコールバックの実行を妨げるためです。
Concurrency means that two or more calculations happen within the same time frame, and there is usually some sort of dependency between them.
が、受け入れられた答えを書いたユーザーは言うConcurrency means, essentially, that task A and task B both need to happen independently of each other
。それでは、結論は何ですか?
この答えは既存の答えよりも正確であり、それらを編集すると本質が変わったと思います。他の人が正しいことを確認できるように、さまざまなソースまたはウィキペディアのページにリンクしようとしました。
並行性:プログラム、アルゴリズム、または問題の単位を可能にするシステムの性質は、最終結果に影響を与えることなく、順序アウトまたは部分的順序で実行される1 2。
これの簡単な例は、連続した追加です。
0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
加算の可換特性により、これらの順序は正確さに影響を与えることなく再配置できます。次の配置は同じ答えになります:
(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) + 5 + 0 = 45
ここでは、合計が10になるペアに番号をグループ化しました。これにより、頭の中で正しい答えを見つけやすくなります。
並列計算:多くの計算またはプロセスの実行が同時に実行される計算のタイプ3 4。したがって、並列計算では、並行性の特性を活用して、プログラム、アルゴリズム、または問題の複数のユニットを同時に実行します。
連続した加算の例を続けると、合計の異なる部分を並行して実行できます。
Execution unit 1: 0 + 1 + 2 + 3 + 4 = 10
Execution unit 2: 5 + 6 + 7 + 8 + 9 = 35
最後に、各ワーカーの結果を合計して取得し10 + 35 = 45
ます。
繰り返しますが、この並列処理は、連続した追加には並行性の特性があるためにのみ可能です。
ただし、並行性は単なる並列処理以上のものによって活用できます。シングルコアシステムでのプリエンプションを検討してください:一定の期間にわたって、システムは複数の実行中のプロセスのいずれも完了せずに進行する場合があります。実際、非同期I / Oの例は、並列性を必要としない並行性の一般的な例です。
混乱
上記は比較的簡単です。辞書の定義が必ずしも上で説明したものと一致しないため、人々は混乱するのではないかと思います。
辞書は「並行性」を発生の事実として定義しますが、コンピューティング用語の定義はプログラム、プロパティ、またはシステムの潜在的なプロパティです。これらは関連しているものの、同じではありません。
個人的な推奨事項
同時実行が保証または予想される場合は「パラレル」という用語を使用し、同時実行が採用されるかどうかが不確実または無関係な場合は「並行」という用語を使用することをお勧めします。
したがって、複数のコアでのジェットエンジンのシミュレーションを並行して説明します。
並行性の例として、Makefileについて説明します。メイクファイルは、各ターゲットの依存関係を示します。ターゲットが他のターゲットに依存している場合、これにより半順序が作成されます。リレーションシップとレシピが包括的かつ正しく定義されると、並行性のプロパティが確立されます。結果に影響を与えずに特定のタスクの順序を再配置できるように、部分的な順序が存在します。繰り返しますが、この並行性は複数のルールを同時に構築するために活用できますが、並行性は、並列性が採用されているかどうかにかかわらず、Makefileのプロパティです。
同時実行は、パラレル実行の一般化された形式です。たとえば、並列プログラムを並行処理と呼ぶこともできますが、逆は当てはまりません。
詳細については、この研究論文「Concurrents of Concurrent Programming」を参照してください。
並列処理は、並行処理のサブセットです。
同時処理は、非同期に発生する2つのタスクを表します。つまり、タスクが実行される順序は事前に決定されていません。実行可能命令をインターリーブすることにより、2つのスレッドを同じプロセッサコアで同時に実行できます。たとえば、スレッド1は10ミリ秒実行され、スレッド2は10ミリ秒実行されます。
並列処理は、複数の命令セットが同時に実行される並行処理の一種です。これは、分散コンピューティングなどの一般的な問題に取り組んでいる複数のシステム、または同じシステム上の複数のコアである可能性があります。
tdammerの声明が近づき、残りは要点以外です。彼は言います:
「大胆に言えば、並行性は問題(2つのことが同時に起こる必要がある)を表し、並行性はソリューション(2つのプロセッサコアを使用して2つのことを同時に実行する)を表します」
単語を分析してみましょう。
現在とは、現在起こっていることを意味します。Conは、反対、反抗、整列しないことを意味します。
平行とは、交差することなく、互いに邪魔されることなく、同じ方向を意味します。
したがって、同時実行性は同じリソースの競合を意味します。並列処理はしません。並列プロセスは同じリソースを使用している可能性がありますが、問題とは見なされず、問題ではありません。並行性では、対処する必要がある問題です。
明らかに、用語は異なる文化で異なる方法で使用されます。
私の理解は次のとおりです。
並列処理は、処理を高速化する方法です。単一のコア、複数のコア、またはGPUで行列乗算を行っても、結果は同じです(または、プログラムが破損します)。プログラムに新しい機能を追加するのではなく、速度を上げるだけです。
並行性とは、連続して実行できなかったことに関するものです。たとえば、次のリクエストを待っている間に、3つのクライアントに3つの異なるWebページを同時に提供します。(これは、昔のように、インターリーブによりある程度シミュレートできます。)並行プログラムの動作は非決定的であることに注意してください。たとえば、3つのクライアントのどれが最初に完全に提供されるかは明確ではありません。かなりの数のテストを実行し、リクエストが完了する順序に関して毎回異なる結果を得ることができます。ランタイムシステムは、a)すべてのクライアントにサービスを提供し、b)妥当な時間内に保証する必要があります。
通常、並列計算の作業馬は、並列処理を認識せず、並列処理を気にしません。多くの場合、並行タスクは、キュー間、同期、ロックメカニズムなど、プロセス間またはスレッド間通信を明示的に使用します。
私の意見では、アプリケーションプログラミングの観点からは、これらの2つの概念に違いはなく、2つの単語を持つことは混乱のために混乱を招きます。マルチコアが不可能だった時代にマルチコア処理をシミュレートするために、スレッドインターリーブがもたらされたと思います。なぜこの時代遅れの考え方に対する言葉があるのですか?
メイソン・ウィーラーとペンギンは同じ答えを与えました。タスクスイッチングまたはマルチコアを備えた1つのコアは同時、厳密にはマルチコア=パラレルです。
私の意見では、これらの2つの用語は1つにまとめる必要があり、「同時」と言わないように努力しています。OSプログラミングレベルでは区別が重要だと思いますが、アプリケーションプログラマーの観点からはそれほど重要ではありません。mapReduce、Spark、MPI、cuda、openCL、およびマルチスレッドc ++を作成しました。ジョブがインターリーブスレッドで実行されているか、複数のコアで実行されているかを停止して考える必要はありません。
たとえば、マルチスレッドc ++を作成するときに、取得するコアの数がわからないことがありますが、ここで説明するように、取得するコアの数を要求する方法がありますhttps://stackoverflow.com/questions/2166425/ how-to-structure-ac-application-to-use-a-multicore-processor。Sparkでは、操作をマップして削減するだけで、jvmがハードウェアレベルでそれらをどのように処理しているかわかりません。GPUで私は思うすべてのスレッドは独自の単純なプロセッサに割り当てられますが、問題が発生する可能性がある場合は常にスレッドを同期します。MPIを使用すると、マシン間の通信が明示的に指定されますが、単一のコア上の複数のマシンで実行される機能をインターリーブし、適切なシングルスレッド機能を介して結果を組み合わせることができます。また、MPIを使用して、それぞれがマルチスレッドを使用する多数のシングルコアマシンを調整するとどうなりますか?どんな違いがあるの?私は何も言わないでしょう。それをすべて「並行」と呼び、それで終わりです。