「並行計算」の版間の差分
削除された内容 追加された内容
編集の要約なし タグ: 差し戻し済み ビジュアルエディター |
rvv タグ: 手動差し戻し |
||
1行目:
'''並行計算'''(へいこうけいさん、{{lang-en-short|concurrent computing}})とは、コンピュータプログラムにおいて複数の相互作用を及ぼす計算タスクの(同時)[[並行性|並行的]]実行を指す。'''並行コンピューティング'''あるいは'''並行処理''' (concurrent processing) とも呼ぶ。
{{プログラミング・パラダイム}}▼
== 概要 ==▼
汎用的なコンピュータおよび[[オペレーティングシステム]]では、ごく短時間で実行タスクを切り替えて複数のタスクを疑似的に同時実行することのできる[[マルチタスク]]システムが採用されることが多い。そして個々のタスクは、通常別々の[[プログラム (コンピュータ)|プログラム]]として実装されるか、1つのプログラムから複数の[[プロセス]]や[[スレッド (コンピュータ)|スレッド]]を生成する形で実装される。そのようなプログラムを作成することを'''並行プログラミング'''と呼ぶ。タスク群は1つのプロセッサ([[CPU]]における1つのコア)上で動作する場合、複数のプロセッサ([[マルチコア]]プロセッサもしくはマルチソケットプロセッサ)上で動作する場合 ([[マルチプロセッシング]])、あるいはネットワークを介した[[分散コンピューティング|分散システム]]で動作する場合が考えられる。並行コンピューティングは[[並列コンピューティング]]と近い概念だが、タスク間の相互作用を重視する点が後者とは異なる。また、並列処理はスループットの改善が目的だが、並行処理は主にシステムの応答性の改善が目的である。▼
並行計算システムの設計における主要な課題は、タスク間の相互作用や通信の順序付けとタスク間で共有するリソースへのアクセスである。並行計算のパイオニアとしては、[[エドガー・ダイクストラ]]、Per Brinch Hansen、[[アントニー・ホーア]]が挙げられる。
▲== 概要 ==
▲汎用的なコンピュータおよび[[オペレーティングシステム]]では、ごく短時間で実行タスクを切り替えて複数のタスクを疑似的に同時実行することのできる[[マルチタスク]]システムが採用されることが多い。そして個々のタスクは、通常別々の[[プログラム (コンピュータ)|プログラム]]として実装されるか、1つのプログラムから複数の[[プロセス]]や[[スレッド (コンピュータ)|スレッド]]を生成する形で実装される。そのようなプログラムを作成することを並行プログラミングと呼ぶ。タスク群は1つのプロセッサ([[CPU]]における1つのコア)上で動作する場合、複数のプロセッサ([[マルチコア]]プロセッサもしくはマルチソケットプロセッサ)上で動作する場合 ([[マルチプロセッシング]])、あるいはネットワークを介した[[分散コンピューティング|分散システム]]で動作する場合が考えられる。並行コンピューティングは[[並列コンピューティング]]と近い概念だが、タスク間の相互作用を重視する点が後者とは異なる。また、並列処理はスループットの改善が目的だが、並行処理は主にシステムの応答性の改善が目的である。
== 並行
並行計算システムには、並行コンポーネント間の通信を抽象化してプログラマから隠蔽するものもあ
; [[共有メモリ]]通信
20 ⟶ 17行目:
: 並行コンポーネント群はメッセージを交換することで通信を行う([[Erlang]]、[[Occam]])。メッセージの交換は非同期的に行われるか(「送って祈る」とも言われるが、一般にメッセージ受信が確認できないときはメッセージを再送する)、送信側がメッセージの受信を確認するまでブロック状態となって待つランデブー方式を使用する。メッセージパッシングによる並行性は共有メモリによる並行性よりも直感的に理解しやすい。また、一般にメッセージパッシングの方が頑健だが低速である。メッセージパッシングシステムを分析し理解するための数学的理論が数々存在する。例えば、[[アクターモデル]]や各種[[プロセス代数]]である。
==
並行計算の主要な課題の1つは、並行プロセスが互いの邪魔をしないようにすることである。共有リソース<code>balance</code>で表される預金口座からの引き落としを行う擬似コードを以下に例として挙げる。
<syntaxhighlight lang="java" line start="1">
32 ⟶ 29行目:
<code>balance=500</code>として、2つの並行プロセスがそれぞれ<code>withdraw(300)</code>と<code>withdraw(350)</code>という引き落としを行ったとする。両方の処理の2行目が両方の3行目の処理の前に行われると、<code>balance > withdrawal</code>はどちらも<code>true</code>となり、両方の処理で減算に進む。しかし、そうすると総引き落とし額は口座残高を超えてしまう。このような共有リソースにからむ問題は[[並行性制御]]を必要とするか、[[Lock-freeとWait-freeアルゴリズム]]のようなノンブロッキング・アルゴリズムを必要とする。
並行システムは共有リソース(通信媒体を含む)に依存しているため、並行計算は一般にリソースへのアクセスに関する何らかの[[調停回路]]を実装する必要がある。これにより[[無制限の非決定性]]問題が生じる可能性が出てくるが、調停回路を注意深く設計すればその可能性を限りなくゼロに近づけることができ
だが、リソース上の衝突問題への解決策は数々あるが、それら解決策は複数のリソースが関わってきたときに、新たな[[並行性]]問題([[デッドロック]]など)を生じる。
== 並行計算モデル ==▼
並行計算モデルはいくつか存在し、並行システムの分析と理解に使用される。以下に主なものを列挙する:▼
* [[アクターモデル]]▼
* [[ペトリネット]]▼
* [[プロセス代数]]▼
** [[Communicating Sequential Processes]]▼
* [[並行論理プログラミング]]▼
* [[並行制約プログラミング]]▼
== 並行プログラミング言語 ==
並行プログラミング言語は、[[並行性]]のための構造を備えた[[プログラミング言語]]である。具体的には、[[マルチスレッド]]、[[分散コンピューティング]]、{{仮リンク|メッセージパッシング型プログラミング|en|Message passing programming|label=メッセージパッシング}}、共有[[リソース]]([[並列ランダムアクセス機械|共有メモリ]])、[[Future パターン|Futureパターン]]のサポートなどである。
{{いつ範囲|date=2019年1月|現在}}、並行性のための構造を備えた最も一般的な言語は[[Java]]と[[C Sharp|C#]]である。これらの言語は共有メモリ型並行性モデルを基本とし、[[モニタ (同期)|モニタ]]によるロックを備えている(メッセージパッシングモデルを共有メモリモデル上に構築することも可能)。メッセージパッシング型並行性モデルの言語としては、[[Erlang]]が最もよく使われている。
研究目的で開発された並行プログラミング言語([[Pict]]など)は実用を目的としたものより多い。しかし、Erlang、Limbo、Occam といった言語は過去20年間、何度も商用に使われてきた実績がある。並行プログラミング言語として重要と思われるものを以下に列挙する:
*[[Ada]]
73 ⟶ 66行目:
*[[Oz (プログラミング言語)|Oz]] – マルチパラダイム言語。共有メモリとメッセージパッシング、Futureも備えている。
**[http://www.mozart-oz.org/ Mozart Programming System] – [[クロスプラットフォーム|マルチプラットフォーム]]版 Oz
*
*[[Occam]] – [[Communicating Sequential Processes]] (CSP) の影響を強く受けている。
**Occam-π – [[Occam]]の派生言語。[[ロビン・ミルナー|ミルナー]]の
*
*SALSA – インターネット上での分散コンピューティングを指向したメッセージパッシング式の言語。
*SR – 研究用言語。
他の多くの言語でもライブラリの形で並行性をサポートしている(機能的にも上記リストに挙げたものと遜色ない)。
▲== 並行計算モデル ==
▲並行計算モデルはいくつか存在し、並行システムの分析と理解に使用される。以下に主なものを列挙する:
▲* [[アクターモデル]]
▲* [[ペトリネット]]
▲* [[プロセス代数]]
** [[アンビエント計算]]
** [[Calculus of Communicating Systems]]
▲** [[Communicating Sequential Processes]]
** [[π計算]]
▲* [[並行論理プログラミング]]
▲* [[並行制約プログラミング]]
== 関連項目 ==
* [[並列計算]]
* [[:en:Message passing]]
* [[:en:Ptolemy Project]]
==参考文献==
96 ⟶ 100行目:
{{デフォルトソート:へいこうけいさん}}
[[Category:並行計算|*へいこうけいさん]]▼
[[Category:オペレーティングシステムの仕組み]]
▲[[Category:並行計算|*へいこうけいさん]]
[[Category:エドガー・ダイクストラ]]
{{並列コンピューティング}}{{コンピュータ科学}}
|