並行性と並列性

マルチスレッドプログラムに関連して並行性と並列性の両方が使用されますが、それらの類似点と相違点については多くの混乱があります。この点での大きな問題は、並行性の並列性かどうかです。両方の用語は非常に似ているように見えますが、上記の質問に対する答えはNOですが、並行性と並列性は同じではありません。さて、それらが同じでない場合、それらの間の基本的な違いは何ですか?

簡単に言うと、並行性は異なるスレッドからの共有状態へのアクセスの管理を扱い、反対側では、並列性は複数のCPUまたはそのコアを利用してハードウェアのパフォーマンスを向上させることを扱います。

並行性の詳細

並行性とは、2つのタスクの実行が重複する場合です。これは、アプリケーションが同時に複数のタスクで進行している状況である可能性があります。それを図式的に理解することができます。次のように、複数のタスクが同時に進行しています。

並行性のレベル

このセクションでは、プログラミングの観点から並行性の3つの重要なレベルについて説明します。

低レベルの並行性

このレベルの並行性では、アトミック操作が明示的に使用されます。このような同時実行性は、エラーが発生しやすく、デバッグが難しいため、アプリケーションの構築に使用することはできません。Pythonでさえ、そのような種類の並行性をサポートしていません。

中間レベルの並行性

この並行性では、明示的なアトミック操作は使用されません。明示的なロックを使用します。Pythonやその他のプログラミング言語は、このような種類の並行性をサポートしています。ほとんどの場合、アプリケーションプログラマーはこの同時実行性を使用します。

高レベルの並行性

この同時実行では、明示的なアトミック操作も明示的なロックも使用されません。Pythonにはconcurrent.futures そのような種類の並行性をサポートするモジュール。

コンカレントシステムのプロパティ

プログラムまたは並行システムが正しくなるためには、いくつかのプロパティがそれによって満たされる必要があります。システムの終了に関連するプロパティは次のとおりです。

正しさのプロパティ

正しさのプロパティは、プログラムまたはシステムが目的の正解を提供する必要があることを意味します。簡単にするために、システムはプログラムの開始状態を最終状態に正しくマップする必要があると言えます。

安全性

安全性とは、プログラムまたはシステムが “good” または “safe” 状態し、何もしません “bad”

活気プロパティ

このプロパティは、プログラムまたはシステムが “make progress” そしてそれはある望ましい状態に達するでしょう。

コンカレントシステムのアクター

これは並行システムの一般的な特性の1つであり、複数のプロセスとスレッドが同時に実行されて、独自のタスクを進行させることができます。これらのプロセスとスレッドは、並行システムのアクターと呼ばれます。

コンカレントシステムのリソース

アクターは、タスクを実行するために、メモリ、ディスク、プリンターなどのリソースを利用する必要があります。

特定のルールセット

すべての並行システムは、アクターによって実行されるタスクの種類とそれぞれのタイミングを定義するための一連のルールを所有している必要があります。タスクには、ロックの取得、メモリ共有、状態の変更などがあります。

コンカレントシステムの障壁

コンカレントシステムを実装する際、プログラマーは次の2つの重要な問題を考慮する必要があります。これらはコンカレントシステムの障壁となる可能性があります。

データの共有

並行システムを実装する際の重要な問題は、複数のスレッドまたはプロセス間でのデータの共有です。実際、プログラマーは、ロックが共有データを保護し、データへのすべてのアクセスがシリアル化され、一度に1つのスレッドまたはプロセスのみが共有データにアクセスできるようにする必要があります。複数のスレッドまたはプロセスがすべて同じ共有データにアクセスしようとすると、すべてではなく、少なくとも1つがブロックされ、アイドル状態のままになります。つまり、ロックが有効な場合、一度に使用できるプロセスまたはスレッドは1つだけであると言えます。上記の障壁を取り除くためのいくつかの簡単な解決策があります-

データ共有の制限

最も簡単な解決策は、変更可能なデータを共有しないことです。この場合、明示的なロックを使用する必要はなく、相互データによる同時実行の障壁が解決されます。

データ構造支援

多くの場合、並行プロセスは同じデータに同時にアクセスする必要があります。明示的なロックを使用する以外の別の解決策は、同時アクセスをサポートするデータ構造を使用することです。たとえば、queueスレッドセーフなキューを提供するモジュール。使用することもできますmultiprocessing.JoinableQueue マルチプロセッシングベースの並行性のためのクラス。

不変のデータ転送

場合によっては、使用しているデータ構造、たとえば同時実行キューが適切でない場合、不変のデータをロックせずに渡すことができます。

可変データ転送

上記の解決策の続きとして、不変データではなく可変データのみを渡す必要がある場合、読み取り専用の可変データを渡すことができると仮定します。

I / Oリソースの共有

並行システムを実装する際のもう1つの重要な問題は、スレッドまたはプロセスによるI / Oリソースの使用です。この問題は、一方のスレッドまたはプロセスがI / Oを長時間使用していて、もう一方がアイドル状態になっている場合に発生します。I / Oの重いアプリケーションで作業しているときに、このような障壁が見られます。これは、例、Webブラウザからのページの要求の助けを借りて理解することができます。重いアプリケーションです。ここで、データが要求される速度がデータが消費される速度よりも遅い場合、並行システムにI / Oバリアがあります。

