Communicating Sequential Processes
Communicating Sequential Processes (CSP )とは、並行性 に関するプロセス計算 の理論のひとつである。プログラミング言語Occam にも影響を与えた。
CSPは1978年 、アントニー・ホーア が最初に考案し、その後かなり改良されていった。CSPは様々なシステムにおける並行性を記述し検証する、形式仕様記述 ツールとして産業で利用されてきた。たとえば、T9000トランスピュータ やセキュアな電子商取引システムなどの例がある。理論としても、応用範囲を広げる(より大規模なシステムの解析に使えるようにする)などの研究が行われている。
歴史
ホーアの1978年の論文で提示されたCSPは、プロセス計算というよりも本質的には並行プログラミング言語であった。後のCSPとは構文が著しく異なり、数学的に定義された意味論を持っておらず、無制限の非決定性 を表現することはできなかった。本来のCSPでは、並列に動作する有限個の逐次プロセスが同期式のメッセージパッシングで相互に通信するという形式でプログラムを記述していた。その後のCSPとは対照的に、各プロセスには名前が付けられ、メッセージには送信元と送信先の名前が指定されている。たとえば次のプロセス
COPY = *[c:character; west?c → east!c]
は、west という名前のプロセスから文字を繰り返し受信し、その文字を east という名前のプロセスに送信する。並列合成
[west::DISASSEMBLE || X::COPY || east::ASSEMBLE]
では、west という名前を DISASSEMBLE プロセスに割り当て、X という名前を COPY プロセスに割り当て、east という名前を ASSEMBLE プロセスに割り当て、これらを並行に実行する。
その後、ホーアは Stephen Brookes や Bill Roscoe らと共に理論面の改良に取り組み、CSPをプロセス代数的にしていった。この方向性は、同時期にロビン・ミルナー が行っていた Calculus of Communicating Systems(CCS)の研究と相互に影響しあっている。CSPの理論面は1984年に発表され、1985年に出版されたホーアの著書 Communicating Sequential Processes で一般に知られるようになった。2006年9月現在でも、Citeseer によればこの本は計算機科学 分野での引用回数第3位 とされている(ただし、サンプリング方式であるため信頼性は高くない)。このホーアの著書以降、CSPの理論は若干変更されただけである。変更のほとんどは、CSPプロセス解析と検証のための自動化ツールの出現に対応するものである。Roscoe の The Theory and Practice of Concurrency ではこの新たなCSPが解説されている。
概要
名前が示すとおり、CSPは独立したプロセス群がメッセージパッシング によって通信することで相互にやり取りしているものとしてシステムを記述する。しかし、CSPの名称に含まれる "Sequential" (逐次的)という部分は誤解を生じる可能性がある。というのも最近のCSPでは、プロセスは単なる逐次的プロセスだけでなく、より基本的なプロセス群の並列合成で生成されるプロセスも含まれるからである。プロセス間の関係やプロセスが周囲と通信する方法は、各種プロセス代数 演算子を使って表される。このような代数的手法を使うことで、少数のプリミティブ要素から容易に極めて複雑なプロセスを構築できる。
例
簡単なCSPの例として、チョコレートの自動販売機の抽象表現とチョコレートを購入しようとしている人との相互作用を考える。この自動販売機は2つのイベント "coin" と "choc" を扱う。"coin" は代金の投入を表し、"choc" はチョコレートの引渡しを表す。チョコレートを渡す前に代金の支払いを要求する機械は次のように記述される。
V
e
n
d
i
n
g
M
a
c
h
i
n
e
=
c
o
i
n
→
c
h
o
c
→
S
T
O
P
{\displaystyle VendingMachine=coin\rightarrow choc\rightarrow STOP}
支払いに硬貨またはカードを使う人は、以下のようにモデル化される。
P
e
r
s
o
n
=
(
c
o
i
n
→
S
T
O
P
)
◻
(
c
a
r
d
→
S
T
O
P
)
{\displaystyle Person=(coin\rightarrow STOP)\Box (card\rightarrow STOP)}
これら2つのプロセスを並列に置くことで、互いにやり取りできるようにする。合成プロセスの振る舞いは、2つのプロセスが同期しなければならないイベント依存する。すなわち、
V
e
n
d
i
n
g
M
a
c
h
i
n
e
|
[
{
c
o
i
n
,
c
a
r
d
}
]
|
P
e
r
s
o
n
≡
c
o
i
n
→
c
h
o
c
→
S
T
O
P
{\displaystyle VendingMachine\left\vert \left[\left\{coin,card\right\}\right]\right\vert Person\equiv coin\rightarrow choc\rightarrow STOP}
ここで、同期 が "coin" についてのみ必要とされる場合、以下が得られる。
V
e
n
d
i
n
g
M
a
c
h
i
n
e
|
[
{
c
o
i
n
}
]
|
P
e
r
s
o
n
≡
(
c
o
i
n
→
c
h
o
c
→
S
T
O
P
)
◻
(
c
a
r
d
→
S
T
O
P
)
{\displaystyle VendingMachine\left\vert \left[\left\{coin\right\}\right]\right\vert Person\equiv \left(coin\rightarrow choc\rightarrow STOP\right)\Box \left(card\rightarrow STOP\right)}
この合成プロセスを "coin" と "card" というイベントを隠蔽することで抽象化すると、次のようになる。
(
(
c
o
i
n
→
c
h
o
c
→
S
T
O
P
)
◻
(
c
a
r
d
→
S
T
O
P
)
)
∖
{
c
o
i
n
,
c
a
r
d
}
{\displaystyle \left(\left(coin\rightarrow choc\rightarrow STOP\right)\Box \left(card\rightarrow STOP\right)\right)\setminus \left\{coin,card\right\}}
以上から、次の非決定性プロセスが得られる。
(
c
h
o
c
→
S
T
O
P
)
⊓
S
T
O
P
{\displaystyle \left(choc\rightarrow STOP\right)\sqcap STOP}
これは、"choc" イベント後に停止するか、単に停止するプロセスである。言い換えれば、システムを外部から見たものとして上記抽象化を扱えば(すなわち、人間が行った決定を無視すれば)、非決定性が生じる。
形式的定義
形式意味論
文法的に正しいCSPの表現の意味を定義する形式意味論 はいくつかある。CSPの理論には、相互に一貫した表示的意味論 、代数的意味論 、操作的意味論 がある。
表示的意味論
CSPの主な表示的モデルとして、トレースモデル、安定失敗モデル、失敗/発散モデルの3つがある。プロセス表現とこれらモデルとの意味論的マッピングがCSPの表示的意味論となる。
トレースモデルは、そのプロセスが扱う一連のイベント(トレース)でプロセス表現の意味を定義する。例えば、
t
r
a
c
e
s
(
S
T
O
P
)
=
{
⟨
⟩
}
{\displaystyle traces\left(STOP\right)=\left\{\langle \rangle \right\}}
何故なら
S
T
O
P
{\displaystyle STOP}
は何のイベントも扱わないから
t
r
a
c
e
s
(
a
→
b
→
S
T
O
P
)
=
{
⟨
⟩
,
⟨
a
⟩
,
⟨
a
,
b
⟩
}
{\displaystyle traces\left(a\rightarrow b\rightarrow STOP\right)=\left\{\langle \rangle ,\langle a\rangle ,\langle a,b\rangle \right\}}
何故ならプロセス
(
a
→
b
→
S
T
O
P
)
{\displaystyle (a\rightarrow b\rightarrow STOP)}
は、何のイベントも扱わない場合、イベント
a
{\displaystyle a}
を受け付ける場合、イベント
a
{\displaystyle a}
を受け付けた後でイベント
b
{\displaystyle b}
を受け付ける場合の3つのケースがありうるから
より形式的に表せば、プロセス
P
{\displaystyle P}
のトレースモデルでの意味は
t
r
a
c
e
s
(
P
)
⊆
Σ
∗
{\displaystyle traces\left(P\right)\subseteq \Sigma ^{\ast }}
として定義される。すなわち、
⟨
⟩
∈
t
r
a
c
e
s
(
P
)
{\displaystyle \langle \rangle \in traces\left(P\right)}
(
t
r
a
c
e
s
(
P
)
{\displaystyle traces\left(P\right)}
は空のシーケンスを含む)
s
1
⌢
s
2
∈
t
r
a
c
e
s
(
P
)
⟹
s
1
∈
t
r
a
c
e
s
(
P
)
{\displaystyle s_{1}\smallfrown s_{2}\in traces\left(P\right)\implies s_{1}\in traces\left(P\right)}
(
t
r
a
c
e
s
(
P
)
{\displaystyle traces\left(P\right)}
はプレフィックスで閉じている)
ここで、
Σ
∗
{\displaystyle \Sigma ^{\ast }}
は考えられる全てのイベントの有限な並びの集合である。
安定失敗モデルはトレースモデルを拒絶集合(refusal set)で拡張したものである。拒絶集合とは、プロセスが実行を拒絶できるイベントの集合
X
⊆
Σ
{\displaystyle X\subseteq \Sigma }
である。失敗(failure)は
(
s
,
X
)
{\displaystyle \left(s,X\right)}
という対で表される。ここで
s
{\displaystyle s}
はトレース、
X
{\displaystyle X}
は拒絶集合であり、トレース
s
{\displaystyle s}
が実行されたときそのプロセスが拒絶するイベント群を表す。安定失敗モデルにおけるプロセスの観測された振る舞いは、
(
t
r
a
c
e
s
(
P
)
,
f
a
i
l
u
r
e
s
(
P
)
)
{\displaystyle \left(traces\left(P\right),failures\left(P\right)\right)}
という対で表される。例えば、
f
a
i
l
u
r
e
s
(
(
a
→
S
T
O
P
)
◻
(
b
→
S
T
O
P
)
)
=
{
(
⟨
⟩
,
∅
)
,
(
⟨
a
⟩
,
{
a
,
b
}
)
,
(
⟨
b
⟩
,
{
a
,
b
}
)
}
{\displaystyle failures\left(\left(a\rightarrow STOP\right)\Box \left(b\rightarrow STOP\right)\right)=\left\{\left(\langle \rangle ,\emptyset \right),\left(\langle a\rangle ,\left\{a,b\right\}\right),\left(\langle b\rangle ,\left\{a,b\right\}\right)\right\}}
f
a
i
l
u
r
e
s
(
(
a
→
S
T
O
P
)
⊓
(
b
→
S
T
O
P
)
)
=
{
(
⟨
⟩
,
{
a
}
)
,
(
⟨
⟩
,
{
b
}
)
,
(
⟨
a
⟩
,
{
a
,
b
}
)
,
(
⟨
b
⟩
,
{
a
,
b
}
)
}
{\displaystyle failures\left(\left(a\rightarrow STOP\right)\sqcap \left(b\rightarrow STOP\right)\right)=\left\{\left(\langle \rangle ,\left\{a\right\}\right),\left(\langle \rangle ,\left\{b\right\}\right),\left(\langle a\rangle ,\left\{a,b\right\}\right),\left(\langle b\rangle ,\left\{a,b\right\}\right)\right\}}
失敗/発散モデルは、失敗モデルを発散(divergence)を扱えるよう拡張したものである。失敗/発散モデルにおけるプロセスは
(
f
a
i
l
u
r
e
s
⊥
(
P
)
,
d
i
v
e
r
g
e
n
c
e
s
(
P
)
)
{\displaystyle \left(failures_{\perp }\left(P\right),divergences\left(P\right)\right)}
という対で表され、
d
i
v
e
r
g
e
n
c
e
s
(
P
)
{\displaystyle divergences\left(P\right)}
は発散を生じさせる全トレースの集合である。また、
f
a
i
l
u
r
e
s
⊥
(
P
)
=
f
a
i
l
u
r
e
s
(
P
)
∪
{
(
s
,
X
)
|
s
∈
d
i
v
e
r
g
e
n
c
e
s
(
P
)
}
{\displaystyle failures_{\perp }\left(P\right)=failures\left(P\right)\cup \left\{\left(s,X\right)\vert s\in divergences\left(P\right)\right\}}
が成り立つ。
応用
初期の重要なCSPの応用例として、INMOS T9000 トランスピュータ の仕様記述と検証に使われた例がある。T9000 は複雑なスーパースケーラ 型パイプラインプロセッサであり、大規模マルチプロセッシング可能なように設計されている。CSP はパイプラインの正当性検証と、Virtual Channel Processor というチップ間通信管理機能の検証に使われた。
ソフトウェア設計におけるCSPの応用は、主に人命に関わるような重要なシステムでなされている。例えば、Bremen Institute for Safe Systems と Daimler-Benz Aerospace は、国際宇宙ステーション で使用予定のシステム(約23,000行のコード)をCSPでモデル化し、デッドロックやライブロックが起きないことを検証した。このモデル化と解析によって、通常のソフトウェアテストでは検出が困難な問題をいくつか発見した。同様に Praxis High Integrity Systems でもセキュアなスマートカード認証システム(約100,000行のコード)の開発でCSPを使い、セキュリティとデッドロックが発生しないことの検証を行った。Praxis はシステムの欠陥率が他の同等のシステムよりも低くなったと主張している。
CSP はメッセージ交換を行う複雑なシステムのモデル化と解析に適しているため、通信プロトコルやセキュリティプロトコルの検証にも応用されてきた。特筆すべき応用例として、Needham-Schroeder 公開鍵認証プロトコルをCSPを使って検証し、未知の脆弱性を発見し、それに対処した新たなプロトコルを開発した例がある。
ツール
長年に渡って、CSPを使ってシステムを表現することで解析するツールがいくつも生み出されてきた。初期のツールはコンピュータが理解できるCSPの表現もまちまちだったため、ツール間で情報を共有できなかった。しかし最近では Bryan Scattergood の記法 CSPM が多くのCSPツールで使われている。CSPM には操作的意味論 の形式定義があり、組み込みの関数型言語 が含まれる。
もっとも有名なCSPツールとして Formal Systems Europe Ltd. が開発した商用製品である Failures/Divergence Refinement 2 (FDR2 ) がある。FDR2 はモデルチェッカ とされることが多いが、技術的には改良チェッカである。すなわち、2つのCSPプロセス表現をラベル付き遷移系に変換し、指定された意味論モデル(トレース、失敗、失敗/発散)において、一方がもう一方の改良となっているかを調べる。
他にも以下のようなCSPツールがある。
関連する形式手法
CSP の影響を受けているその他の形式手法や仕様記述言語として、以下のものがある。
脚注
1 2 3 4 Roscoe, A. W. (1997年). The Theory and Practice of Concurrency . Prentice Hall. ISBN 0-13-674409-5
この書籍に関連したリンクはこちら にある。全文は PS 形式かPDF 形式で Bill Roscoe のこちら のリストからダウンロード可能。
↑ INMOS (1995年5月12日). occam 2.1 Reference Manual . SGS-THOMSON Microelectronics Ltd.. https://www.wotug.org/occam/documentation/oc21refman.pdf , INMOS document 72 occ 45 03
1 2 Hoare, C. A. R. (1978年). “Communicating sequential processes”. Communications of the ACM 21 (8): 666-677. doi :10.1145/359576.359585 .
1 2 Barrett, G. (1995年). “Model checking in practice: The T9000 Virtual Channel Processor”. IEEE Transactions on Software Engineering 21 (2): 69-78. doi :10.1109/32.345823 .
1 2 Hall, A; R. Chapman (2002年). “Correctness by construction: Developing a commercial secure system” . IEEE Software 19 (1): 18-25. https://www.anthonyhall.org/c_by_c_secure_system.pdf .
↑ Creese, S. (2001年). Data Independent Induction: CSP Model Checking of Arbitrary Sized Networks . D. Phil.. Oxford University .
1 2 Hoare, C. A. R. . Communicating Sequential Processes . Prentice Hall. ISBN 0-13-153289-8
この本はオックスフォード大学コンピュータ研究所の Jim Davis が改版しており、新版は Using CSP というサイトでPDF形式でダウンロード可能。
↑ William Clinger (1981年6月). Foundations of Actor Semantics . Mathematics Doctoral Dissertation. MIT. https://dspace.mit.edu/handle/1721.1/6935 .
↑ Brookes, Stephen; C. A. R. Hoare and A. W. Roscoe (1984年). “A Theory of Communicating Sequential Processes”. Journal of the ACM 31 (3): 560-599. doi :10.1145/828.833 .
↑ 計算機科学では、計算が終了しないか、例外的な状態で終了する場合、その計算は発散すると言われる、そうでない場合は収束すると言われる。プロセス計算など、計算が無限に続くことが予想される領域では、計算が生産的でない場合(すなわち、有限の時間内に行動を生み出し続けることができない場合)に、計算が発散すると言われる。
↑ Buth, B.; Kouvaras, M.; Peleska, J.; Shi, H. (1997年12月). “Deadlock analysis for a fault-tolerant system”. Proceedings of the 6th International Conference on Algebraic Methodology and Software Technology (AMAST’97) . pp. 60– 75.
↑ Buth, B.; Peleska, J.; Shi, H. (1999年1月). “Combining methods for the livelock analysis of a fault-tolerant system”. Proceedings of the 7th International Conference on Algebraic Methodology and Software Technology (AMAST’98) . pp. 124– 139.
↑ Lowe, G. (1996). “Breaking and fixing the Needham-Schroeder public-key protocol using FDR” . Tools and Algorithms for the Construction and Analysis of Systems (TACAS) . Springer-Verlag. pp. 147– 166.
↑ Scattergood, J.B. (1998年). The Semantics and Implementation of Machine-Readable CSP . D.Phil.. Oxford University Computing Laboratory.
↑ A.W. Roscoe (1994年). Model-checking CSP . In A Classical Mind: essays in Honour of C.A.R. Hoare . Prentice Hall.