TL;DR
独立して進む複数の処理を組み合わせ、同時に扱えるようにプログラムを構成すること。Go の Rob Pike の言葉では、並行処理は多くのことを一度に「扱う」ことで、並列処理は多くのことを一度に「行う」ことである。
なぜ必要か
Go言語で学ぶ並行プログラミング 第1章 によると、並行処理にはスループットの向上と応答性の向上という 2 つのメリットがある。応答性は、タスクの終了を待たずにユーザへ応答できることで、マルチコアかどうかに関係なく得られる。
仕組み
Wikipedia の「並行計算」によると、並行計算では、各スレッドは他のスレッドの完了を待たずにそれぞれ進行できる。並列計算は複数のプロセッサで同時に計算してスループットを上げることを指し、並行計算は 1 つのプロセッサでも複数のタスクに計算を割り振ってレイテンシや応答を改善することを指す。
並行して動く部品どうしの通信には、共有メモリの内容を更新する方式と、メッセージを交換する方式がある。Go は軽量なゴルーチンを並行処理の基本単位にし、並列実行はランタイムとハードウェアに任せる。Erlang のランタイムは、並行処理、分散、障害からの回復を言語の機能として備えている。
注意点
共有リソースへのアクセスを調整しないと、競合状態、デッドロック、リソース枯渇が起きる。一般には、クリティカルセクションをセマフォやミューテックスなどのロックで同期させて防ぐ。