並行・並列と並行処理・並列処理の違いについてまとめた

毎回調べているのでまとめた

何気なく「並行処理にすると....」だとか「ここは並列処理にして...」という会話をすることが普段多いが、「並行と並列って何が違うのよ?」と前からよく思っていた。その度に、ググっては「あー。そういうことね」と理解するものの、脳内ストレージが揮発性メモリであるため寝て起きたら忘れてしまう。 そんな、明日の自分のためにも

  • 並行と並列
  • 並行処理と並列処理

の違いについてまとめたものを記しておく。
なお、情報の多くは「書籍: 並行コンピューティング技法」を参考にしている。あと付属的にwikipediaやブログ記事など。参考文献にまとめているので、気になる方は参照して下さい。

www.oreilly.co.jp

並行コンピューティング技法についてのまとめ記事を過去に書いているので良ければ合わせて参照下さい。

www.okb-shelf.work

並行と並列の違い

過去記事にも記述しているため、そちらから引用する。

www.okb-shelf.work

並行とは複数の動作を実行可能状態に保てる状態を備えていること
並列とは複数の動作を同時に実行できる場合のこと

影分身をして100人分、一気に修行する(N●RUTO)

  • 並行 -> 修行を開始して修行中の状態
  • 並列 -> 100人に分身が完了した状態


つまりは「並行」と「並列」という言葉は概念であり、コンピューティングに限った話ではない。実際に、並行作業・並行世界、並列回路...だとか様々な派生した単語が存在している。
また先ほどの影分身での修行からも考えることが出来るが、並行という概念は並列という概念を内包している。「並列 ∈ 並行」となっており、並行という概念が実行可能状態を備えているということは100人への分身が完了した直後の状態(並列の概念を内包している)を経過していると考えてみれば自然ではないだろうか。

このように並行と並列というのは割と広い意味をもった概念であり曖昧性が高く、混乱を生みやすい。それに対して並行処理、並列処理はコンピューティングに寄った意味を持っており、おそらく多くの人が知りたいのはそちらになるだろう。

補足: 並行と並列の別意味

ググっているとこういう説明をしているものも多く見受けられる。

  • 並行 -> 複数の現象が同時、あるいはほぼ同時に起こること
  • 並列 -> 複数の現象が同時に起こること

確かに。
以下に説明をしている並行処理と並列処理について理解をしている人が見れば、この説明は妥当だ。「並列 ∈ 並行」という関係性にもなっている。

並行処理と並列処理

並行処理と並列処理は大きく意味が異なる。詳しいことは専門の書籍やスレッディングライブラリのドキュメントを読んでもらればと思うので、抽象的な説明だけをしておく。

並行処理とは1つのコアで高速にコンテキストスイッチ(どのプロセスなりスレッドが実行権限を持つかという権限の切り替え)を切り替えながら、あたかも複数の処理が同時に処理されているように実行する処理である。つまり、実際には本当に同時に複数の処理は実行されていない。並行処理を行う目的は複数の処理を同時に(見えるように)実行して他の処理(多くの場合はメイン処理)をwaitさせないことが目的で、計算処理などの高速化を主にしない。

それに対して並列処理は1つのコアでは実行されずに、プロセッサに存在するマルチコアを利用して(最近はコア数が凄いことになっている)実際に同時に処理を実行している。つまり、本当に同時に複数の処理が実行されている。並行処理とは違い、並列処理では高速化を目的とするため、大規模な演算処理に用いるのが良いだろう。

合わせて、マルチコアでないと並列処理が実行できないというハードウェアの制約もあるため、いつでも並列処理が出来るというわけではない。

おまけ

非同期処理について

せっかくなので、よく引き合いに出されている非同期処理についても説明をしておく。非同期処理は並行処理か並列処理のどちらを利用しても再現可能であり、概念的には並行に所属することになる。

メインの処理の実行とは別にマルチコアなりスレッドなりプロセスなりを利用してサブの処理を実行させたのであれば、それは非同期処理として考えて良いだろう。

参考文献