web-dev-qa-db-ja.com

並行性と並列性の違いは何ですか?

並行性と並列性の違いは何ですか?

例は大歓迎です。

873
StackUnderflow

Concurrencyは、複数のタスクが重複した期間内に開始、実行、および完了できる場合です。必ずしも両方が同じ瞬間に実行されるという意味ではありません。たとえば、シングルコアマシンではマルチタスク)です。

Parallelismは、タスク文字通り/たとえばマルチコアプロセッサ上で同時に実行される場合)です。


引用符 - Sunのマルチスレッドのプログラミングガイド

  • 並行性:少なくとも2つのスレッドが進行しているときに存在する条件。仮想スライスの形式としてタイムスライスを含むことができる、より一般化された形式の並列処理。

  • 並列処理:少なくとも2つのスレッドが同時に実行されているときに発生する条件。

1071
RichieHindle

混乱が存在する理由

これらの両方の単語の辞書の意味がほぼ同じであるため、混乱が存在します。

  • Concurrent:既存、発生、または同時に行われた(dictionary.com)
  • Parallel:非常によく似ており、しばしば同時に起こります(merriam webster)。

しかし、コンピューターサイエンスとプログラミングでの使用方法はまったく異なります。これが私の解釈です。

  • 同時実行性:割り込み可能性
  • 平行度:独立性

では、上記の定義はどういう意味ですか?

現実世界のアナロジーで明らかにします。 1日で2つの非常に重要なタスクを完了する必要があるとします。

  1. パスポートを取得する
  2. プレゼンテーションを完成させる

問題は、タスク1では、非常に官僚的な役所に行く必要があり、パスポートを取得するために4時間並んで待機することです。一方、タスク2はオフィスで必要であり、重要なタスクです。両方とも特定の日に終了する必要があります。

ケース1:順次実行

通常、パスポートオフィスに2時間運転し、列に4時間待機し、タスクを完了し、2時間戻り、家に帰り、さらに5時間起きてプレゼンテーションを完了します。

ケース2:同時実行

しかし、あなたは賢いです。あなたは先に計画します。ラップトップを持って行き、列に並んで待っている間にプレゼンテーションの作業を始めます。この方法では、家に戻ったら、5時間ではなく1時間余分に作業するだけです。

この場合、両方のタスクは、ごく一部で行われます。行列で待っている間にパスポートタスクを中断し、プレゼンテーションに取り組みました。番号が呼び出されたときに、プレゼンテーションタスクを中断し、パスポートタスクに切り替えました。時間の節約は、両方のタスクの中断可能性により本質的に可能でした。

並行性、IMOは、 _ acid の「分離」プロパティとして理解できます。サブトランザクションを各インターリーブ方式で実行でき、最終結果が2つのタスクが連続して実行された場合と同じ場合、2つのデータベーストランザクションは分離されていると見なされます。パスポートとプレゼンテーションの両方のタスクで、あなたが唯一の執行者であることを忘れないでください。

ケース3:並列実行

今、あなたはとても頭がいいので、明らかにあなたはより高位であり、あなたはアシスタントを持っています。したがって、パスポートタスクを開始するために出発する前に、彼に電話してプレゼンテーションの最初のドラフトを準備するように伝えます。 1日を過ごしてパスポートのタスクを完了し、戻ってきてメールを見て、プレゼンテーションのドラフトを見つけます。彼は非常に堅実な仕事をしており、さらに2時間でいくつかの編集を行い、最終決定しました。

今、あなたのアシスタントはあなたと同じくらい賢いので、彼はそれに取り組むことができました独立して、常にあなたに説明を求める必要なく。したがって、タスクの独立性により、それらは2つの異なる実行者によって同時に実行されました。

- まだ私と一緒に?よし...

ケース4:同時だが並列ではない

あなたがパスで待つ必要があるパスポートタスクを覚えていますか?それはyourパスポートであるため、アシスタントは並んで待つことはできません。したがって、パスポートタスクにはinterruptability(ラインで待機中に停止し、後で番号が呼び出されたときに再開できます)がありませんが、independentability(アシスタントはできません)あなたの代わりに待ってください)。

ケース5:並行だが同時ではない

役所に敷地に入るためのセキュリティチェックがあるとします。ここでは、すべての電子デバイスを取り外して役員に提出する必要があり、タスクを完了した後にのみデバイスが返却されます。

この場合、パスポートタスクはindependentableでもinterruptibleでもありません。行列に並んでいる場合でも、必要な機器がないため、他の作業を行うことはできません。

同様に、プレゼンテーションは本質的に非常に数学的であるため、少なくとも5時間は100%の集中力が必要であるとします。ラップトップを持っていたとしても、パスポートタスクの順番を待っている間はできません。

この場合、プレゼンテーションタスクはindependentable(あなたまたはアシスタントは5時間の集中的な労力を費やすことができます)ですが、interruptibleではありません。

ケース6:同時実行および並列実行

