並行計算とは
並行計算(Concurrent computing)とは、複数の計算や処理を、あたかも同時に実行しているかのように見せる計算形態のことです。実際には、一つのプロセッサ上で複数のタスクを切り替えながら実行したり、複数のプロセッサで並列に実行したりします。
並行計算とよく混同されるのが
並列計算(parallel computing)です。
並列計算: 複数のプロセッサを使って、独立した計算を同時に実行します。そのため、マルチプロセッサ環境が前提となります。処理速度を向上させるために利用されます。
並行計算: 一つのプロセッサで複数のタスクを切り替えながら実行したり、複数のプロセッサで並列に実行したりします。タスク間の相互作用や
リソース共有に重点が置かれます。
並列計算はスループットの向上を目的とするのに対し、並行計算はレイテンシの低減を目的とすると言えるでしょう。
並行計算の仕組み
並行計算では、複数のタスクが協調して動作します。各タスクは、他のタスクの完了を待たずに実行できます。複数のタスクを効率的に実行するために、タイムシェアリングなどの技術が用いられます。
マルチタスクOSでは、複数の
プロセスやスレッドが生成され、それぞれがタスクの担い手となります。
並行計算における課題
並行計算システムの設計において、最も重要な課題は、タスク間の相互作用や通信の順序付け、共有
リソースへのアクセス制御です。
複数のタスクが共有
リソースに同時にアクセスしようとすると、競合状態、デッドロック、
リソース欠乏などの問題が発生する可能性があります。これらの問題を解決するためには、クリティカルセクションのロック
同期などの
並行性制御技術が必要になります。
並行計算のモデル
並行計算を実現するための様々なモデルが提案されています。以下はその一部です。
ペトリネット
データフローアーキテクチャ
プロセス代数
通信システム計算
通信シーケンシャルプロセス
アクターモデル
π-計算
アンビエント計算
入力/出力オートマトン
ソフトウェアトランザクショナルメモリ
アトミックコミット
一貫性モデル
一貫性モデルは、複数の
プロセス/スレッドが同時にデータ領域に読み書きを行っても、シーケンシャル計算と同じ結果が得られるようにするためのモデルです。
並行計算の実装
並行プログラムは、
オペレーティングシステムが提供する
プロセスやスレッドの同時走行とその相互通信を利用して実装されます。
複数の
プロセスやスレッドを同時に実行することで、複数の作業を同時に進めることが可能になります。これは
マルチタスクと呼ばれます。
並行コンポーネント間の通信
並行コンポーネント間の通信には、主に以下の2つの方法があります。
1.
共有メモリ通信
複数のコンポーネントが共有メモリの内容を更新することで通信を行います。
JavaやC#などがこの方法を採用しています。
クリティカルセクションを定め、ロックオブジェクトを用いて同期を行います。
セマフォ、ミューテックス、モニタなどの
同期機構が利用されます。
2.
メッセージパッシング通信
複数のコンポーネントがメッセージを交換することで通信を行います。
Erlang、Go、Scalaなどがこの方法を採用しています。
メッセージ交換は通常非同期で行われますが、同期的に行うことも可能です。
非
同期メッセージパッシングでは、送信側は受信側の応答を待たずにメッセージを送ることができます。
メッセージパッシング通信は共有メモリ通信よりも平易で堅牢ですが、オーバーヘッドが大きいという側面もあります。
並行
プログラミング言語とは、
並行性をサポートするための機能を持つ
プログラミング言語のことです。マルチスレッド、
分散コンピューティング、メッセージパッシング、共有メモリなどの機能を備えています。
現在、最も一般的な並行
プログラミング言語は
JavaとC#です。これらの言語は共有メモリ型の
並行性モデルを基本としています。
メッセージパッシング型の
並行性モデルを基本とする言語としては、
Erlangが最もよく使われています。
以下に、代表的な並行
プログラミング言語をいくつか挙げます。
Ada
Afnix
Alef
Alice
CDL
ChucK
Cilk
Clojure
Concurrent C
Concurrent Clean
Concurrent Pascal
Corn
Curry
Cω
E
Eiffel
Erlang
Janus
Join Java
Joule
KL1
Limbo
Oz
Mozart Programming System
MultiLisp
Occam
Occam-π
Pict
SALSA
SR
これらの他にも、多くの
プログラミング言語がライブラリの形で
並行性をサポートしています。
まとめ
並行計算は、現代のコンピュータシステムにおいて不可欠な技術です。
並行性を効果的に活用することで、システムのパフォーマンスを向上させ、より複雑な問題を解決することができます。
並行計算を理解し、適切に利用することで、より効率的で堅牢なシステムを開発することができるでしょう。