web-dev-qa-db-ja.com

並行性、並列処理、非同期メソッドの違いは何ですか?

同時実行では、2つのタスクが別々のスレッドで並行して実行されます。ただし、非同期メソッドは並列に実行されますが、同じ1つのスレッドで実行されます。これはどのように達成されますか?また、並列処理はどうですか?

これら3つの概念の違いは何ですか?

131
GurdeepS

並列と並列は事実上、あなたが正しく推測している原理と同じです。並列タスクは、同時に実行されるタスクに関連しますが、並列タスクは「同時に」実行されるべきです。実行スレッドがまだ並行して実行されているように見えます。

非同期メソッドは、前の2つの概念に直接関連していません。非同期は、同時または並列タスクの印象を表現するために使用されますが、通常、現在のアプリケーションから離れて作業を行う必要があるプロセスには、非同期メソッド呼び出しが効果的に使用されます。待って、応答を待っているアプリケーションをブロックしたくない。

たとえば、データベースからデータを取得するには時間がかかる可能性がありますが、データを待機しているUIをブロックすることは望ましくありません。非同期呼び出しは、コールバック参照を取得し、リモートシステムに要求が送信されるとすぐに実行をコードに戻します。リモートシステムが必要な処理を実行している間、UIは引き続きユーザーに応答できます。コールバックメソッドにデータを返すと、そのメソッドは必要に応じてUIを更新(またはその更新をハンドオフ)できます。

ユーザーの観点からは、マルチタスクのように見えますが、そうでない場合があります。


編集

多くの実装では、非同期メソッド呼び出しによってスレッドがスピンアップすることを追加する価値がありますが、それは必須ではありません。実行される操作と応答をシステムに通知する方法に依存します。

109
Lazarus

要するに、

並行性とは、重複する期間に特定の順序で開始、実行、完了する複数のタスクを意味します。並列処理とは、複数のタスクOR一意のタスクの複数の部分が文字通り同時に実行される場合、たとえばマルチコアプロセッサ上で実行される場合です。

並行性と並列性は同じものではないことに注意してください。

並行処理と並列処理の違い

次に、並行性と並列性の顕著な違いをリストします。

並行性とは、2つのタスクが重複した期間で開始、実行、完了できる場合です。並列処理とは、タスクが文字通り同時に実行される場合です。マルチコアプロセッサ上。

並行性は独立して実行するプロセスの構成であり、並行性は(おそらく関連する)計算の同時実行です。

並行性とは、一度に多くのことを処理することです。並列処理とは、一度に多くのことを行うことです。

アプリケーションは同時に実行できますが、並列処理はできません。つまり、同時に複数のタスクを処理しますが、同時に実行されるタスクはありません。

アプリケーションは並列にできますが、同時ではありません。つまり、マルチコアCPUでタスクの複数のサブタスクを同時に処理します。

アプリケーションは、並列でも並列でもありません。つまり、すべてのタスクを1つずつ順番に処理します。

アプリケーションは、並列と並行の両方になります。つまり、マルチコアCPUで同時に複数のタスクを同時に処理します。

並行性

並行性は、最低2つ以上のタスクについて話すときに本質的に適用可能です。アプリケーションが実質的に同時に2つのタスクを実行できる場合、それを同時アプリケーションと呼びます。ここでは、タスクの実行は同時に行われますが、基本的にはそうではありません。各タスクがそのタスクの一部を実行し、待機状態に移行するオペレーティングシステムのCPUタイムスライシング機能を利用します。最初のタスクが待機状態になると、CPUは2番目のタスクに割り当てられ、タスクの一部を完了します。

したがって、タスクの優先度に基づいたオペレーティングシステムは、CPUやその他のコンピューティングリソースを割り当てます。メモリ;すべてのタスクに順番に進み、完了する機会を与えます。エンドユーザーにとっては、すべてのタスクが並行して実行されているようです。これは並行性と呼ばれます。

平行度

並列処理では、2つのタスクが存在する必要はありません。各タスクまたはサブタスクに1つのコアを割り当てることにより、CPUのマルチコアインフラストラクチャを使用して、タスクの一部を文字通り物理的に実行しますOR複数のタスク。

並列処理には、本質的に複数の処理ユニットを備えたハードウェアが必要です。シングルコアCPUでは、並行性は得られますが、並列性は得られません。

非同期メソッド

これは同時性や並列性とは関係ありません。非同期は同時または並列タスクの印象を表現するために使用されますが、現在のアプリケーションから離れて作業を行う必要があるプロセスには通常非同期メソッド呼び出しが効果的に使用されます。待機して、応答を待っているアプリケーションをブロックします。

