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


177

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

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


8
「非同期」という用語は、さまざまなことを意味します。これらの用語は関連していますが、ばらばらの事柄については説明していません。意味は重複し、状況によって異なります。
先のとがった

2
したがって、最初の同時実行性は同時に2つ以上のプロセスを実行しています。それが邪魔にならない限り、同時実行は並列ではありません。並列プロセスは2つ以上のコアを必要としますが、並行プロセスは単一コアを時間共有できます。
Rick O'Shea

回答:


139

並列と並列は、あなたが正しく推測するのと実質的に同じ原理であり、両方が同時に実行されているタスクに関連していますが、並列タスクは「同時に」実行される真のマルチタスクである必要があると言いますが、並列はタスクが並列実行しているように見える実行スレッド。

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

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

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


編集

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


34
最初の段落では並列性と並行性が混同されていると思います。並行性とは、複数の実行スレッドを管理することを指します。並列処理とは、より具体的には、複数の実行スレッドが同時に実行されることです。並行性とは、並列処理を包含することができるより広い用語です。
Mark H

7
2つの単語は非常によく似ており、混乱する可能性があります(多くの場合、同じです)が、定義は異なります。同時=既存、発生、または同時に実行。並列=同一または異なるデバイスによる、一度に複数の操作の見かけまたは実際のパフォーマンスの、またはそれに関連する。ご覧のように、並列は必ずしも同時実行を意味するものではなく、単に同時実行のように見える場合もあります。結局のところ、単語はしばしば同じ意味で使用され、n devを使用すると、おそらくn + 1の定義を取得できる部屋になります;)
Lazarus

3
@Mehrdad辞書の単語の定義をマーケティング資料での使用に基づいて定義する場合は、多少不利になる可能性があります。
Lazarus

6
違う。プログラミングの文脈では、同時実行とは、同時に実行できるロジックのビットにコードを「構成」できる機能です。並列処理(同時実行と組み合わせる場合)は、上記のコードを取得して、100コアマシンで実行します。
フランクRadocaj 14

2
@FrankRadocajはそれを正しく持っています。同時実行とは、プログラムを任意の順序で実行でき、明確な結果を持つユニット(基本的にはスレッド)に分割できることを意味します。並列とは、これらのユニット/スレッドが文字通り同時に複数のプロセッサで実行されていることを意味します。

89

要するに、

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

並行性と並列性は同じものではないことを覚えておいてください。

同時実行と並列処理の違い

次に、並行性と並列性の顕著な違いをリストアップしましょう。

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

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

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

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

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

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

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

並行性

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

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

並列処理

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

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

非同期メソッド

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


2
非常に役立ちます。ありがとう
Neha 2018

非同期と並行性についてはまだ混乱しています。「非同期にタスクを実行する」および「タスクを同時に実行する」というフレーズが使用されるのを見てきました。タスクを非同期で実行することとタスクを同時に実行することは同じことを意味しているように見えますか?
ムーンドラ

1
@Moondra非同期タスクはシングルスレッドで実行され、マルチスレッドとは関係ありません。非同期タスクは、アプリケーションの外部の外部プロセス(データベース、ファイルリーダーなど)にタスクを送信します。これらはIOプロセスであり、コールバックがプロセスに追加され、IOプロセスが完了したときにアクションを実行します。一部のプログラミング言語には、非同期タスクを呼び出すと別の新しいスレッドを作成する「非同期」機能があるか
わかり

56

並行性とは、各タスクが次々に順次実行されるのではなく、複数のタスクの実行がインターリーブされる場合です。

並列処理とは、これらのタスクが実際に並行して実行されている場合です。

ここに画像の説明を入力してください


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

ここに画像の説明を入力してください

ここに画像の説明を入力してください


6
シンプルで効果的なイラスト。
contactmatt 2018年

1
同時実行は非同期と同じですか?
nos

1
これら2つの概念は非常に近いですが、実際は同じではありません。実際には、非同期はアクション間の相互作用(AとBなど)とより関連しています。一方(B)は他方(A)によってトリガーされ、2番目のアクションは最初のアクションが完了するのを待つかどうかです。並行性は、互いに無関係である可能性のあるアクションのより一般的な用語であり、それらが順番に実行されるか、それらの実行がインターリーブされるかどうかを示します。
Dimos

1
したがって、非同期とは主にブロッキングと非ブロッキングのことです
ダニエル

15

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


12

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

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

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

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


これらは本当に良いアナロジーです!ありがとう。並列性はマルチスレッド定義で定義できると言ってもいいでしょうか?したがって、同時実行性=シングルコアでのマルチスレッド化は同時に発生しているように見えますが、実際には非常に迅速に切り替えられていますか?
wongz

3

並行性

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

並列処理

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

同時実行と並列処理の詳細

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

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

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

また、アプリケーションは並列であることができますが、同時ではありません。つまり、アプリケーションは一度に1つのタスクでのみ機能し、このタスクは並列処理できるサブタスクに分割されます。

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

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

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


