並行性と並列性の違いは何ですか?
例は高く評価されています。
並行性と並列性の違いは何ですか?
例は高く評価されています。
回答:
並行性とは、2つ以上のタスクが重複した期間で開始、実行、完了できる場合です。それは必ずしも両方が同時に実行されるという意味ではありません。たとえば、シングルコアマシンでのマルチタスク。
並列処理とは、マルチコアプロセッサなどで文字通り同時にタスクを実行することです。
並行性:少なくとも2つのスレッドが進行しているときに存在する状態。仮想的な並列処理の形式としてタイムスライシングを含めることができる、より一般化された形式の並列処理。
並列処理:少なくとも2つのスレッドが同時に実行されているときに発生する状態。
これらの単語の辞書の意味はほとんど同じであるため、混乱が生じます。
しかし、それらがコンピュータサイエンスとプログラミングで使用される方法はかなり異なります。これが私の解釈です:
上記の定義とはどういう意味ですか?
実世界のアナロジーで明らかにします。1日で2つの非常に重要なタスクを完了する必要があるとします。
さて、問題は、タスク1では、非常に官僚的な政府機関に出向いて、パスポートを取得するために4時間待つ必要があるということです。一方、タスク2はオフィスで必要であり、重要なタスクです。どちらも特定の日に完了する必要があります。
通常は、パスポートオフィスまで2時間運転し、列で4時間待ち、タスクを完了し、2時間戻って家に帰り、さらに5時間起きてプレゼンテーションを行います。
しかし、あなたは賢いです。あなたは前もって計画を立てます。ノートパソコンを携帯し、列で待っている間にプレゼンテーションの作業を開始します。この方法では、家に戻ったら、5時間ではなく1時間余分に作業する必要があります。
この場合、両方のタスクは分割して行われます。あなたは列で待っている間にパスポートタスクを中断し、プレゼンテーションに取り組みました。番号が呼び出されたときに、プレゼンテーションタスクを中断し、パスポートタスクに切り替えました。時間の節約は、両方のタスクの割り込み可能性により本質的に可能でした。
同時実行、IMOは、ACIDの「分離」プロパティとして理解できます。2つのデータベーストランザクションは、サブトランザクションをそれぞれの方法で実行でき、最終的な結果が2つのタスクが順次実行された場合と同じである場合、分離されていると見なされます。パスポートとプレゼンテーションタスクの両方で、あなたが唯一の死刑執行人であることを忘れないでください。
さて、あなたはとても賢い人なので、あなたは明らかに上級者であり、あなたには助手がいます。したがって、パスポートタスクを開始する前に、彼に電話して、プレゼンテーションの最初のドラフトを準備するように伝えます。1日を過ごしてパスポートのタスクを完了し、戻ってメールを見て、プレゼンテーションの下書きを見つけます。彼はかなりしっかりした仕事をしていて、あと2時間でいくつか編集して、あなたはそれを完成させました。
これで、アシスタントはあなたと同じくらい賢いので、常に説明を求めなくても、アシスタントは個別に作業できました。したがって、タスクの独立性により、2つの異なる実行者によって同時に実行されました。
まだ私と一緒に?よし...
パスポートのタスクを覚えていますか?それがあるので、あなたのパスポート、あなたのアシスタントはあなたのために並んで待つことができません。したがって、パスポートタスクには割り込み可能性があります(回線で待機中に停止し、後で番号が呼び出されたときに再開できます)が、独立性はありません(アシスタントは代わりに待機できません)。
政府のオフィスに敷地内に入るためのセキュリティチェックがあるとします。ここでは、すべての電子デバイスを取り外して役員に提出する必要があります。担当者は、タスクを完了した後にのみデバイスを返却します。
この場合、パスポートタスクは独立可能でも割り込み可能でもありません。行列に並んでいても、必要な機材がないので、他の作業はできません。
同様に、プレゼンテーションが非常に数学的な性質を持っているため、少なくとも5時間は100%の濃度が必要であるとします。ラップトップを持っていても、パスポートのタスクを待っている間はできません。
この場合、プレゼンテーションタスクは独立可能ですが(あなたまたはあなたのアシスタントは5時間の集中的な作業を行うことができます)、中断することはできません。
ここで、アシスタントをプレゼンテーションに割り当てるだけでなく、パスポートタスクのためにラップトップも携帯するとします。順番待ちで、アシスタントが共有デッキに最初の10枚のスライドを作成したことがわかります。あなたはいくつかの修正を加えて彼の作品にコメントを送信します。その後、自宅に到着したときに、ドラフトを完成させるために2時間かかるのではなく、15分しか必要ありません。
これは、プレゼンテーションタスクに独立性(どちらでも可能)と割り込み可能性(停止して後で再開できる)があるために可能でした。したがって、両方のタスクを同時に実行し、プレゼンテーションタスクを並行して実行しました。
過度に官僚的であることに加えて、政府機関は腐敗しているとしましょう。したがって、IDを表示して入力し、番号が呼び出されるのを待って待機し、警備員と他の誰かに電話であなたの位置を保持し、こっそり出て、番号が呼び出される前に戻って、待機を再開できます。あなた自身。
この場合、パスポートタスクとプレゼンテーションタスクの両方を同時に並行して実行できます。あなたはこっそりすることができ、あなたの位置はあなたのアシスタントによって保持されます。その後、2人でプレゼンテーションなどを行うことができます。
コンピューティングの世界で、これらの各ケースに典型的なシナリオの例を以下に示します。
Rob Pikeが同時実行性が優れていると言っている理由がわかった場合は、その理由を理解する必要があります。ファイルの読み取りやネットワークのダウンロードなどの外部操作を待機する複数の待機期間があるという非常に長いタスクがあります。彼の講演で彼が言っているのは、「この長い一連のタスクを分割して、待っている間に何か役に立つことをできるようにすること」です。そのため、彼はさまざまなゴーファーを持つさまざまな組織について話します。
Goの強みは、go
キーワードとチャネルを使用してこのブレイクを非常に簡単にすることです。また、これらのゴルーチンをスケジュールするためのランタイムの優れた基本的なサポートがあります。
しかし、本質的に、並行性は並列処理よりも優れているでしょうか?
リンゴはオレンジよりも良いですか?
私はロブ・パイクの話が好きです:並行性は並列処理ではありません(それはより良いです!) (スライド) (話)
Robは通常、Goについて話し、通常、並行性と並列処理の問題に視覚的かつ直感的な説明で対処します。ここに短い要約があります:
タスク:古くなった言語マニュアルの山を焼きましょう!一つずつ!
同時実行性:タスクには同時に多くの分解があります!一例:
並列処理:少なくとも2つのgopherが同時に動作しているかどうかにかかわらず、以前の構成は並列で発生します。
他の人が言ったことに追加するには:
並行性は、ジャグラーが多くのボールをジャグリングするようなものです。どのように見えるかにかかわらず、手品師は一度に1つの手で1つのボールだけをキャッチ/スローします。並列処理とは、複数のジャグラーが同時にボールをジャグリングすることです。
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つのスレッドを並列に(同時に並行して)実行できます。
並行性: 2つ以上の問題が単一のプロセッサーで解決される場合。
並列処理: 1つの問題が複数のプロセッサによって解決される場合。
面白くてわかりやすい例で説明していきます。:)
想定組織は(10人のプレイヤーのチェスの大会組織することに等しいチェスの演奏スキルを持つが)挑戦するプロのチャンピオンにのチェスプレーヤーを。チェスは1対1のゲームなので、主催者はイベント全体をできるだけ早く終了できるように、時間効率の良い方法で10ゲームを実行する必要があります。
うまくいけば、以下のシナリオで、これらの10ゲームを実行する複数の方法を簡単に説明できます。
1)SERIAL-プロが一人一人で一人ずつプレイする、つまり一人でゲームを開始して終了し、次に次の人で次のゲームを開始する、などとしましょう。言い換えれば、彼らはゲームを順番に行うことにしました。したがって、1つのゲームの完了に10分かかる場合、10ゲームは100分かかります。また、あるゲームから他のゲームへの移行に6秒かかると仮定すると、10ゲームの場合、54秒(約1分)になります。
イベント全体は約101分で完了します(最悪のアプローチ)
2)同時進行-プロが自分の番をプレイして次のプレイヤーに移動するため、10人のプレイヤー全員が同時にプレイしているが、プロのプレイヤーは一度に2人ではなく、自分の番をプレイして次のプレイヤーに移動するとします。ここで、プロプレーヤーが彼のターンをプレイするのに6秒かかり、2人のプレーヤーの白黒のトランジション時間も6秒であるため、最初のプレーヤーに戻るまでの合計トランジション時間は1分(10x6秒)になります。したがって、イベントが開始された最初の人に戻るまでに、2分が経過しました(10xtime_per_turn_by_champion + 10xtransition_time = 2mins)
すべてのプレーヤーが自分のターンを完了するのに45秒かかると仮定すると、シリアルイベントからのゲームあたり10分に基づいて、いいえ。ゲーム終了前のラウンド数は600 /(45 + 6)= 11ラウンド(約)
したがって、イベント全体は約11xtime_per_turn_by_player _&_ champion + 11xtransition_time_across_10_players = 11x51 + 11x60sec = 561 + 660 = 1221sec = 20.35分(約)でほぼ完了します
101分から20.35分までの改善点をご覧ください(BETTER APPROACH)
3)PARALLEL-主催者が追加の資金を得て、2人のプロチャンピオンプレーヤー(どちらも同等に能力がある)を招待し、同じ10プレーヤー(チャレンジャー)のセットを5人ずつの2つのグループに分け、2人のチャンピオン、つまり1人に割り当てたとしましょう各グループ。現在、イベントはこれら2つのセットで並行して進行しています。つまり、少なくとも2人のプレーヤー(各グループに1人)がそれぞれのグループの2人のプロプレーヤーと対戦しています。
ただし、グループ内では、プロプレーヤーは一度に1人のプレーヤー(つまり、順次)をとるので、計算を行わなくても、イベント全体が約101/2 = 50.5分で完了すると簡単に推測できます。
101分から50.5分までの改善点を見る(良いアプローチ)
4)同時+並列-上記のシナリオで、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分までの改善点を見る(最善のアプローチ)
注:上記のシナリオで、10人のプレーヤーを10個の類似ジョブで置き換え、2人のプロプレーヤーを2個のCPUコアで置き換えた場合も、次の順序はそのままです。
シリアル>並列>並行>並行+並行
(注:この順序は、ジョブの相互依存性、通信の必要性、b / wジョブ、および移行オーバーヘッドのb / wジョブに大きく依存するため、他のシナリオでは変更される可能性があります)
簡単な例:
同時実行:「1つのATMマシンにアクセスする2つのキュー」
パラレルは:「2つのキューと2つのATMマシン」
ビデオチュートリアルを見て、新しいプログラミング言語を学ぶことを想像してみてください。ビデオを一時停止し、コードで述べられていることを適用して、視聴を続ける必要があります。それは並行性です。
今、あなたはプロのプログラマーです。そして、コーディングしながら穏やかな音楽を聴くことができます。それが並列処理です。
Andrew GerrandがGoLangブログで言ったように
並行性とは、一度に多くのことを処理することです。並列処理とは、一度に多くのことを行うことです。
楽しい。
並行プログラミングの実行には、非並行並行プログラミングと並行並行プログラミング(並列処理とも呼ばれる)の2つのタイプがあります。
主な違いは、人間の目には、非並行並行性のスレッドは同時に実行されているように見えますが、実際には実行されないことです。非並列では、同時実行スレッドは急速に切り替わり、順番にタイムスライスを通じてプロセッサを使用します。並列処理では複数のプロセッサを使用できるため、複数のスレッドが異なるプロセッサで同時に実行できます。
リファレンス:プログラミング言語の同時実行性の概要
並列処理とは、multiple cores per CPU
またはでプロセスを同時に実行することですmultiple CPUs (on a single motherboard)
。
並行性とは、CPUの時間を分割するスケジューリングアルゴリズム(タイムスライス)を使用して並列処理が実現さsingle core/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
(ヒープ、レジスタ、スタック、クラスメモリ)
同時実行性 =>複数のタスクが共有リソースを使用して重複する期間で実行される場合(リソースの使用率を最大化する可能性があります)。
並列 =>単一のタスクが、同時に実行できる複数の単純な独立したサブタスクに分割されている場合。
これは、サーバーがキュー内の最初のジョブのみを処理できるキューの処理と考えてください。
1つのサーバー、1つのジョブキュー(5つのジョブ)->同時実行性、並列処理なし(1つのジョブのみがサービスされて完了します。キュー内の次のジョブは、サービスされたジョブが完了するまで待機する必要があり、他にサーバーはありません。それを整備する)
1つのサーバー、2つ以上の異なるキュー(キューごとに5つのジョブ)->同時実行性(サーバーは、キュー内のすべての最初のジョブと同等または重み付けされた時間を共有しているため)、いつでも並列性がないため、1つしかありませんサービスされているジョブ。
2つ以上のサーバー、1つのキュー->並列処理(2つのジョブが同時に実行されます)が同時実行性なし(サーバーは時間を共有していないため、3番目のジョブはサーバーの1つが完了するまで待機する必要があります。)
2つ以上のサーバー、2つ以上の異なるキュー->同時実行性と並列処理
言い換えれば、同時実行性はジョブを完了するための時間を共有することであり、ジョブを完了するために同じ時間をとる場合がありますが、少なくとも早期に開始されます。重要なのは、ジョブをより小さなジョブにスライスして、インターリーブを可能にすることです。
並列処理は、並列で実行されるCPU、サーバー、ユーザーなどを追加するだけで実現されます。
リソースが共有されている場合、純粋な並列処理を実現することはできませんが、これは、同時実行性が最も有効な用途であり、そのリソースを必要としない別のジョブを実行することを覚えておいてください。
私はここで人気のある答えのいくつかと少し矛盾する答えを提供します。私の意見では、並行性は並列処理を含む一般的な用語です。 並行性は、個別のタスクまたは作業単位が時間的に重複するすべての状況に適用されます。 並列処理は、個別の作業単位が同じ物理時間で評価/実行される状況に、より具体的に適用されます。並列処理の存在理由は、複数の物理計算リソースから利益を得ることができるソフトウェアの高速化です。同時実行に適合するその他の主要な概念は、対話性です。 対話性タスクのオーバーラップが外部から観察できる場合に適用されます。対話性の存在理由は、ユーザー、ネットワークピア、ハードウェア周辺機器などの現実のエンティティに応答するソフトウェアを作成することです。
並列処理と対話性は、並行性のほぼ完全に独立した次元です。特定のプロジェクトでは、開発者はどちらか、両方、またはどちらも気にしないかもしれません。特にスレッドである嫌悪は両方を行うのにかなり便利なプリミティブを提供するため、それらは混乱する傾向があります。
並列処理についてもう少し詳しく:
並列処理は、非常に小さなスケール(たとえば、プロセッサの命令レベルの並列処理)、中規模(たとえば、マルチコアプロセッサ)、および大規模(たとえば、高性能コンピューティングクラスタ)で存在します。マルチコアプロセッサの成長により、ソフトウェア開発者がより多くのスレッドレベルの並列処理を公開するように求める圧力が近年高まっています。並列処理は、依存関係の概念と密接に関連しています。依存関係は、並列処理を実現できる範囲を制限します。一方が他方に依存している場合、2つのタスクを並行して実行することはできません(推測は無視)。
プログラマーが並列処理を表現するために使用するパターンとフレームワークはたくさんあります:パイプライン、タスクプール、データ構造( "並列配列")での集計操作です。
インタラクティブ性についてもう少し詳しく:
対話性を行うための最も基本的で一般的な方法は、イベント(つまり、イベントループとハンドラー/コールバック)を使用することです。単純なタスクの場合、イベントは素晴らしいです。イベントを使用してより複雑なタスクを実行しようとすると、スタックのリッピングが発生します(別名:コールバック地獄、別名:制御の反転)。イベントにうんざりしたら、ジェネレーター、コルーチン(別名Async / Await)、協調スレッドなどのエキゾチックなものを試すことができます。
信頼性の高いソフトウェアを愛するために、インタラクティブ性が目的の場合はスレッドを使用しないでください。
しつこい
私はRob Pikeの「並行性は並列処理ではなく、より良い」というスローガンが嫌いです。並行性は並列処理よりも良くも悪くもありません。同時実行性には、並列性とのより良い/悪い方法で比較できない対話性が含まれます。「制御フローはデータよりも優れている」と言っているようなものです。
電子機器では、シリアルとパラレルは一種の静的トポロジを表し、回路の実際の動作を決定します。並行性がない場合、並列処理は確定的です。
動的な時間関連の現象を説明するために、シーケンシャルおよびコンカレントという用語を使用します。例えば、特定の結果は、特定の一連のタスク(例えば、レシピ)を介して取得され得る。私たちは誰かと話しているとき、私たちは一連の言葉を生み出しています。ただし、実際には、他の多くのプロセスが同じ瞬間に発生するため、特定のアクションの実際の結果に同意します。多くの人が同時に話している場合、同時の会話がシーケンスに干渉する可能性がありますが、この干渉の結果は事前にはわかりません。並行性は不確定性をもたらします。
シリアル/パラレルおよびシーケンシャル/コンカレントの特性評価は直交しています。この例は、デジタル通信です。ではシリアルアダプタ、デジタルメッセージ(すなわち、一時的であり、順次同じ通信回線(例えば、一本のワイヤ)に沿って分布します)。並列アダプタは、これは、パラレル通信回線(例えば、多くのワイヤ)上にも分割され、その後、受信端に再構成します。
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 > ....
これは逐次的なプロセスであり、並列インフラストラクチャで(ただし、部分的にシリアル化されていますが)。
どちらの場合も、子供同士の間に完全なコミュニケーションがあるとすると、結果は 事前に判断されます。
あなたと一緒に最初の子供と話す人が他にいる場合は、並行プロセスがあります。インフラストラクチャによってどのプロセスが考慮されるかはわかりません。そのため、最終的な結果は事前に決定されていません。
並行性は、並列化の一般化された形式です。たとえば、並列プログラムは並行して呼び出すこともできますが、逆は当てはまりません。
シングルプロセッサで同時実行が可能(複数のスレッド、スケジューラまたはスレッドプールで管理)
並列実行は、単一のプロセッサーでは実行できず、複数のプロセッサーで実行できます。(プロセッサーごとに1つのプロセス)
分散コンピューティングも関連トピックであり、並行コンピューティングと呼ぶこともできますが、並列処理のように逆は当てはまりません。
詳細については、このリサーチペーパー「並行プログラミングの概念」を参照してください。
私は別の答えからこのグラフィック表現が本当に好きでした-私はそれが上記の多くの答えよりもはるかに良い質問に答えると思います
並列処理と並行性 2つのスレッドが並行して実行されている場合、それらは両方同時に実行されます。たとえば、2つのスレッドAとBがある場合、それらの並列実行は次のようになります。
CPU 1:A ------------------------->
CPU 2:B ------------------------->
2つのスレッドが同時に実行されている場合、それらの実行はオーバーラップします。重複は次の2つの方法のいずれかで発生する可能性があります。スレッドが同時に(つまり、上記のように並列に)実行されているか、またはその実行がプロセッサでインターリーブされているかのいずれかです。
CPU 1:A -----------> B ----------> A -----------> B -------- ->
したがって、私たちの目的では、並列処理は並行性の特別なケースと考えることができます
出典:ここで別の答え
お役に立てば幸いです。
私はこの質問に対する Paul Butcherの答えが本当に好きです(彼はSeven WeeksのSeven Concurrency Modelsのライターです):
混乱することがよくありますが、並列処理と並行処理は異なります。同時実行性は問題ドメインの側面です。コードは複数の同時(またはほぼ同時)のイベントを処理する必要があります。対照的に、並列処理はソリューションドメインの1つの側面です。問題のさまざまな部分を並行して処理することにより、プログラムをより高速に実行する必要があります。いくつかのアプローチは並行性に適用でき、いくつかは並列処理に適用でき、いくつかは両方に適用できます。あなたが直面しているものを理解し、仕事に適したツールを選択してください。
同時実行性には、タスクの同時実行が含まれる場合と含まれない場合があります(実際には、別々のプロセッサ/コアで実行できますが、「ティック」で実行することもできます)。何が重要なことは、並行性は常にを参照していることである1つのより大きなタスクの一部をやって。したがって、基本的には一部の計算の一部です。同時にできること、できないこと、同期する方法について賢くする必要があります。
並列処理とは、いくつかのことを同時に実行していることを意味します。彼らは1つの問題を解決するための一部である必要はありません。たとえば、スレッドはそれぞれ1つの問題を解決できます。もちろん同期も適用されますが、見方は異なります。
「並行性」とは、進行中のものが複数ある場合です。
「並行処理」とは、並行することが同時に進行していることです。
並列処理なしの同時実行の例:
ただし、並行性と並列性の違いは、多くの場合、見方の問題です。上記の例は、コードの実行(の観察可能な影響)の観点から非並列です。ただし、単一コア内でも命令レベルの並列処理があります。CPUと並行して処理を実行し、実行時にCPUに割り込みをかけるハードウェアがあります。ウィンドウプロシージャまたはイベントハンドラーの実行中に、GPUが画面に描画している可能性があります。前のクエリの結果をフェッチしている間に、DBMSが次のクエリのBツリーをトラバースする可能性があります。ブラウザは、レイアウトやネットワーキングを実行している可能性がありますPromise.resolve()
。などなど...
さあ、行きます。世界はいつものように乱雑です;)
私の意見では、2つを理解する最も単純で最もエレガントな方法はこれです。並行性は実行のインターリーブを可能にするため、並列処理のような錯覚を与える可能性があります。これは、たとえば、Wordでドキュメントを作成しているときに並行システムがYoutubeビデオを実行できることを意味します。並行システムである基盤となるOSは、これらのタスクが実行をインターリーブできるようにします。コンピュータは非常に高速に命令を実行するため、これは2つのことを同時に実行しているように見えます。
このようなことが本当にとき並列処理があります並列に。上記の例では、ビデオ処理コードが単一のコアで実行されており、Wordアプリケーションが別のコアで実行されていることがわかります。これは、並行プログラムも並行して実行できることを意味することに注意してください!スレッドとプロセスを使用してアプリケーションを構造化すると、プログラムで基盤となるハードウェアを活用し、場合によっては並行して実行できます。
では、なぜすべてを並列化しないのですか?1つの理由は、並行性はプログラムを構造化する方法であり、懸念の分離を容易にするための設計上の決定であるためです。一方、並列処理はパフォーマンスの名前でよく使用されます。もう1つは、基本的に完全に並行して実行できないものがあることです。これの例は、キューの後ろに2つのものを追加することです-両方を同時に挿入することはできません。何かが最初に、もう1つがその後ろになければなりません。そうしないと、キューがめちゃくちゃになります。そのような実行をインターリーブすることはできます(したがって、同時実行キューを取得します)が、並列実行することはできません。
お役に立てれば!
並行プログラミングは、重複しているように見える操作を考慮し、主に非決定論的な制御フローが原因で発生する複雑さに関係しています。並行プログラムに関連する定量的なコストは、通常、スループットと待ち時間の両方です。並行プログラムは多くの場合IOにバインドされますが、常にではありません。たとえば、並行ガベージコレクターは完全にCPU上にあります。並行プログラムの教育学的な例は、Webクローラーです。このプログラムは、Webページの要求を開始し、ダウンロードの結果が利用可能になると同時に応答を受け入れ、すでにアクセスされた一連のページを蓄積します。プログラムが実行されるたびに応答が同じ順序で受信されるとは限らないため、制御フローは非決定的です。この特性により、並行プログラムのデバッグが非常に困難になる場合があります。一部のアプリケーションは基本的に同時です。たとえば、Webサーバーはクライアント接続を同時に処理する必要があります。Erlangは、おそらく、並行性の高いプログラミングで最も有望な言語です。
並列プログラミングは、スループットを向上させるという特定の目標のために重複する操作に関係しています。並行プログラミングの難しさは、制御フローを確定的にすることによって回避されます。通常、プログラムは並列に実行される子タスクのセットを生成し、親タスクはすべてのサブタスクが終了した後にのみ続行されます。これにより、並列プログラムのデバッグがはるかに容易になります。並列プログラミングの難しい部分は、粒度や通信などの問題に関するパフォーマンスの最適化です。後者は、マルチコアのコンテキストでは依然として問題です。1つのキャッシュから別のキャッシュへのデータ転送にかなりのコストがかかるためです。密行列行列乗算は並列プログラミングの教育学的例であり、Strasen 'を使用することで効率的に解くことができます ■分割統治アルゴリズムと副問題への並列攻撃。Cilkは、共有メモリコンピュータ(マルチコアを含む)での高性能並列プログラミングでおそらく最も有望な言語です。
私の答えからコピー:https : //stackoverflow.com/a/3982782
並列処理: 複数のスレッドで同様のタスクを実行します。これらのタスクは、実行するために必要なデータとリソースの点で互いに独立しています。例:Googleクローラーは数千のスレッドを生成でき、各スレッドは独立してタスクを実行できます。
並行性: データを共有し、スレッド間でリソースを共有すると、並行性が明らかになります。トランザクションシステムでは、ロック、セマフォなどのいくつかの手法を使用して、コードのクリティカルセクションを同期する必要があります。
(私はそのような根本的な質問が何年もの間正しくそしてきちんと解決されないことにかなり驚いています...)
つまり、同時実行性と並列処理はどちらもコンピューティングの特性です。
違いについては、ここにロバートハーパーからの説明があります:
最初に理解しておくべきことは、並列処理は並行性とは何の関係もないということです。並行性は、プログラム(またはそのコンポーネント)の非決定的な構成に関係しています。並列処理は、確定的動作を伴うプログラムの漸近的な効率に関係しています。同時実行性とは、管理できないものを管理することです。イベントは、私たちの制御が及ばない理由で到着し、それに対応する必要があります。ユーザーがマウスをクリックすると、ディスプレイが注意を要求している場合でも、ウィンドウマネージャーは応答する必要があります。このような状況は本質的に非決定的ですが、プロフォーマも採用していますコンポーネントが任意の順序でイベントを通知し、イベントが発生したときにそれらに応答する必要があるというふりをすることによる、決定論的設定における非決定論。非決定的合成は、強力なプログラム構造化のアイデアです。一方、並列処理とは、決定論的計算のサブ計算間の依存関係に関するものです。結果は疑いの余地はありませんが、それを達成するための多くの方法があります。これらの機会を私たちの利益のために活用したいと思います。
それらは、プログラム内の一種の直交プロパティである可能性があります。追加のイラストについては、このブログ投稿をお読みください。そして、この1は、内のコンポーネントに関する違いに少し議論プログラミングのスレッドのように、。
スレッド化またはマルチタスキングはすべて、より具体的な目的に役立つコンピューティングの実装です。それらは並列性と並行性に関連している可能性がありますが、本質的な方法ではありません。したがって、これらは説明を始めるのに適したエントリではありません。
もう1つのハイライト:(物理)「時間」は、ここで説明するプロパティとはほとんど関係ありません。時間は、特性の重要性を示すための測定の実装方法にすぎませんが、本質からはほど遠いものです。時間の複雑さにおける「時間」の役割を2度考えます。これは多かれ少なかれ似ていますが、その場合、測定値でさえより重要になることがよくあります。
「並行」とは、何かを同時に行うことです。それらは異なるものでも、同じものでもかまいません。受け入れられた答えは欠けていますが、それは「同時に存在しているように見える」ということではありません。それは本当に同時にです。同時実行コードを実行するには、1つのホスト内の共有メモリを使用するか、異なるホスト上の分散メモリを使用して、複数のCPUコアが必要です。同時に並行して実行されている3つの異なるタスクのパイプラインが例です。タスクレベル2は、タスクレベル1によって完了するユニットを待つ必要があり、タスクレベル3は、タスクレベル1によって完了する作業ユニットを待つ必要があります。タスクレベル-2。別の例は、1プロデューサーと1コンシューマーの同時実行です。または多くの生産者と1人の消費者。読者と作家; 他
「Parallel」は同じことを同時に行っています。これは同時ですが、同時に発生するのと同じ動作であり、最も一般的には異なるデータで発生します。同じ演算を繰り返し実行しているため、行列代数はしばしば並列化できます。たとえば、行列の列の合計は、同じ動作(合計)を使用して同時に異なる列ですべて同時に計算できます。使用可能なプロセッサコア間で列を分割(分割)することは一般的な戦略であり、各プロセッサコアで処理される作業(列の数)とほぼ同じ量になります。仕事を分割する別の方法は、仕事を終えたワーカーが仕事を手渡すマネージャーに戻り、すべてが完了するまでより多くの仕事を動的に取得するタスクバッグです。発券アルゴリズムは別です。
数値コードだけを並列化することはできません。ファイルは頻繁に並列処理できます。自然言語処理アプリケーションでは、何百万ものドキュメントファイルごとに、ドキュメント内のトークンの数を数える必要がある場合があります。これは、すべてのファイルに対して同じ動作であるトークンをカウントしているため、並行しています。
つまり、並列処理とは、同じ動作が同時に実行されている場合です。同時には、同時に同じことを意味しますが、必ずしも同じ動作ではありません。Parallelは、同じことが同時に発生する特定の種類の並行性です。
たとえば、アトミックな命令、クリティカルセクション、相互排除、スピン待機、セマフォ、モニター、バリア、メッセージパッシング、マップリデュース、ハートビート、リング、チケットアルゴリズム、スレッド、MPI、OpenMPなどの用語が含まれます。
グレゴリー・アンドリュースの作品は、マルチスレッド、並列、および分散プログラミングという、それに関する最高の教科書です。
単純な同時実行とは、複数のタスクが実行されていることを意味します(並行して行う必要はありません)。たとえば、3つのタスクがあると仮定すると、いつでも1つ以上のタスクが実行されているか、すべてが同時に実行されている可能性があります。
並列処理とは、文字通り並列に実行されていることを意味します。したがって、その場合、3つすべてが同時に実行されている必要があります。
パイクの「並行性」の概念は、意図的な設計と実装の決定です。同時実行可能なプログラム設計は、動作の「並列性」を示す場合と示さない場合があります。ランタイム環境によって異なります。
並行性を考慮して設計されていないプログラムによって並列処理が示されることは望ましくありません。:-)しかし、それが関連する要素(電力消費、パフォーマンスなど)の正味の利益である限り、可能な限りホストシステムがその実行を並列化できるように、最大同時実行設計が必要です。
PikeのGoプログラミング言語は、これを極端に示しています。彼の関数はすべて、同時に正しく実行できるすべてのスレッドです。つまり、関数を呼び出すと、常にスレッドが作成され、システムで可能な場合は呼び出し元と並行して実行されます。彼の世界では、数百または数千のスレッドを持つアプリケーションはまったく普通です。(私はGoの専門家ではありません。それは私の見解です。)