言語のしくみ その3
「並列」と「平行」の違いってすっごくわかりにくいですよね...。私も以前相当悩みました。ですがCPUのマルチコア化の傾向は今後も続くため、マルチコアの活用技術が脚光をあびるのは時代の流れなのですね。勉強になります。
マルチコア化への対応技術
ソフトウェア開発者側がコンカレントプログラミングを実装していれば、OSや実行環境がCPUの数に応じて、「並列⇄平行」の切り替えを実施してくれるそうです。この両者の違いに頭を悩ますのは、OSや実行環境の開発者だけなんですね...。
この本では以下のように解説されています。
- 並列(パラレル):複数の処理の流れを「同時」に行うこと
- 平行(コンカレント):見かけ上複数の処理の流れを同時に行うこと
「並列」と「平行」の違いに関しては、多分こちらの方がわかりやすいと思います。
- 実行状態を複数保てるなら「並列」
- 実行可能状態を複数保てるなら「平行」
- 「並列」が「平行」を含むのは明らか
- 「平行」は時分割でスレッド処理
- 「並列」はマルチコアで処理
プロセス
プロセスはメモリ空間全体をコピーするためコストが高い*1。またプロセス間通信の手段(パイプ・ソケット・ファイル・共有メモリ)が限定的で、さらに通信にあたってはデータ構造をバイトストリーム形式に変換する必要がある。
言語レベルでの対応
上記の問題を解決するために、アクター・Erlang・Go・STM等では言語レベルで今カレントプログラミングをサポートする仕組みが提供されている。