プログラミング学習で躓くポイントの一つとして、「並列プログラミング」があります。
「並行」と「並列」は字面が似ているので、同じような意味…と思っていましたが実は違いました。
あるとき僕は気づいたんです。
仕事で進捗報告をするときに「案件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:☆☆をする |
逐次処理・並行処理・並列処理をまとめると以下のようになります。
コア | スレッド | プロセス | |
---|---|---|---|
逐次処理 | シングル | シングル | マルチ |
並行処理 | シングル | マルチ | マルチ |
並列処理 | マルチ | マルチ | マルチ |
並列処理は、並行処理に内包される概念です。
並列処理の場合は並行処理であると云えますが、
並行処理の場合は、必ずしも並列処理であるとはいえません。
「並行」と「並列」、字面は似ていてもその概念は全く違っていたんですね。この概念を習得することが並列プログラミングの習得への第一歩といえます。
View Comments
大変参考になりました。
ありがとうございます。