タプル空間は、並列/分散コンピューティングにおける連想メモリパラダイムの実装です 。これは、同時アクセス可能なタプルのリポジトリを提供します。例として、データを生成するプロセッサ群と、そのデータを使用するプロセッサ群を考えてみましょう。生成側はデータをタプルとして空間に格納し、消費側は特定のパターンに一致するデータを空間から取得します。これは「ブラックボードメタファー」とも呼ばれます。タプル空間は、分散共有メモリの一種と考えることができます。
タプル空間は、1986年にイェール大学のデイビッド・ゲルンターとニコラス・カリエロによって開発されたリンダ言語の理論的基盤であった。
タプル空間の実装は、 Java ( JavaSpaces )、Lisp、Lua、Prolog、Python、Ruby、Smalltalk、Tcl、および.NET Framework向けにも開発されています。
オブジェクト空間は、分散コンピューティングアプリケーション開発のためのパラダイムです。その特徴は、オブジェクト空間と呼ばれる論理エンティティの存在です。分散アプリケーションのすべての参加者は、オブジェクト空間を共有します。サービスプロバイダーは、サービスをオブジェクトとしてカプセル化し、オブジェクト空間に配置します。サービスのクライアントは、オブジェクト空間にアクセスし、必要なサービスを提供するオブジェクトを特定し、そのオブジェクトによって要求を処理してもらいます。
オブジェクト空間は、コンピューティングパラダイムとして、1980年代にイェール大学のデビッド・ゲルンターによって提唱された。ゲルンターは、グローバルなオブジェクト協調の概念をサポートするために、Lindaと呼ばれる言語を開発した。
オブジェクト空間は、ネットワークサービスのプロバイダーとアクセサー間で共有される仮想リポジトリと考えることができ、ネットワークサービス自体もオブジェクトとして抽象化されています。プロセスは、これらの共有オブジェクトを使用して相互に通信し、必要に応じてオブジェクトの状態を更新します。
オブジェクトをオブジェクトスペースに配置する際には、そのオブジェクトスペース内のオブジェクトディレクトリに登録する必要があります。登録後、プロセスはプロパティ検索を使用してオブジェクトディレクトリからオブジェクトを識別できます。このプロパティは、オブジェクトの検索条件を指定するもので、オブジェクト名、またはオブジェクトを一意に識別するその他のプロパティです。必要なオブジェクトがオブジェクトスペースに存在しない場合、プロセスはオブジェクトが配置されるまで待機することができます。
オブジェクトは、オブジェクト空間に格納されると受動状態になります。つまり、オブジェクトがオブジェクト空間にある間は、そのメソッドを呼び出すことはできません。代わりに、アクセスするプロセスは、オブジェクト空間からローカルメモリにオブジェクトを取得し、オブジェクトが提供するサービスを使用し、オブジェクトの状態を更新してから、オブジェクト空間に戻す必要があります。
このパラダイムは本質的に相互排他性を提供します。オブジェクトが一度アクセスされると、 オブジェクト空間から削除され、解放された後にのみ再び配置されるためです。つまり、あるプロセスがオブジェクトを使用している間は、他のプロセスはそのオブジェクトにアクセスできないため、相互排他性が確保されます。
JavaSpacesは、 Javaオブジェクトのための分散オブジェクト交換および調整メカニズム(永続的である場合もそうでない場合もある)を提供するサービス仕様です。これは、分散システムの状態を保存し、分散アルゴリズムを実装するために使用されます。JavaSpace内では、すべての通信パートナー(ピア)が状態を共有することで通信および調整を行います。
JavaSpacesは、並列処理によるスケーラビリティの実現に利用できるほか、分散レプリケーションによるオブジェクトの信頼性の高いストレージとしても利用できます。ただし、ディスクのように完全な停電には耐えられません。しかし、電源が安定している限り、多くの人はJavaSpacesを信頼できるストレージとみなしています。また、リモートロケーションへの分散も可能ですが、JavaSpacesは通常、信頼性の高いオブジェクトキャッシュではなく、低遅延で高性能なアプリケーションに使用されるため、このような用途は稀です。
JavaSpacesで最も一般的に使用されるソフトウェアパターンは、マスター・ワーカーパターンです。マスターは作業単位を「スペース」に割り当て、ワーカーはこれらの作業単位を読み取り、処理し、スペースに書き戻します。典型的な環境では、複数の「スペース」、複数のマスター、そして多数のワーカーが存在します。ワーカーは通常、汎用的に設計されており、スペースから任意の作業単位を受け取り、タスクを処理できます。
JavaSpacesはJava Jiniテクノロジーの一部であり、それ自体は商業的に成功していません。[ 1 ] このテクノロジーは長年にわたって新しいユーザーを獲得し、維持しており、一部のベンダーはJavaSpacesベースの製品を提供しています。JavaSpacesは、主に金融サービスおよび通信業界で使用されるニッチなテクノロジーであり、これらの業界では忠実な支持者を維持しています。Jini/JavaSpacesの発表はかなりの話題を呼びましたが、Sunの共同創設者でありJiniのチーフアーキテクトであるビル・ジョイは、この分散システムの夢は「考え方の量子的な飛躍」を遂げるだろうと明言しました。[ 2 ]
次の例は、JavaSpaces を使用して作成されたアプリケーションを示しています。まず、オブジェクト スペースで共有されるオブジェクトが作成されます。JavaSpaceの用語では、このようなオブジェクトはエントリと呼ばれます。ここでは、エントリを使用して、「 Hello World!」という文字列を返すサービスをカプセル化し、その使用回数を追跡します。このサービスを提供するサーバーは、オブジェクト スペース、つまりJavaSpaceを作成します。次に、エントリがJavaSpaceに書き込まれます。クライアントはJavaSpaceからエントリを読み取り、そのメソッドを呼び出してサービスにアクセスし、使用回数を更新します。更新されたエントリは、 JavaSpaceに書き戻されます。
// エントリクラスpublic class SpaceEntry implements Entry { public final String message = "Hello World!" ; public Integer count = 0 ; public String service () { ++ count ; return message ; } public String toString () { return "Count: " + count ; } }// Hello World! サーバーpublic class Server { public static void main ( String [] args ) throws Exception { SpaceEntry entry = new SpaceEntry (); // Entry オブジェクトを作成しますJavaSpace space = ( JavaSpace ) space (); // オブジェクト Space を作成します// Entry を Space に登録して書き込みます space . write ( entry , null , Lease . FOREVER ) ; // 10 秒間待機してから Entry を取得し、その状態を確認します。Thread . sleep ( 10 * 1000 ); SpaceEntry e = space . read ( entry , null , Long . MAX_VALUE ); System . out . println ( e ); } }// クライアントpublic class Client { public static void main ( String [] args ) throws Exception { JavaSpace space = ( JavaSpace ) space (); SpaceEntry e = space . take ( new SpaceEntry (), null , Long . MAX_VALUE ); System . out . println ( e . service ()); space . write ( e , null , Lease . FOREVER ); } }