3

平行:これは、2つのコードが「同時に」実行することを意味する広義の用語です。それが「実際の」並列処理であるか、または巧妙な設計パターンによって偽造されているかは問題ではありません。ポイントは、「タスク」を同時に開始し、それらを個別に制御できることです(ミューテックスと適切なすべてのトリックを使用)。しかし、通常、「並列」という単語は、「真の」並列処理にのみ使用することを好む:たとえば、非協調的マルチタスキング(CPU / GPUコアに影響を与えるか、OSに管理を任せることによってソフトウェアレベルでのみ)非常に低いレベルで)。たとえば、ブラウザウィンドウのJavaScriptに見られるような、並列処理を装った複雑なシーケンシャルコードの場合に限り、「並列」とは言いたがりません。したがって、このスレッドの人々が「非同期は並列処理とは何の関係もない」と言う理由。まあそれはありますが、それらを混同しないでください。

同時:並列処理なしでは並行性はあり得ません(上記で説明したように、シミュレーションか実際かを問わず)。この用語は、2つのシステムが特定の時点で同時に同じリソースにアクセスしようとするという事実に特に焦点を当てています。それはあなたがそれに対処しなければならないという事実に重点を置きます。

非同期:非同期は並列処理とは無関係であると誰もが言うとおりですが、それはそれへの道を開きます(物事を並列にするかどうかは負担です-読み続けてください)。

「非同期」とは、通常並列処理に関係する3つの基本的なことを形式化する並列処理の表現を指します。1)タスクの初期化を定義します(たとえば、タスクの開始時と取得するパラメーター)、2)終了後に実行する必要があること、3)中間でコードが実行し続けるべきこと。

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


2

ここで明らかにするセマンティクスが少しあります:

同時実行または並列処理はリソースの競合の問題ですが、非同期は制御フローに関するものです。

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

非同期の手順または操作は、リソース共有する場合、同時実行と呼ばれます。同時実行性は、任意の時点Tで競合が発生する可能性があることを明確に示しています。並列処理は、リソースが共有されていない場合(たとえば、異なるプロセッサやストレージ)に保証されます。それ以外の場合は、並行性制御に対処する必要があります。

したがって、非同期の手順または操作は、他のユーザーと並行して、または同時に処理できます。


2

同時実行とは、複数のタスクを同時に実行することを意味しますが、必ずしも同時に実行する必要はありません。複数のタスクを実行する必要があるが、リソースが1つしかない場合は、並行処理を行います。シングルコア環境では、同時実行はコンテキストスイッチングによって実現されます。

並列処理は、歌ったりお風呂に入ったりできるように、複数のタスクを同時に実行するようなものです。これで、タスクを並列で実行しています。

非同期は、1つのタスクが実行されたときに非同期モデルのスレッド実行に関連するもので、前のタスクが完了するのを待たずに別のタスクに切り替えることができます。

非同期プログラミングは、並行性を実現するのに役立ちます。マルチスレッド環境での非同期プログラミングは、並列処理を実現する方法の1つです。


2

「同期と非同期はプログラミングモデルです。同時実行と並列は、タスクが実行される方法です...」。ソース:https : //medium.com/better-programming/sync-vs-async-vs-concurrent-vs-parallel-5754cdb60f66

つまり、syncとasyncは、関数呼び出しを行うときのプログラムの実行方法を示します(待機するか、実行を継続しますか?)。同時に、並列処理は、関数(タスク)の実行方法を示します(concurrent =おそらく同時に、並列=効果的に同時に実行されます)。


メディアは情報源ではありません。それは、ある主題についての彼の(誤)理解について話している誰かによる記事であり、彼/彼女を権威にするものではありません。
Moha全能のラクダ

1
それは引用であり、したがって出典です。ここでのほとんどの答えは、どの分野の当局によっても書かれておらず、著者の説明は十分に優れています。
Pedro Boechat

Stackoverflowでは、少なくとも投票システムがあり、それは専門家のコミュニティです。誰でも媒体に何でも書くことができます。2つの間の公平な比較ではありません。
Moha全能のラクダ

1
ここでも誰でも何でも書くことができます。Mediumを選ぶ理由はわかりません。とにかく、私はプロのプログラマーであり、私はこの理解を支持しています。そして、私はそれが比較的短いのでそれがエレガントだと思います。
Pedro Boechat

問題は、Mediumが悪い情報源であるということではなく、問題は、外部ページにリンクするだけの回答は回答ではないということです。この回答にリンクするだけでなく、引用部分を詳しく説明したり、記事の内容を要約したりすると、この回答を大幅に改善できます。
David Schwartz

1

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


1

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


並列処理

GPUが処理するために並列処理を使用してコードの同じブロック(AKA カーネルを物理的および論理的なスレッドの数千に)。理想的には、プロセスはすべてのスレッドに対して同時に開始および終了します。ハイパースレッディングのない単一のCPUコアは、並列処理を実行できません。

