コンピュータサイエンスでは、通信シーケンシャルプロセス( CSP ) は、並行システムにおける相互作用のパターンを記述するための形式言語です。[ 1 ]これは、チャネルを介したメッセージパッシングに基づくプロセス代数またはプロセス計算として知られる並行性の数学理論のファミリーのメンバーです。CSP は、 occamプログラミング言語の設計に大きな影響を与えました[ 1 ] [ 2 ]また、Limbo [ 3 ] RaftLib、 Erlang [ 4 ] Go [ 5 ] [ 3 ] Crystal、 Clojureのcore.async [ 6 ]などのプログラミング言語の設計にも影響を与えました。
CSPは1978年の論文でトニー・ホーアによって初めて記述され[ 7 ]、その後大幅に発展しました[ 8 ] 。CSPは、T9000トランスピュータ[ 9 ]やセキュアな電子商取引システム[ 10 ]など、さまざまなシステムの並行処理の側面を規定および検証するためのツールとして、産業界で実際に適用されています。CSPの理論自体も、その実用的な適用範囲を拡大する(例えば、扱いやすく分析できるシステムの規模を拡大する)研究を含め、現在も活発な研究の対象となっています[ 11 ] 。
Hoareが1978年に発表した最初の論文で提示されたCSPのバージョンは、本質的にはプロセス計算ではなく並行プログラミング言語でした。後のバージョンのCSPとは構文が大きく異なり、数学的に定義された意味論を持たず[ 12 ] 、無制限の非決定性を表現することもできませんでした[ 13 ]。オリジナルのCSPのプログラムは、同期メッセージパッシングのみで相互に通信する固定数の逐次プロセスの並列合成として記述されていました。後のバージョンのCSPとは対照的に、各プロセスには明示的な名前が割り当てられ、メッセージの送信元または宛先は、意図する送信または受信プロセスの名前を指定することによって定義されました。たとえば、プロセス
コピー = *[c:文字; west?c → east!c]
という名前のプロセスから文字を繰り返し受信しwest、その文字をという名前のプロセスに送信するeast。並列合成
[west::DISASSEMBLE || X::COPY || east::ASSEMBLE]
westプロセスDISASSEMBLE、XプロセスCOPY、eastプロセスにそれぞれ名前を割り当てASSEMBLE、これら 3 つのプロセスを同時に実行します。[ 7 ]
CSP のオリジナル版の発表後、Hoare、Stephen Brookes、AW Roscoe はCSP の理論を現代のプロセス代数形式に発展させ、改良しました。CSP をプロセス代数に発展させるアプローチは、 Robin Milnerの通信システム計算(CCS) の研究に影響を受け、またその逆も然りです。CSP の理論版は、1984 年に Brookes、Hoare、Roscoe による論文[ 14 ]で最初に発表され、その後、1985 年に出版されたHoare の著書Communicating Sequential Processes [ 12 ]で紹介されました。2006年 9 月の時点で、この本はCiteseerによると、史上3 番目に多く引用されたコンピュータ サイエンスの参考文献でした(ただし、サンプリングの性質上、信頼性の低い情報源です)。CSP の理論は、Hoare の著書の出版以来、いくつかの小さな変更を受けています。これらの変更のほとんどは、CSP プロセスの分析と検証のための自動化ツールの出現によって動機づけられたものです。Roscoe のThe Theory and Practice of Concurrency [ 1 ]では、この新しいバージョンの CSP について説明しています。
CSPの初期の重要な応用例の一つは、大規模マルチプロセッシングをサポートするように設計された複雑なスーパースカラパイプラインプロセッサであるINMOS T9000トランスピュータの要素の仕様と検証に使用されたことである。CSPは、プロセッサパイプラインと、プロセッサのオフチップ通信を管理する仮想チャネルプロセッサの両方の正しさを検証するために使用された。[ 9 ]
CSP のソフトウェア設計への産業応用は、通常、信頼性と安全性が重要なシステムに焦点を当ててきました。たとえば、ブレーメン安全システム研究所とダイムラー・ベンツ・エアロスペースは、国際宇宙ステーションで使用することを目的とした障害管理システムとアビオニクスインターフェース (約 23,000 行のコードで構成) をCSP でモデル化し、モデルを分析して、設計にデッドロックやライブロックがないことを確認しました。[ 15 ] [ 16 ]モデリングと分析のプロセスにより、テストだけでは検出が困難だった多くのエラーが明らかになりました。同様に、Praxis High Integrity Systems は、セキュアなスマートカード認証局のソフトウェア (約 100,000 行のコード) の開発中に CSP モデリングと分析を適用し、設計が安全でデッドロックがないことを検証しました。Praxis は、このシステムは同等のシステムよりもはるかに欠陥率が低いと主張しています。[ 10 ]
CSPは複雑なメッセージ交換を含むシステムのモデリングと分析に適しているため、通信およびセキュリティプロトコルの検証にも適用されています。この種の応用の顕著な例として、LoweがCSPとFDRリファインメントチェッカーを使用して、 Needham–Schroeder公開鍵認証プロトコルに対するこれまで知られていなかった攻撃を発見し、その攻撃を阻止できる修正プロトコルを開発したことが挙げられます。[ 17 ]
その名の通り、CSPは独立して動作し、メッセージパッシング通信のみを介して相互作用するコンポーネントプロセスという観点からシステムを記述することを可能にします。しかし、現代のCSPではコンポーネントプロセスをシーケンシャルプロセスとして定義することも、より基本的なプロセスの並列合成として定義することもできるため、CSPの名称にある「シーケンシャル」という部分は、やや不適切な表現と言えるでしょう。異なるプロセス間の関係、および各プロセスが環境とどのように通信するかは、さまざまなプロセス代数演算子を用いて記述されます。この代数的なアプローチを用いることで、少数の基本要素から非常に複雑なプロセス記述を容易に構築できます。
CSPは、そのプロセス代数において、イベントとプリミティブプロセスという2種類のプリミティブを提供する。
イベントは通信または相互作用を表します。イベントは瞬時に発生するものと想定され、外部の「環境」がプロセスについて知ることができるのは、イベントの通信のみです。イベントは、環境が許可する場合にのみ通信されます。プロセスがイベントを提供し、環境がそれを許可する場合、そのイベントは通信されなければなりません。イベントは、原子名(例:on、off)、複合名(例:valve.open、valve.close)、または入出力イベント(例:mouse?xy、screen!bitmap)のいずれかです。すべてのイベントの集合は、次のように表されます。[ 18 ]
原始的なプロセスは基本的な振る舞いを表します。例としては、(即座にデッドロックするプロセス)(すぐに正常に終了するプロセス)。[ 18 ]
CSPには幅広い代数演算子があります。主なものは、以下のように非公式に示されます。
接頭辞演算子は、イベントとプロセスを組み合わせて新しいプロセスを生成します。たとえば、イベントを伝達しようとするプロセスその環境と、その後プロセスのように動作する[ 18 ]
プロセスは再帰を使用して定義できます。CSP 用語には、プロセス方程式で与えられる再帰プロセスを定義する 再帰は相互に定義することもできます。 これは、通信を交互に行う相互再帰的なプロセスのペアを定義する。そして[ 18 ]
決定論的(または外部)選択演算子を使用すると、プロセスの将来の進化を 2 つのコンポーネント プロセス間の選択として定義でき、環境がプロセスのいずれかに対する初期イベントを伝達することによって選択を解決できます。たとえば、初期イベントを伝達しようとするプロセスそしてそしてその後は、または環境がどの初期イベントを伝達するかによって異なる。[ 18 ]
非決定論的(または内部)選択演算子は、プロセスの将来の進化を2つの構成要素プロセス間の選択として定義することを可能にしますが、環境がどちらの構成要素プロセスが選択されるかを制御することを許可しません。たとえば、どちらのようにも振る舞うことができるまたは受け入れを拒否することができますまたはそして、環境が両方を提供する場合にのみコミュニケーションを行う義務がある。そして。
選択の両側の初期事象が同一である場合、一見決定論的な選択に意図せず非決定論が導入される可能性がある。例えば、 そして 同等である。[ 18 ]
インターリーブ演算子は、完全に独立した並行アクティビティを表します。両方の役割を果たすそして同時に。両方のプロセスのイベントは時間的に任意にインターリーブされます。インターリーブは、たとえそして両方とも決定論的である:そして両方とも同じイベントを伝えることができる、非決定論的に、どちらのプロセスがそのイベントを伝達したかを選択する。[ 18 ]
インターフェース並列(または一般化並列)演算子は、コンポーネントプロセス間の同期を必要とする並行アクティビティを表します。インターフェースセット内の任意のイベント両方が揃った場合にのみ発生するそしてそのイベントに参加することができる。[ 18 ]
例えば、そのプロセス要求するそして両方ともイベントを実行できる必要があるそのイベントが発生する前に。つまり、そのプロセスはと同等、 その間と同等(つまり、プロセスがデッドロック状態になる)。
隠蔽演算子は、一部のイベントを環境から観測できないようにすることで、プロセスを抽象化する手段を提供する。プロセスはイベントが設定されました隠れた。
隠蔽の簡単な例はこのイベントが表示されません単純に以下になります隠蔽されたイベントはτアクションとして内部化され、環境からは見えず、制御もできません。隠蔽の存在は、発散と呼ばれる追加の挙動を引き起こし、τアクションの無限シーケンスが実行されます。これはプロセスによって捉えられます。τ アクションを永遠に実行することだけを行う。[ 18 ]例えば、と同等。
CSPの典型的な例の一つは、チョコレートの自動販売機と、チョコレートを購入したい人とのやり取りを抽象的に表現したものです。この自動販売機は、「コイン」と「チョコレート」という2つの異なるイベントを実行できる可能性があります。これらはそれぞれ、支払いの投入とチョコレートの提供を表します。チョコレートを提供する前に支払い(現金のみ)を要求する機械は、次のように記述できます。
コインやカードを使って支払いを行う人については、以下のようにモデル化できる。
これら2つのプロセスは並列に実行できるため、互いに相互作用することができます。複合プロセスの動作は、2つの構成要素プロセスが同期しなければならないイベントに依存します。したがって、
一方、「コイン」のみで同期が必要な場合は、
この後者の複合プロセスを「コイン」と「カード」のイベントを隠すことによって抽象化すると、
非決定論的プロセスを得る
これは、何らかの「衝撃」イベントが発生して停止するか、あるいは単に停止するかのどちらかのプロセスです。言い換えれば、抽象化をシステムの外部視点(例えば、その人物の決定過程を見ていない人)として扱うと、非決定論が導入されることになります。
CSPの構文は、プロセスとイベントを組み合わせる「合法的な」方法を定義します。eをイベント、bをブール値、Xをイベントの集合とします。すると、CSPの基本構文は次のように定義できます。
なお、簡潔にするため、上記の構文では、分岐を表すプロセス、およびアルファベット順の並列、パイプ処理、インデックス付き選択などのさまざまな演算子。
CSPには、構文的に正しいCSP表現の意味を定義する、いくつかの異なる形式意味論が組み込まれています。CSPの理論には、相互に矛盾のない表示的意味論、代数的意味論、および操作的意味論が含まれます。
CSP の 3 つの主要な表示モデルは、トレースモデル、安定障害モデル、および障害/分岐モデルです。プロセス表現からこれら 3 つのモデルへの意味マッピングにより、CSP の表示意味論が提供されます。[ 1 ]
表示的意味論では、プロセスの細分化の部分順序を複数定義することができ、それによってプロセスのいくつかの特性をエレガントに表現することができます。一般に、意味する精製する。
トレースモデルでは、プロセス式の意味を、プロセスが実行する一連のイベント(トレース)の集合として定義します。たとえば、
より厳密に言えば、トレースモデルは、 の空でない接頭辞閉部分集合の集合として定義される。トレースモデルにおけるプロセスPの意味は次のように定義される。すなわち、以下の通りである。
どここれは、起こりうるすべての有限な事象のシーケンスの集合です。
安定故障モデルトレースモデルを、イベントの集合である拒否セットで拡張します。プロセスが実行を拒否できるもの。失敗はペアです。は、トレースsと、トレースsを実行した後にプロセスが拒否する可能性のあるイベントを識別する拒否セットXから構成される。安定障害モデルにおけるプロセスの観測された動作は、ペアによって記述される。。 例えば、
失敗/乖離モデル障害モデルをさらに拡張して、分岐を処理する。障害/分岐モデルにおけるプロセスのセマンティクスはペアである。どこは、プロセスが直ちに分岐する可能性のあるすべてのトレースの集合の拡張閉包として定義され、これは、あらゆる点で異なる痕跡が見られる。
CSPにおける最も重要な原則の一つに、一意固定点(UFP)ルールがあります。一般的に、このルールは、特定の優れた特性を満たすプロセスは、単一の意味解釈を持つと述べています。これは、CSPモデルにおいて2つのプロセスが等しいことを代数的に証明するために使用できます。ここでは、トレースモデルにおける単一再帰の場合のUFPルールの概要を説明します。
プロセスをトレースセットとして考えます。すべてのプロセスに対して定義されています、 全てとなることによって、 どこ弦の長さを表します: トレースのセット最大長さこれにより、メトリックを定義できます。.各、、 させて非公式には、ある長さまでトレースが一致するプロセスは、より大きな長さまで一致するプロセスよりも、そのプロセスから「遠い」と言えます。これは完全な距離空間を形成することが示されています。
トレースセット上の関数すべてのプロセスに対して、が構成的 であるのは、 の場合のみである。、、 全て、 もしそれからこれは、関数が構成的であるのは、トレース集合上の距離に関して縮約写像である場合に限る、という意味である。
バナッハの不動点定理により、は構成関数であり、一意の不動点を持つ。つまり、そして再帰的に定義されるプロセスはそしてすると、トレースモデルでは等価になります。UFP は相互再帰 (プロセスのベクトルを使用することによって) や他の CSP モデル (例えば、メトリックを次のように定義することによって(プロセスのトレース障害ペアのトレース部分に関して)。
UFP(およびタルスキの不動点定理)を用いると、単調の場合、再帰項は次のように定義される。意味解釈を持つ、 どこはモデルの最小要素です。トレース、安定故障、故障/分岐モデルでは、(トレースモデルにおいて)。[ 1 ] [ 18 ]
長年にわたり、CSP を使用して記述されたシステムを分析および理解するためのツールが数多く開発されてきました。初期のツール実装では、CSP のさまざまな機械可読構文が使用されていたため、異なるツール用に作成された入力ファイルは互換性がありませんでした。しかし、現在ではほとんどの CSP ツールが、ブライアン・スキャッターグッドによって考案された CSP の機械可読方言(CSP Mと呼ばれることもあります)に標準化されています。[ 19 ] CSP M方言の CSP は、組み込み関数型プログラミング言語を含む、形式的に定義された操作的意味論を備えています。
最もよく知られている CSP ツールはおそらくFailures–Divergences Refinement (FDR) であり、これは元々 Formal Systems (Europe) Ltd. によって開発された商用製品です。FDR はモデル チェッカーとして説明されることが多いですが、技術的にはリファインメントチェッカーです。これは、2 つの CSP プロセス式をラベル付き遷移システム(LTS) に変換し、特定の意味モデル (トレース、障害、または障害/分岐) 内で、一方のプロセスが他方のプロセスのリファインメントであるかどうかを判定します。[ 20 ] FDR は、リファインメント チェック中に探索する必要のある状態空間のサイズを削減するために、プロセス LTS にさまざまな状態空間圧縮アルゴリズムを適用します。FDR は、FDR2、FDR3、FDR4 に後継されました。[ 21 ]
アデレード改良チェッカー(ARC)[ 22 ]は、アデレード大学の形式モデリングおよび検証グループによって開発されたCSP改良チェッカーです。ARCは、CSPプロセスを順序付き二分決定図(OBDD)として内部的に表現するという点でFDR2とは異なります。これにより、FDR2で使用されるような状態空間圧縮アルゴリズムを使用する必要なく、明示的なLTS表現の状態爆発問題が軽減されます。
デュッセルドルフ大学ハインリッヒ・ハイネ情報科学研究所が運営する ProB プロジェクト [ 23 ] は、元々は B メソッドで構築された仕様の分析をサポートするために作成されました。しかし、リファインメントチェックとLTL モデルチェックの両方による CSP プロセスの分析もサポートしています。ProBは、CSP と B 仕様を組み合わせたものの特性を検証するためにも使用できます。ProBE CSP アニメーターは FDR3 に統合されています。
プロセス分析ツールキット(PAT) [ 24 ] [ 25 ]は、シンガポール国立大学コンピューティング学部で開発された CSP 分析ツールです。PAT は、CSP および Timed CSP プロセスのリファインメントチェック、LTL モデルチェック、およびシミュレーションを実行できます。PAT プロセス言語は、可変共有変数、非同期メッセージパッシング、および などのさまざまな公平性と定量的時間関連プロセス構造のサポートにより CSP を拡張します。PAT プロセスdeadline言語waituntilの基本的な設計原則は、表現力を高めるために、高レベルの仕様言語と手続き型プログラム (たとえば、PAT のイベントは、シーケンシャル プログラムまたは外部 C# ライブラリ呼び出しである可能性があります) を組み合わせることです。可変共有変数と非同期チャネルは、標準 CSP で使用されるよく知られたプロセスモデリングパターンの便利な構文糖衣を提供します。PAT 構文は CSP Mと似ていますが、同一ではありません。[ 26 ] PAT構文と標準CSP Mの主な違いは、プロセス式を終了させるためにセミコロンを使用すること、変数と代入のための構文糖衣を含めること、および内部選択と並列合成にわずかに異なる構文を使用することです。
VisualNets [ 27 ]は仕様から CSP システムのアニメーションによる視覚化を生成し、時間付き CSP をサポートしています。
CSPsim [ 28 ]は遅延シミュレーターです。CSP のモデルチェックは行いませんが、非常に大規模な (潜在的に無限の) システムを探索するのに役立ちます。
SyncStitch [ 29 ]は、対話型のモデリングおよび分析環境を備えた CSP 改良チェッカーです。グラフィカルな状態遷移図エディタを備えています。ユーザーは、プロセスの動作を CSP 式だけでなく状態遷移図としてもモデル化できます。チェック結果は計算ツリーとしてグラフィカルに表示され、周辺の検査ツールと対話的に分析できます。改良チェックに加えて、デッドロックチェックとライブロックチェックも実行できます。
古典的な非時間制約制約充足問題(CSP)から派生または着想を得た仕様記述言語や形式体系は他にもいくつかあり、以下のようなものがある。
アクターモデルは、メッセージを交換する並行プロセスを扱うという点で、CSPと概ね類似している。しかし、両モデルは提供するプリミティブに関して、根本的に異なる選択をしている。
なお、前述の特性は、必ずしもHoareによるオリジナルのCSP論文を指しているわけではなく、GoやClojureのcore.asyncなどの実装に見られるような、このアイデアの現代的な形態を指していることに注意してください。オリジナルの論文では、チャネルは仕様の中心的な要素ではなく、送信側プロセスと受信側プロセスは実際には互いを名前で識別していました。
1990年、「オックスフォード大学コンピューティング研究所に、技術功績に対する女王賞が授与されました。この賞は、研究所とInmos Ltd.との成功した協力関係を称えるものです。…Inmosの主力製品は「トランスピュータ」で、通常必要となる多くの部品が同じ単一のコンポーネントに組み込まれたマイクロプロセッサです。」[ 31 ] トニー・ホア氏によると、[ 32 ] 「INMOSトランスピュータは、マイクロプロセッサが端子間を伸びるワイヤを介して相互に通信できるというアイデアを具現化したものでした。創設者は、CSPのアイデアが産業利用に適期であると見込んでおり、それをトランスピュータのプログラミング言語の基礎とし、Occamと呼ばれました。…同社は、これによりハードウェアを通常よりも1年早く提供できたと推定しました。彼らはオックスフォード大学コンピューティング研究所と共同で、技術功績に対する女王賞に応募し、受賞しました。」