私はGoogleでいくつかの調査を行ってきましたが、Javaの並行プログラムと並列プログラムの違い(もしあれば)について頭を悩ませることはできません。私が見た情報のいくつかは、両方の間に違いがないことを示唆しています。これは本当ですか?
8 に答える
誰がそれを定義しているかによって異なります。Go プログラミング言語を作成した人々は、コードが並列処理できる断片に分割されている場合、コードを Concurrent と呼びますが、Parallelism は、それらの断片が実際に同時に実行されていることを意味します。
これらはプログラミングの原則であるため、プログラミング言語はそれらがどのように定義されているかには関係ありません。ただし、Java 8 には、コードをあまり混乱させることなく、並行処理と並列処理の両方を有効にする機能が追加されます。たとえば、次のようなコードです。
List<Integer> coolItemIds = new List<Integer>();
for(Item item : getItems())
{
if(item.isCool())
{
int itemId = item.getId();
coolItemIds.add(item);
}
}
...これは非並行かつ非並列であり、次のように記述できます(私の構文はおそらく間違っていますが、うまくいけばアイデアが得られます):
Iterable<Item> items = getItems();
Iterable<Item> coolItems = items.filter(item -> item.isCool());
Iterable<Integer> coolItemIds = coolItems.map(item -> item.getId());
上記のコードは並行して記述されています。指定されたコードはいずれも、coolItems を一度に 1 つずつフィルター処理することや、一度getId()
に 1 つのアイテムのみを呼び出すこと、さらにはリストの先頭にあるアイテムを呼び出すことを必要としません。最後のアイテムの前にフィルタリングまたはマッピングする必要があります。Iterable
から返されるのタイプに応じてgetItems()
、指定された操作が並行して実行される場合と実行されない場合がありますが、作成したコードは並行して実行されます。
また興味深い:
- 同時実行は並列処理ではありません(プレゼンテーション ビデオ)
- 並行性は並列性ではありませんか? (StackOverflow に関する議論
定義にもよると思いますが、私の理解は大まかに次のようになります。
- 並行性とは、不特定の順序で発生することを指します。マルチタスキング - タイム スライスによって命令をインターリーブすることで複数のプログラムを実行する - は、この同時実行の感覚を考える良い方法です。
- 並列処理 (または「真の」並列処理) とは、文字通り同時に起こっていることを指します。これには、ハードウェア サポート (コプロセッサ、マルチコア プロセッサ、ネットワーク マシンなど) が必要です。すべての並列処理は並行処理ですが、すべての並行処理が並列処理であるとは限りません。
私の知る限り、どちらの用語も Java 固有のものではなく、Java 固有のニュアンスもありません。
並列化(または並列処理または並列コンピューティング) は、多くの計算が同時に実行される計算の形式です。要するに、CPU を集中的に使用する問題をより小さな独立したタスクに分割できれば、それらのタスクを異なるプロセッサに割り当てることができます。
並行性は、多くのアクションを実行するマルチタスクに関するものですが、CPU を集中的に使用する必要はありません。
私は、この 2 つの用語が明確に定義された明確な意味を持っているとは思いません。どちらも技術用語ではなく芸術用語です。
とはいえ、私がそれらを解釈する方法は、他のことと同時に実行できる場合は並行であり、同時に複数のスレッドで実行できる場合は並列であるということです。この使用法は、主にJVM ガベージ コレクションのドキュメントから引用しています。
コンカレントコレクタまたは CMSとも呼ばれるコンカレント マーク スイープ コレクタは、ガベージコレクションの一時停止に敏感なアプリケーションを対象としています。ほとんどのガベージ コレクション アクティビティは同時に実行されます。つまり、アプリケーション スレッドの実行中に実行されます。
と
CMS コレクターは、複数のスレッドを使用して、複数のプロセッサを搭載したプラットフォームで同時マーキング タスクを並行して実行するようになりました。
確かに、これは非常に特殊なコンテキストであり、一般化することはおそらく賢明ではありません。
スレッドを使用してプログラミングする場合 (並行プログラミング)、マシンが複数のスレッドを処理できるかどうかに依存するため、必ずしもそのように実行されるとは限りません (並列実行)。
これが視覚的な例です。スレッド化されていないマシンのスレッド:
-- -- --
/ \
>---- -- -- -- -- ---->>
スレッド化されたマシンのスレッド:
------
/ \
>-------------->>
ダッシュは実行されたコードを表します。ご覧のとおり、どちらも分割されて別々に実行されますが、スレッド化されたマシンは一度にいくつかの別々の部分を実行できます。
これを参照してください並行プログラミングと並列プログラミングの違いは何ですか?
質問はかなり古いですが、これら2つを非常に明確かつ簡潔に要約したいと思います。
同時実行性- 1 つのアクターによるマルチタスクを考えてみてください
。x 個のプロセス/スレッド (x>1) が同じリソースを求めて競合する場合です。同時実行の場合、2 つのプロセス/スレッドが 1 つの CPU で実行されるとき、それらは実際には並列ではありません。つまり、CPU クロックはプロセスからプロセスへと超高速で切り替えられます。並列処理ですが、これも異なるプロセス/スレッド間で共有される 1 つの CPU です。5 つの命令が実行され、それらが実行されるために CPU のリソースを獲得するために競合するとします。並列処理-各タスクが個別のアクターによって処理される複数のタスクを考えてみてください
。x 個のプロセス/スレッド (x>1) が同時に並列実行される場合です。5 つのプロセス/スレッドがあり、5 つの CPU コアがあるとします。これは、各コアが各スレッド/プロセスを独立して実行できることを意味します。