71
Vipin Jain

Concurrencyは、各タスクが順番に実行されるのではなく、複数のタスクの実行がインターリーブされるときです。

Parallelismは、これらのタスクが実際に並行して実行されているときです。

enter image description here


非同期は別の概念です(一部のコンテキストでは関連していますが)。これは、あるイベントが別のイベントとは異なる時間に(同期ではなく)発生する可能性があるという事実を指します。以下の図は、同期実行と非同期実行の違いを示しています。アクターは異なるスレッド、プロセス、またはサーバーに対応することができます。

enter image description here

enter image description here

39
Dimos

非同期は並列または並行のいずれかの反意語ではないため、非同期と並列性または同時実行性の関連付けに問題があります。これは、同期の反意語です。これは、何か(この場合はスレッド)が他の何か(この場合は別のスレッド)と同期されるかどうかを示すだけです。

並行性

並行性とは、アプリケーションが同時に(同時に)複数のタスクで進行していることを意味します。コンピューターのCPUが1つしかない場合、アプリケーションは複数のタスクをまったく同時に進行させることはできませんが、アプリケーション内で一度に複数のタスクが処理されます。次のタスクを開始する前に、1つのタスクを完全に終了するわけではありません。

並列処理

並列処理とは、アプリケーションがタスクを複数の小さなサブタスクに分割することを意味します。これらのサブタスクは、たとえば複数のCPUでまったく同時に処理できます。

並行性と並列性の詳細

ご覧のとおり、同時実行性は、アプリケーションが動作する複数のタスクを処理する方法に関連しています。アプリケーションは、一度に1つのタスクを処理する(順次)か、複数のタスクを同時に処理する(同時に)ことができます。

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

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

また、アプリケーションを並列にすることはできますが、同時に実行することはできません。これは、アプリケーションが一度に1つのタスクのみで動作し、このタスクが並行して処理できるサブタスクに分割されることを意味します。

さらに、アプリケーションは、並行でも並列でもありません。これは、一度に1つのタスクのみで機能し、並列実行のためにタスクがサブタスクに分割されることはないことを意味します。

最後に、アプリケーションは、同時に複数のタスクで動作し、並列実行のために各タスクをサブタスクに分割するという点で、並行と並列の両方にすることもできます。ただし、同時実行と並列処理の利点の一部は、このシナリオでは失われる可能性があります。これは、コンピューターのCPUが既に並列処理または並列処理のいずれかでかなりビジー状態に保たれているためです。それを組み合わせると、わずかなパフォーマンスの向上またはパフォーマンスの低下さえもたらされる可能性があります。盲目的に並行並列モデルを採用する前に、必ず分析と測定を行ってください。

から http://tutorials.jenkov.com/Java-concurrency/concurrency-vs-parallelism.html

2
SW DEV07

並行性が発生する可能性のあるシナリオがいくつかあります。

非同期 —これは、プログラムが非ブロッキング操作を実行することを意味します。たとえば、HTTP経由でリモートリソースの要求を開始し、応答の受信を待機している間に他のタスクを実行できます。メールを送信してから応答を待たずに人生を続けるようなものです。

Parallelism —これは、プログラムがマルチコアマシンのハードウェアを活用して、作業をタスクに分割することによりタスクを同時に実行することを意味します。各タスクは個別のコアで実行されます。シャワーで歌うようなものです。実際には、2つのことをまったく同時に行っています。

マルチスレッド —これは、異なるスレッドを同時に実行できるソフトウェア実装です。マルチスレッドプログラムは、シングルコアマシンで実行されている場合でも、同時にいくつかのことを行っているようです。これは、さまざまなIMウィンドウを介してさまざまな人とチャットするようなものです。実際に切り替えを行っていますが、最終的には、同時に複数の会話が行われます。

2
Rahul Agarwal

Parallel:これは、2つのコードが並列実行が「実際」になるポイントまで「同時に」実行されることを意味する広義の用語です。曖昧で単純に聞こえますか?はい。個々の技術的な定義を提供するのではなく、これらの概念の違いの違いに焦点を当てる手助けをしようとしています。

並列性をある程度シミュレートできるため、「本物」と書きました。ゲームなどの多くのシステムは、各実行ループ中に多くのタスクを実行する「並列」サブシステムを実装します(たとえば、それらの一部はエージェントを広範囲に使用します)が、ほとんどの場合、それらは並列であるという意味でのみですそれぞれは、小さな予測可能な順序で実行され、データにランダムにアクセスし、何らかのソフトウェアベースのプリミティブcooperativeマルチタスクは全体を整理しますが、まだ本当に並列ではありません。これは、非常に複雑な順次システムです。