ここで、プレゼンテーションにアシスタントを割り当てることに加えて、ラップトップを携帯してパスポートタスクに持ち込むと言います。列に並んで待っていると、アシスタントが共有デッキの最初の10個のスライドを作成したことがわかります。彼の作品にいくつかの修正を加えたコメントを送信します。後で、家に帰ったら、ドラフトを完成させるのに2時間かかる代わりに、わずか15分で済みます。

これは、プレゼンテーションタスクに独立性(どちらかができる)と割り込み可能性(停止して後で再開できる)があるために可能になりました。 bothタスクを並行して実行し、プレゼンテーションタスクを並行して実行しました。

過度に官僚的であることに加えて、役所が腐敗しているとしましょう。したがって、IDを表示して入力し、番号が呼び出されるのを待って列に並ぶことができます。あなた自身。

この場合、パスポートとプレゼンテーションの両方のタスクを並行して並行して実行できます。あなたはこっそりすることができ、あなたの位置はあなたのアシスタントによって保持されます。これで、両方がプレゼンテーションなどに取り組むことができます。


コンピュータサイエンスに戻る

コンピューティングの世界では、これらの各ケースに典型的なシナリオの例を以下に示します。

  • ケース1:割り込み処理。
  • ケース2:プロセッサが1つしかないが、すべての実行タスクにI/Oによる待ち時間がある場合。
  • ケース3:多くの場合、map-reduceまたはhadoopクラスターについて話しているときに見られます。
  • ケース4:ケース4はまれだと思います。タスクが並行ではなく並行ではないことはまれです。しかし、それはcould起こります。たとえば、タスクがプロセッサ1のみを介してアクセスできる特別な計算チップへのアクセスを必要とするとします。したがって、プロセッサー2がフリーで、プロセッサー1が他のタスクを実行している場合でも、特別な計算タスクはプロセッサー2で続行できません。
  • ケース5:もまれですが、ケース4ほどまれではありません。非並行コードは、ミューテックスによって保護される重要な領域になる可能性があります。開始されると、must完了するまで実行されます。ただし、2つの異なるプロセッサで2つの異なる重要な領域が同時に進行する可能性があります。
  • ケース6:IMO、並列または並行プログラミングに関するほとんどの議論は基本的にケース6について述べています。これは並行実行と並行実行の両方の組み合わせです。

並行性と移動

Rob Pikeが同時実行性の方が優れていると言っている理由がわかったら、その理由を理解する必要があります。ファイル読み取り、ネットワークダウンロードなどの外部操作を待機する複数の待機期間がある、本当に長いタスクがあります。彼の講演では、「待っている間に何か役に立つことができるように、この長いシーケンシャルタスクを分割するだけ」と言っているだけです。だから、彼はさまざまなホリネズミを持つさまざまな組織について語っています。

Goの強みは、goキーワードとチャネルを使用してこのブレークを非常に簡単にすることです。また、これらのゴルーチンをスケジュールするためのランタイムには、優れた基礎的なサポートがあります。

しかし、本質的に、並行性は並列性よりも優れていますか?

リンゴはオレンジより優れていますか?

397
Methos

私はRob Pikeの話が好きです:並行性は並列性ではありません(それが良いです) (スライド)(talk)

Robは通常Goについて話していて、通常並行性と並列性の問題を視覚的で直感的な説明で述べています。これが簡単な要約です。

タスク: 古くなった言語のマニュアルを山ほど燃やしてみよう!一つずつ!

Task

同時実行性: タスクの多くの同時分解があります。一例です。

Gophers

並列処理: 少なくとも2つのgopherが同時に動作しているかいないかにかかわらず、前の設定が並行して行われます。

225
asfer

他の人が言ったことに追加するには:

並行性は、ジャグラーが多くのボールをジャグリングするようなものです。それがどのように見えるかに関係なく、ジャグラーは一度に一人のボールを一度に捕らえる/投げるだけです。並列処理は、複数のジャグラーが同時にボールをジャグリングすることです。

130
Thomas T

2つのスレッドを持つプログラムがあるとしましょう。プログラムは2つの方法で実行できます。

Concurrency                 Concurrency + parallelism
(Single-Core CPU)           (Multi-Core CPU)
 ___                         ___ ___
|th1|                       |th1|th2|
|   |                       |   |___|
|___|___                    |   |___
    |th2|                   |___|th2|
 ___|___|                    ___|___|
|th1|                       |th1|
|___|___                    |   |___
    |th2|                   |   |th2|

どちらの場合も、複数のスレッドが実行されているという単なる事実から、並行性があります。

このプログラムを単一のCPUコアを搭載したコンピュータで実行した場合、OSは2つのスレッドを切り替えて、一度に1つのスレッドを実行できます。

マルチコアCPUを搭載したコンピュータでこのプログラムを実行した場合、2つのスレッドを parallel - side by sideで同時に実行できます。

98
Pithikos

並行性: 単一のプロセッサで複数の問題が解決された場合。 alt text

