何らかの形のマルチコンピューティングによる速度の向上を推定するには、複数のCPUベースのタスクが複数のコンピューティングリソース(通常はプロセッサコア)で同時に実行されているか、またはすべてのタスクが同じリソース-つまり、一部のタスクは1つのシステムサブコンポーネント(ディスクストレージなど)に依存している場合もあれば、別のタスク(周辺デバイスからの通信の受信)に依存している場合もあれば、プロセッサコアの使用が必要な場合もあります。
最初のシナリオは、しばしば「並列」プログラミングと呼ばれます。2番目のシナリオは、「並行」または「非同期」プログラミングと呼ばれることが多いですが、「並行」は、オペレーティングシステムが複数のタスクの実行をインターリーブできるようにする必要があるかどうかに関係なく、そのような実行が必要かどうかに関係なく使用されることもあります直列に配置するか、複数のリソースを使用して並列実行を実現できる場合。後者の場合、「並行」とは、一般に、タスク実行の実際の同時性の観点からではなく、プログラムで実行が書き込まれる方法を指します。
これらすべてについて暗黙の仮定で話すのは非常に簡単です。たとえば、「非同期I / OはマルチスレッドI / Oよりも高速になる」などの主張をすぐに行う人もいます。この主張はいくつかの理由で疑わしい。まず、特定の非同期I / Oフレームワークがマルチスレッドで正確に実装されている場合が考えられます。その場合、それらは同じものであり、1つの概念が他の概念より「速い」と言っても意味がありません。 。
第2に、非同期フレームワークのシングルスレッド実装(シングルスレッドイベントループなど)がある場合でも、そのループが何を行っているかについて想定する必要があります。たとえば、シングルスレッドのイベントループでできるばかげたことの1つは、2つの異なる純粋にCPUにバインドされたタスクを非同期で完了するように要求することです。(最新のハードウェア最適化を無視して)理想的なシングルプロセッサコアのみを備えたマシンでこれを実行した場合、このタスクを「非同期に」実行しても、2つの独立して管理されたスレッドまたは1つの孤立したプロセスで実行する場合と実際に異なることはありません。 -違いは、スレッドコンテキストの切り替えまたはオペレーティングシステムのスケジュールの最適化にある可能性がありますが、両方のタスクがCPUに送られる場合、どちらの場合も同様です。
あなたが遭遇するかもしれない珍しいか愚かなコーナーケースの多くを想像することは役に立ちます。
「非同期」は、たとえば上記のように同時である必要はありません。ちょうど1つのプロセッサコアを備えたマシン上で、2つのCPUバウンドタスクを「非同期」に実行します。
マルチスレッド実行は同時である必要はありません。単一のプロセッサコアを備えたマシンで2つのスレッドを生成するか、2つのスレッドに他の種類の希少なリソース(たとえば、1つしか確立できないネットワークデータベース)を取得するように要求します。一度に接続)。スレッドの実行はインターリーブされる可能性がありますが、オペレーティングシステムスケジューラーは適切であるように見えますが、単一のコア(またはより一般的には、存在するスレッドよりも多くのスレッドを生成する場合)の合計ランタイムは削減できません(スレッドコンテキストの切り替えにより増加します)それらを実行するコア、またはリソースが維持できるものよりも多くのスレッドがリソースを要求する場合)。これと同じことがマルチプロセッシングにも当てはまります。
したがって、非同期I / Oもマルチスレッドも、実行時間に関してパフォーマンスを向上させる必要はありません。彼らは物事を遅くすることさえできます。
ただし、リモートデータベースなどのネットワーク接続されたリソースからデータを取得するためにネットワーク呼び出しを行い、ローカルCPUにバインドされた計算も行う特定のプログラムのように、特定のユースケースを定義すると、次のように推論できます。ハードウェアに関する特定の仮定を与えられた2つの方法のパフォーマンスの違い。
質問:実行する必要のある計算ステップの数と、それらを実行するためにリソースの独立したシステムの数はありますか?独立したシステムサブコンポーネントの使用を必要とし、同時に実行することでメリットを得られる計算ステップのサブセットはありますか?プロセッサコアの数と、複数のプロセッサまたはスレッドを使用して別々のコアでタスクを完了するためのオーバーヘッドはどのくらいですか?
タスクが主に独立したサブシステムに依存している場合は、非同期ソリューションが適している可能性があります。それを処理するために必要なスレッドの数が多く、コンテキストの切り替えがオペレーティングシステムにとって重要なものになる場合は、シングルスレッドの非同期ソリューションの方が適している可能性があります。
タスクが同じリソースにバインドされているときはいつでも(たとえば、同じネットワークまたはローカルリソースに同時にアクセスするための複数のニーズ)、マルチスレッドはおそらく不十分なオーバーヘッドを招き、シングルスレッドの非同期はそのようなリソースでのオーバーヘッドが少なくなる可能性があります。限られた状況でもそれはスピードアップを生み出すことができません。このような場合、唯一のオプション(高速化が必要な場合)は、そのリソースの複数のコピーを利用可能にすることです(たとえば、不足しているリソースがCPUの場合は複数のプロセッサコア)。不足しているリソースの場合、より多くの同時接続をサポートする優れたデータベース接続制限のあるデータベースなどです)。
別の言い方をすると、オペレーティングシステムが2つのタスクの単一リソースの使用をインターリーブできるようにすることは、1つのタスクにリソースを使用させ、他のタスクが待機し、2番目のタスクを順番に終了させるよりも速くはありません。さらに、インターリーブのスケジューラコストは、実際の状況では実際にスローダウンを引き起こすことを意味します。CPU、ネットワークリソース、メモリリソース、周辺機器、またはその他のシステムリソースが交互に使用されるかどうかは関係ありません。