制御できないブラックボックスでコードを実行するように特別に設計されたサードパーティシステム(スレッドまたはCPUコアを提供する基本的なプリエンプティブOS)がある場合、並列処理が現実になると言うかもしれません(ただし、開始し、それらが生成する結果に加えて、投入する可能性のあるミューテックスまたはセマフォ

Concurrent:並列性なしでは並行性はあり得ません(上で説明したように、シミュレートされたものでも実際のものでも)が、この用語は、2つのシステムが同じリソースがある時点で同時に。それはあなたがそれに対処しなければならないという事実に重点を置いています。

非同期:非同期は並列処理とは無関係であると言うことは誰もが正しいことですが、それには道が開かれます(並列処理を行うかどうかはあなたにかかっています-読み続けてください)。

この概念は、並列処理に通常含まれる3つの基本的なことを形式化することにより、並列処理をrepresentする方法として見ることができます。1)タスクの初期化を定義します開始および取得するパラメータ)、2)終了後に実行する必要のあること、3)中間で実行するコードの実行。

しかし、それはまだ構文のみです(通常はコールバックメソッドとして表されます)。背後で、基礎となるシステムは、単にこれらのいわゆる「タスク」が、現在実行中のコードを終了するまで積み重なる単なるコードの断片であると判断する場合があります。そして、それらを1つずつアンパイルし、順番に実行します。か否か。また、タスクごとにスレッドを作成し、それらを並行して実行することもあります。誰も気にしない?その部分は概念に含まれていません;)

1
jeancallisti

ここで解決するセマンティクスが少しあります:

並行性または並列性はリソース競合の問題ですが、非同期は制御フローについてです。

異なる手順(またはその構成要素操作)は、処理の順序の決定論的な実装がない場合、非同期と呼ばれます。言い換えれば、それらのいずれかが任意の特定の時間Tに処理される可能性があります。定義により、複数のプロセッサ(たとえば、CPUまたはPerson)がそれらのいくつかを同時に処理することを可能にします。単一のプロセッサでは、それらの処理はインターリーブされます(スレッドなど)。

非同期の手順または操作は、コンカレントと呼ばれますリソースを共有する;同時実行性は、特定の時間Tにおける競合の明確な可能性です。リソースが共有されていない場合(たとえば、異なるプロセッサとストレージ)には、並列処理が簡単に保証されます。それ以外の場合は、同時実行制御に対処する必要があります。

したがって、非同期プロシージャまたは操作は、他のプロセスと並行して、または同時に処理できます。

0
Evans AB

ここでいくつかの例を説明します

並行性

ウェブサービスはリアルタイムで多数の小さなリクエストを受信し、これらのリクエストのそれぞれを独立して処理する必要があります他のリクエストの。

  • 多くのタスクが実行されます
  • inリアルタイム
  • 異なる実行シーケンス(複数のタスクまたは1つのtaskが可能)呼び出しごとに異なる方法で実行されます)

  • 基本的に応答時間を短縮します

並列処理

[〜#〜] gpu [〜#〜]は、並列処理を使用して同じコードブロックを処理する(AKAkernel)数千の物理的および論理的スレッドで。各カーネルコールは、読み取り/書き込み操作に異なるメモリブロックを使用する場合があります。理想的には、プロセスはすべてのスレッドで同時に開始および終了します。ハイパースレッディングのない単一のCPUコアは、並列処理を実行できません。

  • 1つkernelは複数のプロセッサで実行されます
  • 同時に
  • 単一の実行シーケンス(1つkernelがあり、分岐またはif回避されます)
  • 本質的に速度を上げる

非同期

1つの重いプロセス(I/O操作のような)は、GUIスレッドで実行されている場合、GUIを簡単にブロックできますUIの応答性を保証するために、重いプロセスを非同期に実行できます。同様の非同期操作を一度に1つ実行することをお勧めします。例えば複数のIOにバインドされた操作は、同時に実行すると著しく遅くなる可能性があるため、queue開始して終了することをお勧めします

  • 1つのtaskまたは1つのbatch of tasksが別のスレッドで実行されます
  • one-timeまたはone-at-a-time
  • 同時実行性がないため、実行シーケンスは重要ではありません/適用されません
  • 基本的に速度は低下しますが、別のスレッドへの応答性を提供します

注:同時に実行される非同期操作(つまり、 time)は同時操作です。

0
Bizhan

並行性と並行性:ある時点での並行性は、1つのタスクしか実行できません。例:単一のCPUプロセッサーの並列処理で、複数のタスクを一度に実行できます。例:デュアルコアまたはマルチコアプロセッサ

0
rva