並列処理: 1つの問題が複数のプロセッサによって解決される場合。

alt text

41
Rajendra Uppal

私はおもしろくてわかりやすい例で説明しようと思います。 :)

Assume _組織は、10人のプレーヤー(同等のチェスプレイスキルを持つ _)がプロのチャンピオン _チェスプレーヤーに挑戦するチェストーナメントを開催します。そしてチェスは1:1のゲームなので、オーガナイザーはイベント全体をできるだけ早く終えることができるように10のゲームを時間効率的な方法で行わなければなりません。

うまくいけば、次のシナリオでこれら10のゲームを実行する複数の方法を簡単に説明します。

1)SERIAL - プロが各人と一つずつ遊んで、すなわち一人の人と一緒にゲームを開始して終了し、それから次の人と一緒に次のゲームを開始すると言うことができる。言い換えれば、彼らは順番にゲームを行うことにしました。そのため、1ゲームが完了するのに10分かかる場合、10ゲームは100分かかります。また、あるゲームから別のゲームへの移行に6秒かかると仮定します。10ゲームの場合は54秒(約1分)になります。

そのため、イベント全体は101分で完了します(WORST APPROACH

2)CONCURRENT - プロが自分のターンをプレイして次のプレーヤーに移動するので、10人のプレーヤー全員が同時にプレーしているが、プロのプレーヤーは同時に2人のプレーヤーと一緒にいない次の人へ。今度はプロプレーヤーが自分のターンをプレイするのに6秒かかるし、プロプレーヤーの2人のプレーヤーの移行時間が6秒であると仮定すると、最初のプレーヤーに戻るまでの総移行時間は1分(10×6秒)になります。そのため、彼が最初のイベントに参加した人に戻るまでに、2分が経過しています(10xtime_per_turn_by_champion + 10xtransition_time = 2分)

すべてのプレイヤーが自分のターンを完了するのに45秒かかると仮定すると、SERIALイベントからの1ゲームあたりの10分に基づいています。ゲームが終了するまでのラウンド数は600 /(45 + 6)= 11ラウンド(約)

そのため、イベント全体は11xtime_per_turn_by_player _&_ champion + 11xtransition_time_across_10_players = 11x51 + 11x60秒= 561 + 660 = 1221秒= 20.35分でほぼ完了します。

101分から20.35分の改善を見てください(BETTER APPROACH

3)PARALLEL - 主催者が追加の資金を得て、したがって2人のプロチャンピオンプレーヤー(両方とも同等の能力を持つ)を招待し、同じ10人のプレーヤー(挑戦者)を2人に分けた各5のグループと2つのチャンピオンにそれらを割り当てたすなわち各グループ。現在、イベントはこれら2つのセットで並行して進行しています。つまり、少なくとも2人のプレーヤー(各グループに1人)がそれぞれのグループの2人のプロのプレーヤーと対戦しています。

ただし、グループ内ではプロのプレーヤーは一度に1人ずつ(つまり順次)プレーヤーを連れて行くので、計算を行わなくてもイベント全体が約101/2 = 50.5分で完了することが容易に推測できます。

101分から50.5分までの改善を見てください(GOOD APPROACH

4)CONCURRENT + PARALLEL - 上記のシナリオでは、2人のチャンピオンプレーヤーがそれぞれのグループの5人のプレーヤーと同時にプレーする(2点目を読む)としましょう。同時に実行されているグループ。

したがって、1つのグループのゲームは11xtime_per_turn_by_player _&_ champion + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930秒= 15.5分(およそ)で完了します

そのため、全体のイベント(2つのそのような並行実行グループを含む)は15.5分でおよそ完了します

