どのように動作しますか?

どのように動作しますか?

私はbashシェルの並行性と並列性について少し混乱しています。私が理解したように、同時に複数のサブシェルでコマンドを実行すると、そのコマンドはさまざまなプロセッサコアで並列に実行されます。

例えば。

cmd1 & cmd2 & cmd3 & 

ここで、「&」記号は各コマンドのバックグラウンド(サブシェルとも呼ばれる)で同時に実行されます。別の方法でサブシェルで作成できます。 (かっこ内に書いたりパイプを使用したりするのと同じです。)

この方向から、私はこれらの質問に対する答えを知りたいです。

  • Bashはサブシェルを介して並列性を提供します。一方、Bashでも並行性を達成する他の方法はありますか?私が知っている限り、並行性は単一のCPUが断続的にタスクを実行することによって機能します。これを達成するには、外部でメソッドを実装する必要がありますか?あるいは、bashはすでにこのように動作します(並行性)。
  • 並列処理を使用してすべてのCPUコアを占有すると、システムがクラッシュしますか?それともこの状況に対する保護メカニズムはありますか?
  • 私が使用するパラレルツールとサブシェルが提供するGNUパラレルツールの違いは何ですか? GNU Parallelツールがうまく機能している場合、どうすればこれを達成できますか?
  • 「並列」または「同時」のどちらがより効率的ですか?
  • 通常のタスク(コマンドを順次実行)とは異なり、「並列」または「同時」タスクを実行するとどのような不利益が発生しますか?

答え1

どのように動作しますか?

「並行性は、単一のCPUが断続的にタスクを実行するように動作します」と言います。http://ncce.io/wall-building

並行性は単一のプロセッサで実行できるため、多くのコアが必要なく、すべて使用しているかどうかは重要ではありません。

利用可能なコアがある場合、コアよりもプロセスが多くなるまで上記の技術は使用されません。

管理手数料があります:

  • 作成プロセス:MS-Windowsよりはるかに高速ですが、まだオーバーヘッドがあります。
  • プロセス間通信。
  • 同時実行:多くのプロセスが同時に実行されているように見えます(他のプロセスを実行するように切り替えるには少し労力が必要です)。

バッシュは何をしますか?

Bashは新しいプロセスを作成し、オペレーティングシステムのカーネルが残りのタスクを実行します。プロセス(すべてのプロセス)が新しいプロセスを作成すると、カーネルはそれを同じ方法で処理します。これはPythonでこれを行う方法の例です。https://ctrlaltdelor.wordpress.com/2019/06/01/creation-of-an-interprocess-pipe-in​​​-python-the-unix-gnu-linux-way/

答え2

私が理解したように、同時に複数のサブシェルでコマンドを実行すると、そのコマンドはさまざまなプロセッサコアで並列に実行されます。

いいえ、まったく真実ではありません。複数のコマンドを実行すると、システムで同時に実行されます。

コマンドが並行して実行されると言うこともできます。 「並列」という言葉にはいくつかの意味がありますが、オペレーティングシステムの設計について話すとき、一般的に「並行性」と同義です。

プロセスには特定のコアは割り当てられません。システムはすべてのプロセスを同時に実行します。より正確には、カーネルはすべての[スレッド]を実行します(より正確にはすべて)同時に、プロセスには複数のスレッドがあります。

コアがアイドル状態の場合、カーネルは他のコアでまだ実行されていない実行するアクションがあるスレッド(準備されたスレッド)を選択して、しばらくアイドルコアで実行します。時間分割が終わると、カーネルは別のスレッドを選択する式に進みます。あるコアから別のコアにスレッドを移動すると、一部のリソースが消費されますが、消費量が非常に少ないため、スレッドは通常、あるコアから別のコアに頻繁に移動します。

並行性は、すべてのスレッドが同じコアで実行されるという意味ではありません。

ここで、「&」記号は各コマンドのバックグラウンド(サブシェルとも呼ばれる)で同時に実行されます。別の方法でサブシェルで作成できます。 (かっこ内に書いたりパイプを使用したりするのと同じです。)

これらのコマンドはバックグラウンドで実行されますが、外部コマンドの場合は実行されません。サブシェル。サブシェルは、別のプロセスで実行されているか、別のプロセスで実行されているかのように動作するスクリプトの一部です(歴史的に、すべてのサブシェルは別々のプロセスで実行されましたが、一部の最新のシェルではこれを最適化できます)。

両方とも左右に同時に&実行されます。|

あなたが「並列性」と呼ぶことは単に起こらないので、他のほとんどすべての質問は議論の余地があります。

答え3

私が使用するパラレルツールとサブシェルが提供するGNUパラレルツールの違いは何ですか? GNU Parallelツールがうまく機能している場合、どうすればこれを達成できますか?

ここでは、「より良い」がキーワードです。高速ではありませんが(1タスク&あたり約0.5ms、GNU Parallelは1タスクあたり約5msかかります)、より多くの制御を提供します。

  • 混合出力を防ぎます。seq 100000 & seq 100000 &出力が混在しています。
  • 限られた数のジョブを連続して並行して実行できます。
  • リモートでジョブを実行できます。
  • テンプレートと複数の入力からコマンドラインを生成できます。
  • 失敗した操作を再試行できます。

いくつか言えば。

関連情報