web-dev-qa-db-ja.com

スレッディングvsタスクベースvs非同期プログラミング

私はこのコンセプトに不慣れです。これらは同じものですか、異なるものですか?違いはなんですか? 2つのプロセスを同時に実行できるというアイデアが本当に気に入っています。たとえば、プログラムに複数の大きなファイルをロードする場合、一度に1つずつ待つのではなく、できるだけ多くのファイルを同時にロードしたいです。また、wavファイルなどの大きなファイルを操作する場合は、ファイルを細かく分割し、一度に複数のチャンクを処理してから元に戻すのが良いでしょう。この種のことを行う方法を学ぶために何を調べたいですか?

編集:また、私はマルチコアプロセッサで複数のコアを使用することを知っていますが、非同期プログラミングは、必ずしも複数のコアを使用しているとは限りません。利用するコアが複数ない場合、なぜこれを行うのですか?

22
Rob Allsopp

それらは関連していますが異なります。

スレッディング、通常はマルチスレッディング、と呼ばれ、単一のプロセス内で複数の実行スレッドを使用することを指します。これは通常、同時に実行する必要がある、または同時に実行することでメリットを得られる可能性のあるさまざまなタスクを実行する小さなスレッドのセットを使用する単純なケースを指します。たとえば、GUIアプリケーションに1つのスレッド描画要素があり、別のスレッドがマウスクリックなどのイベントに応答し、別のスレッドがバックグラウンド処理を行う場合があります。

ただし、それぞれが独自の処理を行うスレッドの数が極端になると、通常は エージェントベースのアプローチ について話し始めます。

タスクベースのアプローチは、ソフトウェア工学における特定の戦略を指し、抽象的な用語では、達成する「タスク」を動的に作成し、これらのタスクはタスクによってピックアップされますタスクを実行できるスレッドにタスクを割り当てるマネージャー。これは、ソフトウェアアーキテクチャ上のものです。ここでの利点は、プログラム全体の実行がリレーされる一連のタスクであることです(タスクAが終了した->タスクBをトリガーする、タスクBとタスクCの両方が完了したとき->タスクDをトリガーするなど)。各タスクを次々に実行する大きな関数またはプログラムを作成する必要があります。これにより、他のタスクよりも時間がかかるタスクが明確でない場合や、タスクが疎結合されている場合に柔軟性が得られます。通常、これは thread-pool (タスクが割り当てられるのを待機しているスレッド)といくつかの message-passing interface(MPI) で実装され、データとタスクの「契約」.

非同期プログラミングは、マルチスレッドプログラミングを指していませんが、2つは非常に頻繁に関連付けられています(互いに連携しています)。 synchronousプログラムは、次のステップに進む前に各ステップを完了する必要があります。 asynchronousプログラムはステップを開始し、最初のステップの結果を必要としない他のステップに移動し、結果が必要なときに最初のステップの結果をチェックします。

つまり、同期プログラムは、「このタスクを実行する」、「完了するまで待機する」、「結果を使用して何かを実行する」、および「他の何かに移動する」のようになります。対照的に、非同期プログラムは「タスクを開始しますが、後で結果が必要になりますが、今は必要ありません」、「その間、別のことをする」、「最初のステップの結果が出るまで他に何もできないので、準備ができていない場合はそれを待って」、「別のことに移る」。

「非同期」は 非常に広い概念 を指すことに注意してください。これは、従来の「今すぐ実行」ではなく、何らかの「何らかの作業を開始し、いつ完了したかを教えてください」という形式を常に伴います。これはマルチスレッド化を必要とせず、その場合はソフトウェア設計の選択になります(コールバック関数など、非同期の結果の「通知」を提供するために必要になることがよくあります)。複数のスレッドを使用すると、非同期タスクの動作中にさまざまなことを並行して実行できるため、より強力になります。極端に言えば、タスクベースのアプローチ(非同期プログラミング手法の一種)のようなより本格的なアーキテクチャになる可能性があります。

あなたが望むものは、さらに別の概念に対応すると思います: Parallel Computing (または並列処理)。このアプローチは、大きな処理タスクを小さな部分に分割し、すべての部分を並行して処理し、結果を結合することを目的としています。 OpenMP またはOpenCL/CUDA( [〜#〜] gpgpu [〜#〜] のようなライブラリを調べる必要があります。つまり、並列処理にマルチスレッドを使用できます。

しかし、どうやら非同期プログラミングは、必ずしも複数のコアを使用しているという意味ではありませんか?

非同期プログラミングでは、複数のスレッドで同時に発生していることは必ずしも必要ではありません。 非同期I/O、のように、OSがシーンの背後であなたに代わって何かを行っている(そしてその作業が終了すると通知する)ことを意味している可能性があります。スレッドを作成します。つまり、ソフトウェア設計の選択です。

利用するコアが複数ない場合、なぜこれを行うのですか?

複数のコアがない場合でも、マルチスレッドは「待機時間」を再利用することでパフォーマンスを向上させることができます(たとえば、ファイルまたはネットワークI/Oで待機している処理、またはユーザーがクリックするのを待機している処理を「ブロックしない」マウスボタン)。つまり、プログラムはそれらの処理を待つ間、有用な作業を実行できます。それ以上に、それはデザインに柔軟性を提供し、物事が同時に実行されているように見せることができ、それはしばしばユーザーをより幸せにします。それでも、マルチコアCPUsの前は、オーバーヘッドが正当化されないことが多いため、マルチスレッドを実行するインセンティブはそれほどありませんでした。

33
Mikael Persson

一般に、これらはすべて言語ではなくデザインに関連していると思います。同じことがマルチコアプログラミングにも当てはまります。

Jimを反映するには、ファイルの読み込みシナリオだけではありません。一般に、マルチスレッド、タスクベース、または非同期プログラミングの真のメリットを実感するには、ソフトウェア全体を同時に実行するように設計する必要があります。

全体像の観点から物事を見てみてください。特定の例の全体的なモデリングを理解し、これらの方法論がどのように実装されているかを確認します。違いがわかりやすく、いつ、どこで、どこを使用するかを理解するのに役立ちます。

1
Xephon