私はGoogleでいくつかの調査を行っており、Javaの並行プログラムと並列プログラムの違い(もしあれば)について頭を悩ませることはできません。私が調べた情報のいくつかは、両者の間に違いがないことを示唆しています。これは本当ですか?
誰がそれを定義しているかによります。 Goプログラミング言語を作成した人々 呼び出しコードConcurrent それが並列に処理できるに分割された場合、一方、並列処理は、これらの部分が実際に同時に実行されていることを意味します。
これらはプログラミングの原則であるため、プログラミング言語はそれらの定義方法には関係ありません。ただし、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());
_
上記のコードは、concurrentの方法で記述されています。指定されたコードはいずれも、coolItemを一度に1つずつフィルタリングする必要がないか、呼び出しのみ可能です。 getId()
を一度に1つの項目で、またはリストの最初の項目を、最後の項目の前にフィルターまたはマップする必要があります。 getItems()
から返されるIterable
のタイプに応じて、特定の操作は並列に実行される場合と実行されない場合があります 、しかしあなたが書いたコードはconcurrentです。
また興味深い:
それはあなたの定義に依存すると思いますが、私の理解は大体次のようになります:
私の知る限り、どちらの用語もJava固有ではなく、Java固有のニュアンスもありません。
並列化(または並列処理または並列計算)は、多くの計算が同時に実行される計算の形式です。本質的に、CPU集中型の問題を小さな独立したタスクに分割できる場合、それらのタスクを異なるプロセッサに割り当てることができます
Concurrencyは、多くのアクションを実行しているが、CPUを集中的に使用する必要のないマルチタスクに関するものです。
2つの用語に明確な意味があるとは思いません。どちらも技術用語というよりは芸術用語です。
そうは言っても、私がそれらを解釈する方法は、何かが他のものと同時に実行できる場合はconcurrentであり、parallel複数のスレッドで同時に実行できる場合。私はこの使用法を主に JVMガベージコレクションのドキュメント からとっています。
concurrentマークスイープコレクター、concurrentコレクターまたはCMSとも呼ばれますは、ガベージコレクションの一時停止の影響を受けやすいアプリケーションを対象としています。アプリケーションスレッドの実行中に、ほとんどのガベージコレクションアクティビティを同時に実行します、つまり
そして
CMSコレクターは複数のスレッドを使用して、複数のプロセッサーを搭載したプラットフォームでparallelで同時マーキングタスクを実行します。
確かに、これは非常に具体的なコンテキストであり、一般化することはおそらく賢明ではありません。
スレッドを使用してプログラミングする場合(並行プログラミング)、マシンが複数のスレッドを処理できるかどうかに依存するため、スレッドが実行される(並列実行)とは限りません。
これは視覚的な例です。非スレッドマシン上のスレッド:
-- -- --
/ \
>---- -- -- -- -- ---->>
スレッドマシン上のスレッド:
------
/ \
>-------------->>
ダッシュは実行されたコードを表します。ご覧のとおり、これらは分割されて別々に実行されますが、スレッド化されたマシンは複数の個別の部分を一度に実行できます。
これを参照してください 並行プログラミングと並列プログラミングの違いは何ですか?
Oracleのドキュメント page から:
シングルプロセッサ上のマルチスレッドプロセスでは、プロセッサはスレッド間で実行リソースを切り替えることができるため、同時実行。
共有メモリマルチプロセッサ環境t内の同じマルチスレッドプロセスでは、プロセス内の各スレッドが別々のプロセッサで同時に実行できるため、 並列実行。
プロセスのスレッドがプロセッサの数と同じか少ない場合、スレッドサポートシステムとオペレーティング環境の組み合わせにより、各スレッドが異なるプロセッサで実行されるようになります。
Java SE 7は ForkJoinPool APIを追加することで並列処理をさらに強化しました。
詳細については、以下の投稿を参照してください。
Javaでのスレッドによる並列プログラミング (Java特定)
同時実行と並列処理-違いは何ですか? (言語に依存しない)
並行性は、一度に複数の操作を実行できるアーキテクチャー設計パターンです(並行して実行する必要はありますが、必須ではありません)。
このような操作のシングルコア実行の場合、たとえばコンテキストスイッチングによって並列化を「シミュレート」できます(プログラミング言語が並列実行にスレッドを使用していると想定)。
2つのスレッドがあり、1つがジョブをエンキューするとします。 2番目のジョブは、ジョブが存在するまで待機し、実行のためにそれを取得します。シングルコアプロセッサを使用していますが、どちらも実行されており(キュー経由で)通信しています。
これは同時実行です-スレッドが単一のコアで順次実行される場合でも(共有します)。
同じ演習の並列バージョンは、1つの違いを除いて、似ています。
スレッドの実行は、マルチコアプロセッサで発生します。スレッドは互いに並行して実行され、順次には実行されません(それぞれが独自のコア上で)。