【プログラミング入門】並行と並列の違いを理解する

プログラミング学習で躓くポイントの一つとして、「並列プログラミング」があります。
「並行」と「並列」は字面が似ているので、同じような意味…と思っていましたが実は違いました。

あるとき僕は気づいたんです。
仕事で進捗報告をするときに「案件Aと案件Bを並行して進めています。」とは言うけど
「案件Aと案件Bを並列して進めています。」とは言ってないということを。
ここにヒントがあったのです。

ということでこの記事では、上図を例に並行処理と並列処理の違いについて説明していこうと思います。

逐次処理とは


並行処理と並列処理の違いについて説明する前に逐次処理について説明します。
逐次処理とは「タスクを順番に実行する」という意味です。
最初に実行したタスクが完了してからでないと、次のタスクを開始することができません。

解説
シングルコア・シングルスレッドでタスクを処理する場合、逐次処理になります。

逐次処理の考え方

以下のように、タスク1~3は、5つの作業に分割でき、作業1~5まで完了するとそのタスクが完了したと考えたとき、逐次処理は次のようにイメージできます。
(※各作業の所要時間は5分とする。)

タスク1 タスク2 タスク3
作業1:〇〇をする 作業1:〇〇をする 作業1:〇〇をする
作業2:□□をする 作業2:□□をする 作業2:□□をする
作業3:△△をする 作業3:△△をする 作業3:△△をする
作業4:✕✕をする 作業4:✕✕をする 作業4:✕✕をする
作業5:☆☆をする 作業5:☆☆をする 作業5:☆☆をする

並行処理とは

並行とは英語でconcurrentといいます。

ある時点では1つの作業しかしていないが、タスク1とタスク2の作業を交互に進めることによって、2つのタスクが進行しているように見えています。
1日という単位の中では2つのタスクが論理的に同時に進行している状態と言えます。
これを並行といいます。

解説
シングルコア・マルチスレッドでタスクを処理する場合、並行処理になります。

並行処理の考え方

以下のように、タスク1~3は、5つの作業に分割でき、作業1~5まで完了するとそのタスクが完了したと考えたとき、並行処理は次のようにイメージできます。
(※各作業の所要時間は5分とする。)

タスク1 タスク2 タスク3
作業1:〇〇をする 作業1:〇〇をする 作業1:〇〇をする
作業2:□□をする 作業2:□□をする 作業2:□□をする
作業3:△△をする 作業3:△△をする 作業3:△△をする
作業4:✕✕をする 作業4:✕✕をする 作業4:✕✕をする
作業5:☆☆をする 作業5:☆☆をする 作業5:☆☆をする

注意

シングルコアの場合、スレッド切り替えが発生した分、パフォーマンスが悪化する可能性もあるため、必ずしも早くなるとは限りません。

並列処理とは

並列とは英語でparallelといいます。

どの時点においても、タスク1とタスク2が同時に進行していることになります。
1日という単位の中では2つのタスクが物理的に同時に進行している状態と言えます。
これを並列といいます。

解説
マルチコア・マルチプロセスでタスクを処理する場合、並列処理になります。

並列処理の考え方

以下のように、タスク1~3は、5つの作業に分割でき、作業1~5まで完了するとそのタスクが完了したと考えたとき、並列処理は次のようにイメージできます。
(※各作業の所要時間は5分とする。)

タスク1 タスク2 タスク3
作業1:〇〇をする 作業1:〇〇をする 作業1:〇〇をする
作業2:□□をする 作業2:□□をする 作業2:□□をする
作業3:△△をする 作業3:△△をする 作業3:△△をする
作業4:✕✕をする 作業4:✕✕をする 作業4:✕✕をする
作業5:☆☆をする 作業5:☆☆をする 作業5:☆☆をする

まとめ

逐次処理・並行処理・並列処理をまとめると以下のようになります。

コア スレッド プロセス
逐次処理 シングル シングル マルチ
並行処理 シングル マルチ マルチ
並列処理 マルチ マルチ マルチ
注意

並列処理は、並行処理に内包される概念です。
並列処理の場合は並行処理であると云えますが、
並行処理の場合は、必ずしも並列処理であるとはいえません。

「並行」と「並列」、字面は似ていてもその概念は全く違っていたんですね。この概念を習得することが並列プログラミングの習得への第一歩といえます。

issiki_wp

View Comments