101分から15.5分に改善を見てください(BEST APPROACH

上のシナリオで注: _あなたが10人の類似した仕事と2人のプロのプレーヤーを2つのCPUコアと交換するならば、そしてまた以下の順序は本当のままでしょう:

シリアル>パラレル>コンカレント>コンカ​​レント+パラレル

(注:この順序はジョブの相互依存関係、通信の必要条件(b/w)ジョブ、および移行オーバーヘッド(白黒)ジョブに大きく依存するため、この順序は他のシナリオでは変更される可能性があります。

31
sactiw

簡潔さ:リソースを共有する可能性がある複数の実行フロー

例:2つのスレッドがI/Oポートを競合しています。

パラレリズム:問題を複数の同じような塊に分割する。

例:ファイルの半分ごとに2つのプロセスを実行して大きなファイルを解析します。

28
Mihai Toader

簡単な例:

同時である:「1台のATMマシンにアクセスする2つのキュー」

平行は「2つの待ち行列と2つのATM機」です。

25
Saurabh Pakhare

彼らはさまざまな問題を解決します。並行性は、不足しているCPUリソースと多くのタスクを抱えるという問題を解決します。そのため、希少なリソースで時間を共有するために、コードを介してスレッドまたは独立した実行パスを作成します。最近まで、CPUの可用性のために並行性が議論の中心になっていました。

並列処理は、十分なタスクと適切なタスク(正しく分割できるもの)を見つけて、それらを豊富なCPUリソースに分散させるという問題を解決します。並列処理は常に当たり前のことですが、マルチコアプロセッサは非常に安価であるため、最先端を行くようになりました。

24
JP Alioto

ビデオチュートリアルを見て、新しいプログラミング言語を学ぶことを想像してみてください。あなたはビデオを一時停止し、コードで言われたことを適用し、そして見続ける必要がある。 それは並行性です。

今、あなたはプロのプログラマーです。コーディングしながら、落ち着いた音楽を聴くのも楽しいでしょう。 それは並列性です。

楽しい。

14
Ramy Mohamed

並行プログラミング実行には、非並行並行プログラミングと並行並行プログラミング(並列処理とも呼ばれる)の2種類があります。

主な違いは、人間の目には、非並列並行処理のスレッドは同時に実行されているように見えますが、実際にはそうではないということです。非並列同時実行性では、スレッドは急速に切り替わり、タイムスライスによってプロセッサを使用します。並列処理では複数のプロセッサを使用できますが、複数のスレッドを異なるプロセッサ上で同時に実行できます。 enter image description here

参照: プログラミング言語における並行性の紹介

10
Apurva Thorat

サーバーがキュー内の最初のジョブしか処理できないキューを処理すると考えてください。

1台のサーバー、1つのジョブキュー(5つのジョブを含む) - >並行処理なし、並列処理なし(1つのジョブのみが完了まで処理され、キュー内の次のジョブは処理済みジョブが完了するまで待機する必要がありそれを修理する)

1つのサーバー、2つ以上の異なるキュー(キューごとに5つのジョブを含む) - >並行性(サーバーはキュー内のすべての1番目のジョブと均等または重み付けで時間を共有しているため)仕事をしています。

2台以上のサーバー、1つのQueue - > parallelism(2つのジョブが同時に行われます)が並行性はありません(サーバーは時間を共有していません。3番目のジョブはいずれかのサーバーが完了するまで待たなければなりません)。

2つ以上のサーバー、2つ以上の異なるキュー - >並行性と並列処理

言い換えれば、並行性は仕事を完了するための時間を共有している、それは仕事を完了するために同じ時間がかかるかもしれませんが、少なくともそれは早く始められます。重要なことは、仕事をより小さな仕事にスライスすることができ、それによってインタリーブが可能になることです。

並列処理は、並列に実行されるCPU、サーバー、人などの数が増えることで実現されます。

リソースが共有されている場合、純粋な並列処理は実現できませんが、これが並行性が最も実用的な用途であり、そのリソースを必要としない別の仕事を引き受ける場所です。

9
Rahul

並行性 =>共有リソースと重複する期間に複数のタスクが実行される場合(リソース使用率を最大化する可能性がある)。

並列 =>単一のタスクが同時に実行できる複数の単純な独立したサブタスクに分割されている場合。

8
MBK

私はここでいくつかの一般的な答えと少し矛盾する答えを提供するつもりです。私の意見では、並行性は並列処理を含む一般的な用語です。 並行性 個別のタスクまたは作業単位が時間的に重複する状況に適用されます。 並列処理 は、別々の作業単位が同じ物理時間に評価/実行される状況に特に適用されます。並列処理の存在意義は、複数の物理コンピューティングリソースから恩恵を受けることができるソフトウェアを高速化しています。並行性に適合するもう1つの主要な概念は対話性です。 対話性 は、タスクの重複が外界から観察可能な場合に適用されます。双方向性の存在意義は、ユーザー、ネットワークピア、ハードウェア周辺機器などの実社会のエンティティに反応するソフトウェアを作ることです。

並列性と対話性は、ほぼ完全に独立した並行性の側面です。特定のプロジェクトでは、開発者はどちらか一方、両方とも気にする必要はありません。それらが混同される傾向があるのは、スレッドという嫌悪が両方を実行するための合理的に便利なプリミティブを与えるからです。

並列処理についてもう少し詳しく

並列性は、非常に小さいスケール(例えば、プロセッサにおける命令レベルの並列処理)、中程度のスケール(例えば、マルチコアプロセッサ)、および大きいスケール(例えば、高性能コンピューティングクラスタ)で存在する。マルチコアプロセッサの増加により、ソフトウェア開発者がより多くのスレッドレベルの並列処理を公開することへの圧力が近年高まっています。並列処理は、 依存関係 の概念と密接に関係しています。依存関係によって、並列処理を達成できる範囲が制限されます。一方が他方に依存している場合、2つのタスクを並行して実行することはできません(推測を無視)。

プログラマが並列処理を表現するために使用するパターンやフレームワークは多数あります。パイプライン、タスクプール、データ構造に対する集約演算(「並列配列」)です。

対話性についてもう少し詳しく

対話性を行うための最も基本的かつ一般的な方法は、イベント(すなわち、イベントループとハンドラ/コールバック)を使用することです。簡単な仕事のためにイベントは素晴らしいです。イベントを使ってより複雑なタスクを実行しようとすると、スタックリッピングが発生します(別名コールバック地獄、別名コントロールの反転)。イベントにうんざりしたら、ジェネレータ、コルーチン(Async/Await)、または協調的スレッドなど、もっとエキゾチックなことを試すことができます。

信頼性の高いソフトウェアが大好きな場合は、対話性が求められる場合はスレッドを使用しないでください。

頭痛の種

私は、Rob Pikeの「並行性は並列性ではなく、それが優れている」というスローガンを嫌います。並行性は、並列性よりも良くも悪くもありません。並行性には、より良い/悪い方法で並列処理と比較できない対話性が含まれます。 「制御フローはデータより優れている」と言っているようなものです。

7
Ben Ylvisaker

電子機器ではserialおよびparallelは静的トポロジのタイプを表し、回路の実際の動作。並行性がない場合、-並列性は決定論的です

動的な時間関連現象を説明するために、用語sequentialおよびconcurrent。たとえば、特定のシーケンスのタスク(レシピなど)を介して特定の結果を取得できます。私たちが誰かと話しているとき、私たちは一連の単語を作り出しています。ただし、実際には他の多くのプロセスが同じ瞬間に発生するため、特定のアクションの実際の結果にconcurが発生します。多くの人が同時に話している場合、同時の会話がシーケンスに干渉する可能性がありますが、この干渉の結果は事前にはわかりません。 同時実行により不確定性が導入されます

シリアル/パラレルおよびシーケンシャル/コンカレントの特性評価は直交しています。この例はデジタル通信です。 シリアルアダプターでは、デジタルメッセージは一時的に(つまりsequentially)同じ通信回線(例:1本のワイヤ)に沿って配信されます。 パラレルアダプタでは、これはパラレル通信回線(例:多くのワイヤ)でも分割され、受信側で再構築されます。

9人の子供がいるゲームをイメージしてみましょう。それらをチェーンとして配置し、最初にメッセージを送信し、最後にメッセージを受信すると、シリアル通信になります。より多くの単語がメッセージを構成し、一連の通信単位で構成されます。

I like ice-cream so much. > X > X > X > X > X > X > X > X > X > ....

これはシーケンシャルプロセスシリアルインフラストラクチャで再現されています。

ここで、子供を3人のグループに分割することを想像してみましょう。フレーズを3つの部分に分割し、最初の部分を左側の行の子に、2番目の部分を中央の行の子に、などとします。

I like ice-cream so much. > I like    > X > X > X > .... > ....
                          > ice-cream > X > X > X > ....
                          > so much   > X > X > X > ....

これは順次プロセス並列インフラストラクチャ(まだ部分的にシリアル化されていますが)で再現されています。

どちらの場合も、子供同士の完全なコミュニケーションがあると仮定すると、結果は事前にdeterminedになります。

あなたと同じ時間に最初の子供と話す他の人がいる場合、concurrent processesになります。どのプロセスがインフラストラクチャによって考慮されるかはわかりません。そのため、最終結果は事前にnon-determinedです。

6
s1l3n0

並列処理 は、multiple cores per CPUまたはmultiple CPUs (on a single motherboard)上のプロセスの同時実行です。

同時実行性 並列処理 single core CPU上で スケジューリングアルゴリズム を使用することで達成されます。これはCPUの時間を分割します(タイムスライス)。プロセスは インターリーブ です。

単位:

  • 1つのCPUに1つまたは複数のコア (ほとんどすべての現代のプロセッサ)
  • マザーボード上の1つまたは複数のCPU (古い学校のサーバーだと思う)
  • 1アプリケーションは1プログラムです (Chromeブラウザだと思います)
  • 1つのプログラムは1つまたは複数のプロセスを持つことができます (Chromeブラウザの各タブはプロセスであると考えてください)
  • 1プロセスは1プログラムから1つまたは複数のスレッドを持つことができます (1つのスレッドでYouTubeの動画を再生するChromeタブ、コメントセクション用に生成された別のスレッド、ユーザーログイン情報用の別のスレッド)
  • したがって、1つのプログラムが1つまたは複数の実行スレッドを持つことができます。
  • 1プロセスはthread(s)+allocated memory resources by OS (ヒープ、レジスタ、スタック、クラスメモリ)
6
nabster

並行性は、一般化された形式の並列処理です。例えば、並列プログラムは並行して呼び出すこともできますが、その逆は当てはまりません。

  1. 単一プロセッサ(スケジューラまたはスレッドプールによって管理される複数のスレッド)で同時実行が可能

  2. 並列実行は単一プロセッサ上では不可能であり、複数プロセッサ上では不可能である。 (1プロセッサあたり1プロセス)

  3. 分散コンピューティングも関連トピックであり、コンカレントコンピューティングとも呼ばれますが、並列処理のようにその逆は当てはまりません。

詳細はこちらの論文を読んでください 並行プログラミングの概念

5
user4774371

私は他の答えからこのグラフィカルな表現が本当に好きだった - 私はそれが上記の答えの多くよりはるかに良い質問に答えると思う

並列処理と並行処理 2つのスレッドが並行して実行されている場合、それらは両方同時に実行されています。たとえば、AとBの2つのスレッドがある場合、それらの並列実行は次のようになります。

CPU 1:A ------------------------->

CPU 2:B ------------------------->

2つのスレッドが同時に実行されていると、それらの実行はオーバーラップします。オーバーラップは2つの方法のうちの1つで起こり得る:スレッドが同時に(すなわち上記のように並行して)実行されているか、またはそれらの実行がプロセッサ上でインターリーブされているかのように。

CPU 1:A -----------> B ----------> A -----------> B -------- - >

したがって、私たちの目的のためには、並列処理は並行性の特別な場合と考えることができます。

出典: もう一つの答えはここ

それが役立つことを願っています。

4
HopeKing

私はポール・ブッチャーの answer がこの質問に本当に好きです(彼は7週間の7つの並行性モデル)のライターです):

よく混同されますが、並列性と並行性は別のものです。 並行性は問題領域の側面です—コードは複数の同時(またはほぼ同時)イベントを処理する必要があります対照的に、平行度はソリューションドメインの側面です—さまざまな部分を処理してプログラムをより速く実行したい並行性に適用可能なアプローチ、並行性に適用可能なアプローチ、両方に適用可能なアプローチがあります。直面しているものを理解し、仕事に適したツールを選択します。

4
dangom

並行プログラミングは、重複しているように見える操作を考慮し、主に非決定論的な制御フローによって生じる複雑さに関係しています。並行プログラムに関連した量的コストは通常​​、スループットと待ち時間の両方です。並行プログラムはしばしばIOに束縛されますが、必ずしもそうとは限りません。並行ガベージコレクタは完全にCPU上にあります。並行プログラムの教育的な例は、Webクローラーです。このプログラムはWebページの要求を開始し、ダウンロードの結果が利用可能になると同時に応答を受け取り、すでに訪問された一連のページを蓄積します。プログラムが実行されるたびに応答が必ずしも同じ順序で受信されるとは限らないため、制御フローは非決定的です。この特性は並行プログラムをデバッグすることを非常に難しくすることができます。いくつかのアプリケーションは基本的に並行しています。 Webサーバーはクライアント接続を同時に処理する必要があります。アーランはおそらく、非常に並行プログラミングのための最も有望な今後の言語です。

並列プログラミングは、スループットを向上させるという特定の目的のために重複している操作に関するものです。並行プログラミングの難しさは、制御フローを決定論的にすることによって回避されます。通常、プログラムは並列に実行される一連の子タスクを生成し、親タスクはすべてのサブタスクが終了した後にのみ続行されます。これにより、並列プログラムのデバッグがはるかに簡単になります。並列プログラミングの難しい部分は、粒度や通信などの問題に関するパフォーマンスの最適化です。後者は、あるキャッシュから別のキャッシュにデータを転送することに関連してかなりのコストがかかるので、マルチコアの文脈ではまだ問題です。密行列 - 行列乗算は並列プログラミングの教育的な例であり、Straasenの分割統治アルゴリズムを使用し、副問題を並列に攻撃することで効率的に解決できます。 Cilkはおそらく、(マルチコアを含む)共有メモリコンピュータ上での高性能並列プログラミングのための最も有望な言語です。

私の答えからコピーした: https://stackoverflow.com/a/3982782

3
Jon Harrop

「並行性」とは、 進行中 のことが複数ある場合です。

「並列処理」とは、並行して進行中のものが であると同時に の場合です。


並列処理なしの同時実行の例

  • シングルコア上のマルチスレッド.
  • Win32メッセージキュー内の複数のメッセージ.
  • MARS 接続に複数のSqlDataReaderがあります。
  • ブラウザタブに複数のJavaScript promises があります。

ただし、並行性と並列性の違いは、しばしば見通しの問題です。上記の例は、コードの実行(の観察可能な効果)の観点からは非並列です。しかし、シングルコア内でも命令レベルの並列性があります。ハードウェアには、CPUと並行して処理を行い、処理が終了したときにCPUに割り込むものがあります。 ウィンドウプロシージャ またはイベントハンドラが実行されている間にGPUが画面に描画されている可能性があります。 DBMSは、前のクエリの結果をまだ取得している間に、次のクエリのためにBツリーをトラバースすることができます。あなたのPromise.resolve()が実行されている間、ブラウザはレイアウトかネットワーキングをしている可能性があります。などなど.

だからそこに行きます。世界はいつものように厄介です。

3

同時実行性 同時に実行されるタスクと実行されないタスクを含むことができます(実際には別々のプロセッサ/コアで実行できますが、「ティック」で実行することもできます)。 important とは、同時実行性が常に 1つのより大きなタスクの一部を実行する を指すことです。だから基本的にそれはいくつかの計算の一部です。同時にできること、できないこと、同期する方法について賢くなければなりません。

並列処理 は、いくつかのことを同時に行っていることを意味します。それらは一つの問題を解決することの一部である必要はありません。あなたのスレッドは、例えば、それぞれ一つの問題を解決することができます。もちろん同期化も同様に適用されますが、異なる観点からです。

3
kboom

(このような根本的な問題が何年もの間正しくそしてきちんと解決されていないことに私は非常に驚いています...)

要するに、並行性と並列性の両方がコンピューティングの特性です。

違いとして、これは Robert Harper による説明です。

最初に理解しておくべきことは並列処理は並行性とは関係ないです。並行性は、プログラム(またはそのコンポーネント)の非決定的構成に関係します。並列性は、確定的動作を持つプログラムの漸近的効率に関係します。並行性とは管理不能なものを管理することです。イベントは私たちの手に負えない理由で到着し、私たちはそれらに対応しなければなりません。ユーザーがマウスをクリックすると、ディスプレイに注意が向けられていても、ウィンドウマネージャは応答しなければなりません。そのような状況は本質的に非決定的ですが、我々はまた、コンポーネントがイベントを任意の順序でシグナル伝達するというふりをすることによって決定論的設定においてpro forma nondeterminismを使用します。非決定論的構成は、強力なプログラム構成のアイデアです。一方、並列処理は、決定論的計算のサブ計算間の依存関係に関するものです。結果は疑いの余地はありませんが、それを達成するための多くの手段があります。私達は私達の利点にそれらの機会を利用したいと思います。

それらはプログラム内で一種の直交特性になることができます。追加のイラストは このブログ記事 を読んでください。そして this one はスレッドのようにprogrammingの中のコンポーネントについての違いについてもう少し議論しました。

スレッド化またはマルチタスク化はすべて、より具体的な目的に役立つコンピューティングの実装です。それらは並列性と並行性に関連することがありますが、本質的な方法ではありません。したがって、それらは説明を始めるのにあまり良いエントリではありません。

もう1つ強調しておきたいことは、(物理的な)「時間」はここで説明した特性とはほとんど関係ないということです。時間は、特性の重要性を示すための測定の実施方法にすぎませんが、本質からは程遠いものです。 時間の複雑さにおける「時間」の役割を2倍考えてください。これは多かれ少なかれ似ていますが、その場合でも測定はより重要です。

2
FrankHB

並列性: 複数のスレッドを持つことは、それらがそうするために必要とするデータとリソースに関して互いに独立している同様のタスクをする。例:Googleクローラーは何千ものスレッドを生み出すことができ、それぞれのスレッドは独立してタスクを実行できます。

並行性: スレッド間でデータ、リソースを共有すると、並行性が実現します。トランザクションシステムでは、これはロック、セマフォなどのようないくつかのテクニックを使ってコードのクリティカルセクションを同期させなければならないことを意味します。

2
Sudip Bhandari

私の考えではこの2つを理解するための最も簡単で最もエレガントな方法はこれです。並行性は実行のインターリーブを可能にするので、 錯覚 の並列処理を与えることができます。これは、たとえば、Wordで文書を作成するのと並行して、並行システムでYoutubeビデオを実行できることを意味します。基礎となるOSはコンカレントシステムであるため、これらのタスクは実行をインターリーブできます。コンピュータは命令を非常に速く実行するので、これは一度に2つのことをするように見えます。

並列処理は、そのようなことが実際に並列である場合です。上記の例では、ビデオ処理コードがシングルコアで実行されており、Wordアプリケーションが別のコアで実行されていることがわかります。これは、並行プログラムも並列に実行できることを意味します。アプリケーションをスレッドとプロセスで構造化することで、プログラムは基盤となるハードウェアを活用し、潜在的に並行して実行することができます。

それでは、すべてが平行にならないようにしましょう。その理由の1つは、並行性は 構造化 プログラムの方法であり、懸念の分離を容易にするための設計上の決定であるのに対し、並列処理はパフォーマンスの名前でよく使用されるためです。もう1つは、基本的にいくつかのことを完全に並行して実行できないことです。この例としては、キューの後ろに2つのことを追加することがあります。両方を同時に挿入することはできません。何かが最初に、そしてその後ろに他のものが行かなければなりません、さもなければあなたはキューを台無しにします。このような実行をインターリーブすることはできますが(したがって並行キューを取得します)、並列にすることはできません。

お役に立てれば!

2
Daniel Soutar

この情報源からの説明 私にとって役に立ちました:

並行性は、アプリケーションが処理する複数のタスクをアプリケーションがどのように処理するかに関連しています。アプリケーションは、一度に1つのタスクを(順次に)処理することも、同時に(同時に)複数のタスクを処理することもできます。

一方、並列処理は、アプリケーションが個々のタスクを処理する方法に関連しています。アプリケーションは、タスクを開始から終了まで連続して処理するか、またはタスクをサブタスクに分割し、それらを並行して完了することができます。

お分かりのように、アプリケーションは並行することはできますが、並行することはできません。これは、同時に複数のタスクを処理することを意味しますが、タスクはサブタスクに分割されません。

アプリケーションは並列でも同時ではありません。つまり、アプリケーションは一度に1つのタスクでしか動作せず、このタスクは並行して処理できるサブタスクに分割されます。

さらに、アプリケーションは同時でも並列でもない可能性があります。つまり、タスクは一度に1つのタスクでしか動作せず、タスクは並列実行のためにサブタスクに分割されることはありません。

最後に、アプリケーションは、同時に複数のタスクを処理し、並列実行のために各タスクをサブタスクに分割するという点で、並行および並列の両方にすることもできます。ただし、このシナリオでは、同時実行性または並列処理のみでコンピュータのCPUが既にかなりビジーになっているため、同時実行性および並列処理の利点の一部が失われることがあります。それを組み合わせると、わずかなパフォーマンスの向上、またはパフォーマンスの低下につながる可能性があります。

1
Boolean_Type

単純な並行性とは、複数のタスクが実行されていることを意味します(並行して実行する必要はありません)。たとえば、assumerには3つのタスクがあり、いつでも実行できます。複数のタスクが実行されている場合も、すべてが同時に実行されている場合もあります。

並列処理とは、文字どおり並列に実行されていることを意味します。したがって、その場合、3つすべてが同時に実行されている必要があります。

1
i_am_zero

私が理解していることを示すシナリオを考えてみましょう。 A、B、Cという3人の子供がいるとします。AとBの会話、Cの会話です。 AとBの場合、それらは平行です。A:私はAです。B:私はBです。

しかし、Cにとっては、彼の脳はAとBを聞くために並行したプロセスを取らなければなりません。

1
mannnnerd

Pikeの「並行性」の概念は、意図的な設計と実装の決定です。並行可能プログラム設計は、振る舞いの「並列処理」を示す場合と示さない場合があります。ランタイム環境によって異なります。

並行性を考慮して設計されていないプログラムによって並列処理が行われることは望ましくありません。 :-)しかし、それが関連する要素(消費電力、パフォーマンスなど)の純益である限り、ホストシステムが可能な場合にその実行を並列化できるように最大限同時の設計が必要です。

