mozblog - もずぶろぐ -

自分のための備忘録や日記など。

並行 (Concurrent) 、並列 (Parallel) 、非同期 (Asynchrony) の違い

これもよく忘れるので、メモ。
情報学的に厳格な定義があるのかは分からないけれど、ネット上をいろいろ調べて、わかった結果を書いておきたいと思います。
# 数学的に厳密な定義とかではありませんので、ご注意ください。

1. 並行 (Concurrent)

並行とは、2 つ以上のタスクが存在する時、同時に処理されているかのように見せること。
例えば、1 つのコアの CPU で複数のタスクを処理する場合、CPU が計算できるタスクは 1 度にひとつなので、ナノ秒ごとのタイムスライスで区切って、タスクに CPU 時間を割り振るが、これは「並行」にあたる。

2. 並列 (Parallel)

並列とは、2 つ以上のタスクが存在する時、それらが同時に処理されること。
例えば、2 つ以上のマルチコア CPU で複数のタスクを処理できるなら、同じ時間でタスクを処理できることになるので、これは「並列」にあたる。

 

「並列であるならば、常に並行である」という定義もある。
「同時に処理されている」(並列)ならば、「同時に処理されているように見える」(並行)なので、たしかに正しい。

一方で、並行はあくまで、「同時に処理されているかのように見せる技法」であり、完全に同時に処理されている場合は並行の定義に含まない、として並行と並列を厳格に分ける定義も存在する。

個人的には、厳密に両者を分けた方が、定義として分かりやすいんじゃないかと思う。

 

3. 非同期 (Asynchrony)

非同期は、直接的に並行・並列と関係する概念ではない。
非同期は、あるタスクを止めず(ブロックせず)に、別のタスクを実行する技法のことであり、並行・並列どちらも実現方法として有り得る。
並行の場合、厳密には数ナノ秒は処理が停止することもあるが、タスクを停止したように見せず、別のタスクを実行できているかのように見えていれば、非同期と言って良い。