次のPythonスクリプトは、Webページを要求し、ネットワークが要求されたページを取得するのにかかった時間を取得するためのものです。

import urllib.request

import time

ts = time.time()

req = urllib.request.urlopen('http://www.tutorialspoint.com')

pageHtml = req.read()

te = time.time()

print("Page Fetching Time : {} Seconds".format (te-ts))

上記のスクリプトを実行した後、以下に示すようにページフェッチ時間を取得できます。

出力

Page Fetching Time: 1.0991398811340332 Seconds

ページをフェッチするのに1秒以上かかることがわかります。何千もの異なるWebページをフェッチしたい場合、ネットワークにかかる時間を理解できます。

並列処理とは何ですか?

並列処理は、タスクを同時に処理できるサブタスクに分割する技術として定義できます。これは、前述のように、2つ以上のイベントが同時に発生する並行性とは反対です。それを図式的に理解することができます。タスクは、次のように、並行して処理できるいくつかのサブタスクに分割されます。

並行性と並列性の違いについてさらに理解するには、次の点を考慮してください。

並行しているが並行していない

アプリケーションは並行することはできますが、並行することはできません。つまり、アプリケーションは同時に複数のタスクを処理しますが、タスクはサブタスクに分割されません。

並行しているが並行していない

アプリケーションは並列にすることができますが、並行することはできません。つまり、一度に1つのタスクでのみ機能し、サブタスクに分割されたタスクを並列で処理できます。

並列でも同時でもない

アプリケーションは、並列または同時にすることはできません。これは、一度に1つのタスクのみで機能し、タスクがサブタスクに分割されることはないことを意味します。

並列および同時の両方

アプリケーションは並列と同時の両方にすることができます。つまり、アプリケーションは一度に複数のタスクで動作し、タスクはサブタスクに分割されて並列に実行されます。

並列処理の必要性

サブタスクを単一のCPUの異なるコア間、またはネットワーク内で接続された複数のコンピューター間で分散することにより、並列処理を実現できます。

並列処理を実現する必要がある理由を理解するには、次の重要な点を考慮してください。

効率的なコード実行

並列処理の助けを借りて、コードを効率的に実行できます。パーツ内の同じコードが並行して実行されるため、時間を節約できます。

シーケンシャルコンピューティングよりも高速

シーケンシャルコンピューティングは、物理的および実用的な要因によって制約されます。そのため、より高速なコンピューティング結果を得ることができません。一方、この問題は並列計算によって解決され、順次計算よりも高速な計算結果が得られます。

実行時間の短縮

並列処理により、プログラムコードの実行時間が短縮されます。

並列処理の実際の例について言えば、コンピューターのグラフィックカードは、独立して動作し、同時に実行できる数百の個別の処理コアを備えているため、並列処理の真の力を強調する例です。このため、ハイエンドのアプリケーションやゲームも実行できます。

実装のためのプロセッサの理解

並行性、並列性、およびそれらの違いについては知っていますが、それが実装されるシステムについてはどうでしょうか。ソフトウェアを設計する際に十分な情報に基づいて決定を下すことができるという利点があるため、実装するシステムを理解しておく必要があります。次の2種類のプロセッサがあります-

シングルコアプロセッサ

シングルコアプロセッサは、いつでも1つのスレッドを実行できます。これらのプロセッサはcontext switching特定の時間にスレッドに必要なすべての情報を保存し、後でその情報を復元します。コンテキスト切り替えメカニズムは、特定の1秒以内に多数のスレッドを進行させるのに役立ち、システムが複数のことに取り組んでいるように見えます。

シングルコアプロセッサには多くの利点があります。これらのプロセッサは必要な電力が少なく、複数のコア間に複雑な通信プロトコルはありません。一方、シングルコアプロセッサの速度は制限されており、大規模なアプリケーションには適していません。

マルチコアプロセッサ

マルチコアプロセッサには、複数の独立した処理ユニットがあります。 cores

このようなプロセッサは、各コアに一連の格納された命令を実行するために必要なすべてのものが含まれているため、コンテキスト切り替えメカニズムを必要としません。

フェッチ-デコード-実行サイクル

マルチコアプロセッサのコアは、実行のサイクルに従います。このサイクルは、Fetch-Decode-Executeサイクル。次の手順が含まれます-

フェッチ

これはサイクルの最初のステップであり、プログラムメモリからの命令のフェッチが含まれます。

デコード

最近フェッチされた命令は、CPUの他の部分をトリガーする一連の信号に変換されます。

実行する

これは、フェッチされた命令とデコードされた命令が実行される最後のステップです。実行結果はCPUレジスタに格納されます。

ここでの利点の1つは、マルチコアプロセッサでの実行がシングルコアプロセッサよりも高速であることです。大規模なアプリケーションに適しています。一方、複数のコア間の複雑な通信プロトコルが問題になります。マルチコアは、シングルコアプロセッサよりも多くの電力を必要とします。