JCSPは、プログラミング言語Javaの通信順次プロセス(CSP)の実装です。[1]
CSP は数学的なシステムですが、JCSP では高度な数学的スキルは必要なく、代わりにプログラマーは単純なルールに従うだけで適切に動作するソフトウェアを実現できます。
概要
マルチスレッドプログラムがテスト不能に失敗する原因は4つあります。[1]
- 競合状態- 複数のスレッドが十分なロックなしで同時にアクセスするため、共有変数の状態が不確定になる場合があります。
- デッドロック– 2つ以上のスレッドがロックやその他のリソースを競合する方法で取得しようとして膠着状態に陥る
- ライブロック– デッドロックに似ていますが、CPU 時間が無限に浪費されます。
- 飢餓状態- 1 つ以上のスレッドが動作せず、ソフトウェア アルゴリズムの意図した結果が損なわれる
一般的に、厳密なテストだけでは、これら 4 つの危険が存在しないことを証明することはできません。厳密なテストは必要ですが、それだけでは十分ではありません。代わりに、これら 4 つの危険が存在しないことを証明できる設計が必要です。CSP では数学を使用してこれを実現でき、JCSP では Java プログラムで実用的に実現できます。
数学的基礎の利点は、従来のアドホック開発で可能であったものよりも、正しい動作をより強力に保証できることです。幸いなことに、JCSP はユーザーに数学的アプローチを強制するのではなく、ライブラリの基礎となる数学の恩恵を受けることができます。
CSP の用語「プロセス」は、基本的にJava 用語のスレッドの同義語として使用されていることに注意してください。CSP のプロセスは、イベントを介して外部と対話する軽量の実行単位であり、操作対象となるデータ構造をカプセル化するアクティブなコンポーネントです。
データのカプセル化はスレッドごと ( CSP 用語ではプロセスごと) に行われるため、通常はスレッド間でデータを共有する必要がありません。代わりに、スレッド間の結合は、明確に定義された通信ポイントとランデブーを介して行われます。利点は、各スレッドを設計時に「シングル スレッド」エンティティと見なすことができるため、開発者は Java のsynchronizedキーワードを使用するかどうか、またどこで使用するかという不確実性から解放され、同時に競合状態が発生しないことが保証されることです。JCSP は、デッドロックがないことが証明される方法でスレッド間通信を設計するための明確な原則を提供します。
標準 Java API ( java.util.concurrent )のクラスと JCSP のクラスには明らかな類似点があります。JCSP のチャネルクラスはBlockingQueueに似ています。重要な違いが 1 つあります。JCSP は入力間の選択を可能にするAlternativeクラスも提供しますが、この機能は標準 Java API にはありません。Alternation は、CSP が現実世界のイベントをモデル化するために使用するコア概念の 1 つです。
代替案は、状態空間の徹底的な数学的分析によって正しく動作することが証明されており、それ自体がデッドロックを引き起こすことは決してないことが保証されています。[2]このように、これは数学的基礎からJCSPの信頼性を象徴しています。
ネットワーク層
伝送制御プロトコル(TCP) ソケットは、CSP の意味でブロッキング チャネルとして動作するように構築できるため、JCSP プロセスを複数のコンピュータに分散できます。これは、TCP を使用して CSP セマンティクスを持つチャネルを提供する JCSP Net 拡張機能を使用して実現されます。CSP は構成的であるため、動作の観点では、プロセスが同じ場所に配置されているか分散されているかは問題ではありません。唯一の違いは、相対的なパフォーマンスです。したがって、たとえば、単一のサーバーでアプリケーションを開発し、パフォーマンスを最適化する目的で同じアプリケーションのマルチプロセッサ バージョンを比較することが可能です。
その他のバージョン
ロボット編
JCSP re は、2008 年頃にエディンバラのネイピア大学でジョン・ケリッジ教授、アレックス・パナヨトポロス、パトリック・リズモアによって開発された JCSP パッケージの大幅に縮小されたバージョンです。ロボット環境向けの JCSP とモバイル環境向けの JCSP の研究は、エディンバラのネイピア大学で活発に行われている研究分野です。「JCSP re」の実用的な実装により、ロボット向けの同じ並行ソフトウェアの開発が可能になります。具体的には、この研究の対象となったロボットは、 Java ソース コードを実行する人気のLeJOS NXJ 仮想マシンを実行できるLego Mindstorms NXTでした。[3]
他の言語から JCSP を使用する
JCSP は本質的には純粋な Java API です (ただし、JVM の C-CSP 拡張を使用する研究上の代替手段が存在します)。そのため、原則として、Java アプリケーションだけでなく、 ScalaアプリケーションやGroovyアプリケーションの並行処理にも非常に適しています。
したがって、JCSP は Scala のアクター モデルの代替手段を提供できます。JCSP は同期通信を使用し、アクターはバッファリングされた (非同期) 通信を使用しますが、それぞれ特定の状況で利点があります。JCSP ではチャネルをバッファリングできるため、アクター モデルを簡単にエミュレートできますが、その逆は当てはまりません。
参照
- 連続プロセスの通信、JCSPの基礎となる数学
参考文献
- ^ ab Belapurkar, Abhijit (2005 年 6 月 21 日). 「Java プログラマーのための CSP」. IBM DeveloperWorks . 2007 年 4 月 20 日閲覧。
- ^ Welch, Peter; Martin, Jeremy (2000)。並行 Java システムの形式分析。Communicating Process Architectures 2000 (レポート)。
- ^ Jon Kerridge、Alex Panayotopoulos、Patrick Lismore (2008)。「JCSPre: LEGO NXT ロボットを制御するロボット エディション」。同時実行システム エンジニアリング シリーズ第 66 巻: 通信プロセス アーキテクチャ 2008。IOS Press 書籍: 255–270。doi : 10.3233 /978-1-58603-907-3-255。2010 年 4 月 18 日のオリジナルからアーカイブ。
{{cite journal}}: CS1 maint: bot: original URL status unknown (link)
外部リンク
- ケント大学におけるJCSPプロジェクト
- JCSP re [永久リンク切れ]早期ベータリリース