注:理想的に言ったのは、6Mスレッドのハードウェアで7M呼び出しのサイズのカーネルを実行する場合、すべての6Mスレッドで同じコードを2回実行し、同時にすべての6Mスレッドを消費する必要があるためです。

  • 1つのカーネル(コードの一部)が複数のプロセッサで実行されます
  • 同時に
  • 単一の実行順序カーネルは、すべてのスレッドで同じことを行う必要がありますので、彼らはすべてのスレッドを同期させるために(無操作)のNOPの多くを作成することにより、大幅にリソースを消費するので、sは回避されている「場合」「分岐」または)
  • 基本的に速度が大幅に増加します
  • できることを大幅に制限する
  • ハードウェアに大きく依存

注:並列処理はGPUに限定されません。


並行性

Webサービスが受け、多くの小さな要求をリアルタイムで、それはいつでも、違ったこれらの要求のそれぞれを処理する必要があり、他の要求または任意の内部ジョブの独立しました。しかし、データの状態やシステムの正常性を損なうことなく、常にWebサービスを稼働させたいと考えています。

ユーザーがレコードを更新し、別のユーザーが同じレコードを同時に削除することを想像してみてください。

  • 多くのタスクが実行されます
  • リアルタイム(またはリクエストが来るたび)
  • 実行シーケンス異なる場合(並列処理のカーネルとは異なり、並行タスクはさまざまなことを実行できるため、キューに入れるか優先順位を付ける必要がある可能性が高い)
  • タスク#2はタスク#1が完了するのを待つ必要がないため基本的に平均応答時間を改善します。
  • 多くのタスクが同時に実行され、リソースが限られているため基本的に計算時間を犠牲にします
  • デッドロックが発生したり、データが破損したりしないように、共有リソースを適切に管理する必要があります。

:これらのリクエストは通常​​、メモリ、データベース接続、帯域幅などのいくつかの重要なリソースを消費します。それでも、Webサービスが常に応答可能である必要があります。非同期性は、同時実行ではなく、応答性を高めるための鍵です


非同期

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

  • 1つのタスクまたはタスクのバッチが別のスレッドで実行される
  • 一度
  • タスクが1つある場合、シーケンスはないので、タスクが完了するのを待つか、起動して忘れます
  • タスクのバッチの場合は、すべてを同時に起動して忘れる、すべてが終了するまで待つ、または各タスクを実行して終了する
  • オーバーヘッドのために、本質的にパフォーマンスが低下します
  • 別のスレッドへの応答性を提供します(UIスレッドまたは他の重要なスレッドのブロックに対して有効)

注:同時に(つまり、一度に複数回)実行される非同期操作は、並行操作です。


注:並行性と非同期性は、しばしば互いに混同されます。並行性とは、システムのさまざまな部分が相互に干渉することなく連携して機能することを指します(これらの問題は、多くの場合、ロック、セマフォ、ミューテックスで解決されます)。非同期性とは、応答性(スレッド化など)を実現する方法です。

*注意:非同期とマルチスレッドは、しばしば互いに混同されます。非同期コードには、必ずしも新しいスレッドが含まれるとは限りません。ハードウェア操作にすることも、Stephanが純粋な操作と呼ぶので、これを読んでください

たとえば、以下のWPF + C#コードでawait Task.Run(()=> HeavyMethod(txt))は、非同期の問題を textBox.Dispatcher.Invoke解決し、並行性の問題を解決しています。

private async void ButtonClick(object sender, RoutedEventArgs e)
{
    // run a method in another thread
    await Task.Run(()=> HeavyMethod(txt));

    // modify UI object in UI thread
    txt.Text = "done";
}

// This is a thread-safe method. You can run it in any thread
internal void HeavyMethod(TextBox textBox)
{
    while (stillWorking)
    {
        // use Dispatcher to safely invoke UI operations
        textBox.Dispatcher.Invoke(() =>
        {
            // UI operations outside of invoke will cause ThreadException
            textBox.Text += ".";
        });
    }
}

0

これらの概念に頭を回すことは、短くて興味深いものにするつもりです。

同時実行と並列 -タスクの実行方法。

実際の例を挙げましょう。巨大なケーキ全体を食べることと、曲全体を歌うことの両方が必要な課題があります。曲全体を歌ってケーキを完成させる最速の人なら勝ちます。したがって、ルールは歌と食事を同時に行うことです。それを行う方法はルールに属していません。ケーキ全体を食べてから、歌全体を歌ったり、ケーキの半分を食べてから、歌の半分を歌ってから、それを繰り返したりすることができます。

並列処理は、タスクが実際に同時に実行される特定の種類の同時実行性です。コンピュータサイエンスでは、並列処理はマルチコア環境でのみ実現できます。

同期と非同期 -プログラミングモデル。

同期して、上から下に順番に実行されるステップとしてコードを記述します。非同期プログラミングモデルでは、コードをタスクとして記述し、同時に実行します。同時に実行するとは、すべてのタスクが同時に実行される可能性が高いことを意味します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.