「同時」実行と「並列」実行の違いは?


107

同時実行と並列実行という用語の違いは何ですか?私はその違いを理解することができませんでした。

このタグは、2つのプロセスを同時に実行する方法として同時実行性を定義しますが、並列処理はまったく同じもの、つまり、別々のプロセッサで実行される可能性のある別々のスレッドまたはプロセスであると考えました。

また、非同期I / Oのようなものを検討する場合、並行性と並列性のどちらを扱いますか?


27
一言で言えば-同時:多くの異なる操作が同時に発生します。並列:同じ操作が一度に発生する小さなビットに分割されます。
-Oded

3
@Oded、私は言葉の意味を理解していますが、その意味を理解するのに苦労しています。具体的な例はありますか?
blz

7
@Oded、私はあなたに本当に同意しません、それらの定義のどこにも(一般的またはプログラミングに適用される)「同時」および「並列」の概念は操作の数または「サイズ」について何も言及しません。
シヴァンドラゴン

2
「小さなビット」と言ったときに@Oded。
アヴナーシャハルカシュタン

2
@Oded:はい、でもこれはあなたとShivanDragonの間の誤解の根源のようです。
アヴナーシャハルカシュタン

回答:


97

並行性と並列性は、2つの関連する別個の概念です。

並行性とは、本質的に、タスクAとタスクBの両方が互いに独立して発生する必要があり、Aが実行を開始し、Aが完了する前にBが開始することを意味します。

並行性を実現するにはさまざまな方法があります。それらの1つは並列処理です。複数のCPUが異なるタスクを同時に処理します。しかし、それが唯一の方法ではありません。もう1つは、次のように機能するタスクスイッチングによるものです。タスクAは特定のポイントまで機能し、そこで動作しているCPUは停止し、タスクBに切り替わり、しばらくの間動作し、その後タスクAに戻ります。タイムスライスが十分に小さいため、実際にはマルチタスクCPUによってシリアルで処理されている場合でも、両方が並行して実行されているように見える場合があります。


4
ケースBは非同期IOの仕組みです。
blz

6
@blz:そうです。また、プリエンプティブマルチタスクの仕組みも同じです。主な違いは、非同期IOでは、プログラムが時間を放棄してCPUに他の何かを処理するように指示するのに対して、プリエンプティブマルチタスクでは、実行中のスレッドが自発的にCPUを十分に放棄しない場合、OS がプリエンプトすることですそれ。
メイソンウィーラー

1
最良の説明は伝承
Konrad

@MasonWheeler:CPUが1つしかない場合、並行処理のみが可能で、並列処理はできません。右?並列処理は、複数のCPUで実現できます。右?そして、それが正しく、CPUが1つしかない場合、Java 8からのストリームは役に立ちません。
アニッシュミッタル

1
最初のいくつかのポイントについて。最後の1つに関しては、Streamsから得られる唯一の利点は並列処理ですか?私はJava開発者ではありませんが、私の印象では、JavaストリームはLINQとほぼ同等であり、表現力と開発の容易さという点で大きなメリットがあります。
メイソンウィーラー

37

2つの概念は関連していますが、異なっています。

同時実行とは、同じ時間枠内で2つ以上の計算が行われることを意味し、通常、それらの間に何らかの依存関係があります。

並列処理とは、2つ以上の計算が同時に発生することを意味します。

大胆に言えば、並行性は問題を表し(2つのことを一緒に行う必要がある)、並列性はソリューションを表します(2つのプロセッサコアを使用して2つのことを同時に実行します)。

並列処理は同時実行性を実装する1つの方法ですが、それだけではありません。もう1つの一般的なソリューションは、インターリーブ処理(コルーチン)です。両方のタスクをアトミックなステップに分割し、2つのタスクを交互に切り替えます。

非並列同時実行の最もよく知られている例は、JavaScriptの動作方法です。スレッドは1つだけで、非同期コールバックは前のコードチャンクの実行が完了するまで待機する必要があります。これは、記述する関数がアトミックであることを保証するため、知っておくことが重要です。コールバックは、戻るまで中断できません。ただし、「ビジーループ」が機能しないことも意味します。タイムアウトを設定してから起動するまでループすることはできません。ループはタイムアウトコールバックの実行を妨げるためです。


