猫型エンジニアのブログ

プログラム/ネットワーク系の技術関連をまとめたページです 

言語のしくみ その3

 「並列」と「平行」の違いってすっごくわかりにくいですよね...。私も以前相当悩みました。ですがCPUのマルチコア化の傾向は今後も続くため、マルチコアの活用技術が脚光をあびるのは時代の流れなのですね。勉強になります。

マルチコア化への対応技術

ソフトウェア開発者側がコンカレントプログラミングを実装していれば、OSや実行環境がCPUの数に応じて、「並列⇄平行」の切り替えを実施してくれるそうです。この両者の違いに頭を悩ますのは、OSや実行環境の開発者だけなんですね...。

この本では以下のように解説されています。

  • 並列(パラレル):複数の処理の流れを「同時」に行うこと
  • 平行(コンカレント):見かけ上複数の処理の流れを同時に行うこと

「並列」と「平行」の違いに関しては、多分こちらの方がわかりやすいと思います。

  • 実行状態を複数保てるなら「並列」
  • 実行可能状態を複数保てるなら「平行」
  • 「並列」が「平行」を含むのは明らか
  • 「平行」は時分割でスレッド処理
  • 「並列」はマルチコアで処理

並行と並列について-並行コンピューティング技法-を読んで - M-Tea

プロセス

 プロセスはメモリ空間全体をコピーするためコストが高い*1。またプロセス間通信の手段(パイプ・ソケット・ファイル・共有メモリ)が限定的で、さらに通信にあたってはデータ構造をバイトストリーム形式に変換する必要がある。

スレッド

 メモリ空間を共有しコピーは行わないためコストが低くスレッド間の通信も容易だが、データ間の排他制御が煩雑*2になる。

言語レベルでの対応

 上記の問題を解決するために、アクター・Erlang・Go・STM等では言語レベルで今カレントプログラミングをサポートする仕組みが提供されている。

*1:このコストはメモリ消費量と実行時間という2つの観点がある。1プロセス数Kでも1000プロセスで数Gとなる。これはスレッドでも共通だが、システムコールの呼び出しは、特権命令が実行できるカーネル空間への切り替えが必要でCPU命令にすると膨大な数の呼び出しが実行される。

*2:スレッド制御プログラムのデバッグはハイゼンバグと呼ばれ、再現性がないため修正が困難。