並列と並行:その違いは?

ただの日記。


金曜日に

ω・`) なるほど、わからん。→ 並列(Parallel)と並行(Concurrent)の違いについて http://togetter.com/li/159203
Welcome to Twitter - Login or Sign up

というツイートを見かけたので、並列(Parallel)と並行(Concurrent)の違いについて - Togetterまとめ を読んでみて、

... 1つの作業をたくさんの人手で同時に行うことがパラレル、並列。並列という名の通り、隣の人とのタスクとは交わらなく、きれいに流れてる印象。その分作業が早く終わる。コンカレント、並行はそれぞれの人が違う作業を行い、結果として一人で行うよりも早い

Welcome to Twitter - Login or Sign up

自分はこのイメージだなー

Welcome to Twitter - Login or Sign up

とつぶやいた。


そして、翌日の土曜日に、4月に Oracle OpenWorld Tokyo 2012 もあることだし、Atelier Ash宇佐見さんにカット&パーマしてもらった。何年か前に妻の祖父母宅に来た時に、妻の妹から「近所の美容室でカットコンテストで優勝した美容師がいる」と聞いて行ってみて以来、他のところでは切ってもらう気がしなくなり、埼玉から通うようになった。
帰り道に 有隣堂 藤沢店 で買った本に「並列」と「並行」の違いが書かれていた。

並行コンピューティング技法 ―実践マルチコア/マルチスレッドプログラミング

並行コンピューティング技法 ―実践マルチコア/マルチスレッドプログラミング

P.2 1.1.2 並列と並行:その違いは?

システムが複数の動作(処理の流れ)を同時に実行状態(in progress)に保てる機能を備えている場合を並行(concurrent)と言い、複数の動作を同時に実行できる場合を並列(parallel)と言います。重要な概念、違いは「実行状態」という点です。
並行アプリケーションは同時に実行状態にある複数のスレッドを内包します。シングルコアプロセッサのシステムで2スレッドを持つアプリケーションが動作する場合では、オペレーティングシステムがスレッドを切り替えます。この時のスレッドは2つとも同時に「実行状態」、すなわち処理をしている最中です。並列実行ではシステムにマルチコアプロセッサが必要です。複数のスレッドがそれぞれにコアを割り当てられ、同時に実行されます。
「並行」は「並列」を包含します。つまり、マルチスレッドやマルチプロセスを駆使する並行アプリケーションを開発したとしても、マルチコアシステムでなければ並列には実行できないということです。並行プログラミング(concurrent programming)/並行性(parallel programing)という概念には単一の問題を解く複数の処理の流れのプログラミング、およびその実行のすべてが含まれます。

自分の理解が誤っていた。
上記の通りだが、一例をあげると、

  • シングルコアプロセッサシステム上である瞬間では1つのタスクしか実行していなくても、タスクを切り替えて複数のタスクを並行して進めることは「並行」だが「並列」ではない。
  • マルチコアシステムで複数のタスクを同時に並列で進めることは「並行」かつ「並列」になる。

ということだと思う。


確かに、ひとに複数のことをお願いするときに「並行してこれもやっといてね」と言うが、「並列して〜」とは言わないな。