8
あなたはそれを言う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。それでは、結論は何ですか?
nbro

JavaScriptのモデルがコンカレントである理由を説明できますか?並行性の定義から、2つ以上の計算が同じ時間枠内で発生するはずです。ただし、JavaScriptでは、単一のキューを使用して計算が順番に行われます。
damluar

4
「同じ時間枠内」とは、必ずしも「同時に」という意味ではなく、それらが発生する全体の時間枠が重複しているということです。これは並行して実現できます(たとえば、それぞれタスクの1つを実行する2つのプロセッサコア)が、実行を完全にシリアル化することによっても実現できます(最初にタスク1を行い、結果を記憶し、次にタスク2を行い、両方を報告します) 、またはチャンクを切り刻んでインターリーブすることによって。後者はJSが行うことです。
-tdammers

9

この答えは既存の答えよりも正確であり、それらを編集すると本質が変わったと思います。他の人が正しいことを確認できるように、さまざまなソースまたはウィキペディアのページにリンクしようとしました。


並行性:プログラム、アルゴリズム、または問題の単位を可能にするシステムの性質は、最終結果に影響を与えることなく、順序アウトまたは部分的順序で実行される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の例は、並列性を必要としない並行性の一般的な例です。


混乱

上記は比較的簡単です。辞書の定義が必ずしも上で説明したものと一致しないため、人々は混乱するのではないかと思います。

  • 並行:同時または並行して発生または存在する5
  • 並行性:二つ以上の事象や状況が起こったり、同時に既存の事実Googleで検索から:「定義:同時実行性」

辞書は「並行性」を発生の事実として定義しますが、コンピューティング用語の定義はプログラム、プロパティ、またはシステムの潜在的なプロパティです。これらは関連しているものの、同じではありません。


個人的な推奨事項

同時実行が保証または予想される場合は「パラレル」という用語を使用し、同時実行が採用されるかどうかが不確実または無関係な場合は「並行」という用語を使用することをお勧めします。

したがって、複数のコアでのジェットエンジンのシミュレーションを並行して説明します。

並行性の例として、Makefileについて説明します。メイクファイルは、各ターゲットの依存関係を示します。ターゲットが他のターゲットに依存している場合、これにより半順序が作成されます。リレーションシップとレシピが包括的かつ正しく定義されると、並行性のプロパティが確立されます。結果に影響を与えずに特定のタスクの順序を再配置できるように、部分的な順序が存在します。繰り返しますが、この並行性は複数のルールを同時に構築するために活用できますが、並行性は、並列性が採用されているかどうかにかかわらず、Makefileのプロパティです。


6

同時実行は、パラレル実行の一般化された形式です。たとえば、並列プログラムを並行処理と呼ぶこともできますが、逆は当てはまりません。

  1. シングルプロセッサ(スケジューラによって管理される複数のスレッド)で同時実行が可能
  2. 並列実行は、単一のプロセッサではなく複数のプロセッサで可能です。(プロセッサごとに1プロセス)

詳細については、この研究論文「Concurrents of Concurrent Programming」を参照してください。


1
「並列実行は単一のプロセッサではなく複数のプロセッサで可能です」-もちろん、プロセッサ内に並列実行パスがある場合を除きます。たとえば、命令レベル並列処理(別名「スーパースカラ」アーキテクチャ、たとえばPentium、ARM Cortex、および他のほとんどのハイエンドプロセッサ)、およびデータ並列アーキテクチャとも呼ばれる単一命令複数データ(MMX / SSE / etcなど)。データフロープロセッサなどのエキゾチックな配置は言うまでもありません。
ジュール

3

並列処理は、並行処理のサブセットです。

同時処理は、非同期に発生する2つのタスクを表します。つまり、タスクが実行される順序は事前に決定されていません。実行可能命令をインターリーブすることにより、2つのスレッドを同じプロセッサコアで同時に実行できます。たとえば、スレッド1は10ミリ秒実行され、スレッド2は10ミリ秒実行されます。