Pike's Goプログラミング言語は極端にこれを説明しています:彼の関数はすべて同時に正しく実行できるスレッドです。何百、何千ものスレッドを持つアプリケーションは、彼の世界ではまったく普通のことです。 (私はGoの専門家ではありません。それが私の考えです。)

1
bgat

「コンカレント」とは何かを同時にやることです。それらは異なるものでも、同じものでもかまいません。欠けている、受け入れられた答えにもかかわらず、それは「同時にあるように見えること」についてではありません。それは本当に同時にです。同時コードを実行するには、1つのホスト内で共有メモリを使用するか、異なるホストに分散メモリを使用するかのいずれかで、複数のCPUコアが必要です。同時に実行されている3つの異なるタスクのパイプラインがその例です。タスクレベル2はタスクレベル1で完了した作業単位を待機し、タスクレベル3は作業レベル1で完了した作業単位を待機します。タスクレベル2もう1つの例は、1生産者と1消費者の並行性です。または多数生産者および1消費者。読者および作家他。

「パラレル」は同時に同じことをしています。それは同時ですが、さらにそれは同時に起こる同じ振る舞いであり、最も一般的には異なるデータに対して行われます。行列代数は、同じ演算を繰り返し実行するため、並列化できることがよくあります。たとえば、行列の列合計は、同じ動作(合計)を使用して、異なる列ですべて同時に計算できます。利用可能なプロセッサコア間で列を分割(分割)して、各プロセッサコアで処理される作業量(列数)をほぼ同じにするのが一般的な方法です。作業を分割するもう1つの方法は、作業を終了した作業員が作業を配ったマネージャに戻り、すべてが完了するまで動的に作業を進めていくというバグのある作業です。発券アルゴリズムは別のものです。

数値コードだけでなく並列化することもできます。あまりにも頻繁にファイルを並列処理することができます。自然言語処理アプリケーションでは、何百万もの文書ファイルのそれぞれについて、文書内のトークンの数を数える必要があるかもしれません。これは並列です。なぜなら、あなたはすべてのファイルに対してトークンを数えているからです。

言い換えれば、並列性は同じ振る舞いが同時に実行されているときです。同時にという意味ですが、必ずしも同じ動作ではありません。並列は、同じことが同時に起こっている特定の種類の並行性です。

例えば、アトミックインストラクション、クリティカルセクション、相互排除、スピンウェイト、セマフォ、モニター、バリア、メッセージパッシング、マップリデュース、ハートビート、リング、発券アルゴリズム、スレッド、MPI、OpenMPなどがあります。

グレゴリーアンドリュースの仕事はそれに関するトップ教科書です:マルチスレッド、並列、および分散プログラミング。

0