並列処理は、複数の命令セットが同時に実行される並行処理の一種です。これは、分散コンピューティングなどの一般的な問題に取り組んでいる複数のシステム、または同じシステム上の複数のコアである可能性があります。


0

tdammerの声明が近づき、残りは要点以外です。彼は言い​​ます:

「大胆に言えば、並行性は問題(2つのことが同時に起こる必要がある)を表し、並行性はソリューション(2つのプロセッサコアを使用して2つのことを同時に実行する)を表します」

単語を分析してみましょう。

現在とは、現在起こっていることを意味します。Conは、反対、反抗、整列しないことを意味します。

平行とは、交差することなく、互いに邪魔されることなく、同じ方向を意味します。

したがって、同時実行性は同じリソースの競合を意味します。並列処理はしません。並列プロセスは同じリソースを使用している可能性がありますが、問題とは見なされず、問題ではありません。並行性では、対処する必要がある問題です。


「現在とは、現在起こっていること、実際にあること、現時点で関係があることを意味します。コンは、反対すること、対抗すること、一致しないことを意味します。」-引用が必要です。私はこれらの声明の両方を強く疑います。「現在は、」ここに英語で述べた意味を持つことができ、それは言葉で使用される意味は、「同時」ではありませんが
ハルク

1
ラテン語からのコンカレントの翻訳は「一緒に実行する」ことだと思います。接頭辞「CON」は、多くの場合、意味一緒に(一緒に呼吸する)陰謀のように、結果(結果一緒に、または以下の)結論(まとめて閉じる)などをそれは何かが反対の意味を持つことができ、言語の迷惑な面で、制裁は私のお気に入りの一例です。

@no comprendeこの場合(同時)一緒に実行するという意味は、より適切に思えます。同時進行性がないので...オランダ語では、同時発生は競合を意味する名詞です。クーラントは一般的で、あなたの周りを移動します。新聞でもあります。現在アクティブなもの。「Rekening courant」は実行中のアカウントです。並行性はcon(!)衝突を意味すると感じます。同じリソースをめぐる戦い。同じスペースで実行しています。おそらくオランダ語の意味(競合他社)が原因です。
マーティンマート

ダイクストラは何と言いますか?

-1

明らかに、用語は異なる文化で異なる​​方法で使用されます。

私の理解は次のとおりです。

並列処理は、処理を高速化する方法です。単一のコア、複数のコア、またはGPUで行列乗算を行っても、結果は同じです(または、プログラムが破損します)。プログラムに新しい機能を追加するのではなく、速度を上げるだけです。

並行性とは、連続して実行できなかったことに関するものです。たとえば、次のリクエストを待っている間に、3つのクライアントに3つの異なるWebページを同時に提供します。(これは、昔のように、インターリーブによりある程度シミュレートできます。)並行プログラムの動作は非決定的であることに注意してください。たとえば、3つのクライアントのどれが最初に完全に提供されるかは明確ではありません。かなりの数のテストを実行し、リクエストが完了する順序に関して毎回異なる結果を得ることができます。ランタイムシステムは、a)すべてのクライアントにサービスを提供し、b)妥当な時間内に保証する必要があります。

通常、並列計算の作業馬は、並列処理を認識せず、並列処理を気にしません。多くの場合、並行タスクは、キュー間、同期、ロックメカニズムなど、プロセス間またはスレッド間通信を明示的に使用します。


-1

私の意見では、アプリケーションプログラミングの観点からは、これらの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を使用して、それぞれがマルチスレッドを使用する多数のシングルコアマシンを調整するとどうなりますか?どんな違いがあるの?私は何も言わないでしょう。それをすべて「並行」と呼び、それで終わりです。


2
区別は今日でも関連しています。ハードウェアが持つCPUコアの数までしか並列化できませんが、多くのプログラムでは、ハードウェアが持つコアの数をはるかに超える数百の同時計算が同時に発生します。この区別を理解しないと、プログラマーは、並列化されたプログラムがシングルスレッドバージョン(または少数のスレッド)よりも低速で実行される理由を理解できなくなる可能性があります。
ライライアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.