(57)【要約】【課題】共有データを使用することによるユーザアプリケーションの処理遅延を回避しつつ、ノード間で正常にデータを共有する。【解決手段】ネットワークに接続された複数のノードが、各ノード間で共通して使用する共有データにアクセスしつつユーザアプリケーション１０の処理を連携して行うシステムにおいて次の機構を実現する。即ち、ユーザアプリケーション１０の処理過程において必ずしも即時に同期を取る必要のない共有データについては、各ノードのローカルインスタンス処理部２０において夫々保持する。そして、ユーザアプリケーション１０の処理過程では、各ノードは、自ノードのローカルインスタンス処理部２０において夫々保持する共有データにアクセスする。さらに、各ノードに設定された共有データ同士は、ネットワーク層処理部３０を介し、ユーザアプリケーション１０の処理から独立させて夫々同期をとる。【選択図】  図１
2010122724.tif 000002
【特許請求の範囲】
【請求項１】
ネットワーク接続された複数のノードの各々で実行されるユーザアプリケーションが、ノード間で共通して使用する共有データにアクセスしつつ連携して処理を行うシステムにおいて、各ノードで夫々実行されるデータ共有プログラムであって、
自ノードのユーザアプリケーションから、共有データの値、及び演算結果が可換且つ冪等である関数がその共有データの更新における演算内容として定義された更新関数が指定された、新規共有データの登録依頼を受け付けたときに、その共有データの値及び更新関数を自ノードの記憶装置に登録する第１の登録ステップと、
自ノードのユーザアプリケーションから共有データに対する参照依頼を受け付けたときに、自ノードに登録された共有データの値を、自ノードのユーザアプリケーションに対して返す参照ステップと、
自ノードのユーザアプリケーションから、共有データに対する更新依頼を更新値とともに受け付けたときに、前記更新関数による演算結果に応じて、自ノードに登録された共有データの値を更新値で更新し、更新完了の通知を自ノードのユーザアプリケーションに対して返す更新ステップと、
自ノードに登録された共有データの値を更新したときに、自ノードのユーザアプリケーションに対する更新完了の通知とは非同期に、その更新値を他ノードに登録された共有データの値に反映させる反映依頼を、他ノードに対して送信する依頼ステップと、
他ノードに登録された共有データの値が当該他ノードにおいて更新され、その更新値を自ノードに登録された共有データの値に反映させる反映依頼を当該他ノードから受信したときに、前記更新関数による演算結果に応じて、当該他ノードにおける更新値を、自ノードに登録された共有データに反映させる反映ステップと、
を実行することを特徴とするデータ共有プログラム。
【請求項２】
前記更新関数には、ユーザアプリケーションにおいて演算内容を任意に定義可能なユーザ定義関数を用いることができることを特徴とする請求項１記載のデータ共有プログラム。
【請求項３】
全ての他ノードのうち、自ノードとの間で共有データの値の同期を取る対象とする他ノードを特定する情報を自ノードの記憶装置に登録する第２の登録ステップをさらに含み、
前記依頼ステップは、前記登録された他ノードに対してのみ、更新値を反映させる依頼を送信することを特徴とする請求項１又は請求項２に記載のデータ共有プログラム。
【請求項４】
前記反映ステップにより、他ノードにおける更新値を自ノードに登録された共有データの値に反映させたときに、反映依頼の送信元であるノード以外の他ノードに対し、その更新値をさらに反映させる依頼を送信する再依頼ステップをさらに実行することを特徴とする請求項１〜請求項３のいずれか１つに記載のデータ共有プログラム。
【請求項５】
前記反映ステップにより、他ノードにおける更新値を自ノードに登録された共有データの値に反映させたときに、自ノードで動作するユーザアプリケーションに対し、自ノードに登録された共有データの値が更新されたことを通知するイベントを発行することを特徴とする請求項１〜請求項４のいずれか１つに記載のデータ共有プログラム。
【請求項６】
ネットワーク接続された複数のノードの各々で実行されるユーザアプリケーションが、ノード間で共通して使用する共有データにアクセスしつつ連携して処理を行うシステムにおいて、各ノードで夫々実行されるデータ共有方法であって、
自ノードのユーザアプリケーションから、共有データの値、及び演算結果が可換且つ冪等である関数がその共有データの更新における演算内容として定義された更新関数が指定された、新規共有データの登録依頼を受け付けたときに、その共有データの値及び更新関数を自ノードの記憶装置に登録する登録ステップと、
自ノードのユーザアプリケーションから共有データに対する参照依頼を受け付けたときに、自ノードに登録された共有データの値を、自ノードのユーザアプリケーションに対して返す参照ステップと、
自ノードのユーザアプリケーションから、共有データに対する更新依頼を更新値とともに受け付けたときに、前記更新関数による演算結果に応じて、自ノードに登録された共有データの値を更新値で更新し、更新完了の通知を自ノードのユーザアプリケーションに対して返す更新ステップと、
自ノードに登録された共有データの値を更新したときに、自ノードのユーザアプリケーションに対する更新完了の通知とは非同期に、その更新値を他ノードに登録された共有データの値に反映させる反映依頼を、他ノードに対して送信する依頼ステップと、
他ノードに登録された共有データの値が当該他ノードにおいて更新され、その更新値を自ノードに登録された共有データの値に反映させる反映依頼を当該他ノードから受信したときに、前記更新関数による演算結果に応じて、当該他ノードにおける更新値を、自ノードに登録された共有データに反映させる反映ステップと、
を実行することを特徴とするデータ共有方法。
【請求項７】
ネットワーク接続された複数のノードの各々で実行されるユーザアプリケーションが、ノード間で共通して使用する共有データにアクセスしつつ連携して処理を行うシステムにおいて、各ノードに設けられるデータ共有装置であって、
自ノードのユーザアプリケーションから、共有データの値、及び演算結果が可換且つ冪等である関数がその共有データの更新における演算内容として定義された更新関数が指定された、新規共有データの登録依頼を受け付けたときに、その共有データの値及び更新関数を自ノードの記憶装置に登録する登録手段と、
自ノードのユーザアプリケーションから共有データに対する参照依頼を受け付けたときに、自ノードに登録された共有データの値を、自ノードのユーザアプリケーションに対して返す参照手段と、
自ノードのユーザアプリケーションから、共有データに対する更新依頼を更新値とともに受け付けたときに、前記更新関数による演算結果に応じて、自ノードに登録された共有データの値を更新値で更新し、更新完了の通知を自ノードのユーザアプリケーションに対して返す更新手段と、
自ノードに登録された共有データの値を更新したときに、自ノードのユーザアプリケーションに対する更新完了の通知とは非同期に、その更新値を他ノードに登録された共有データの値に反映させる反映依頼を、他ノードに対して送信する依頼手段と、
他ノードに登録された共有データの値が当該他ノードにおいて更新され、その更新値を自ノードに登録された共有データの値に反映させる反映依頼を当該他ノードから受信したときに、前記更新関数による演算結果に応じて、当該他ノードにおける更新値を、自ノードに登録された共有データに反映させる反映手段と、
を含んで構成されたことを特徴とするデータ共有装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ネットワーク接続された複数ノード間においてデータを共有する技術に関する。
【背景技術】
【０００２】
ネットワークを介して複数のノードが接続された分散環境が構築されたコンピュータシステムにおいては、ノード間でデータを共有し、その共有データに対して複数のノードからアクセスすることが一般的に行われる。かかる共有データを用いた処理として基本的なものとしては、例えば、１つのノードで共有データを生成してこれに書き込みをし、他ノードでこれを読みだす処理（配布）がある。また、かかる書き込み及び読み出しをノード間において夫々相互に行う処理（受け渡し）がある。さらに、各ノードにおけるユーザアプリケーションの演算結果を、その値に応じて共有データに順次反映させる処理（集約）等がある。
【０００３】
そして、データの共有は、あるノードに存在するデータに対して、そのノードにネットワーク接続された他ノードからのアクセスを許容することによって実現される。この方法によるデータの共有は、ソフトウェア部品(オブジェクト)をネットワーク上の複数のノードに配置し、それらのオブジェクトに対して他ノードからアクセスしつつノード全体を連携動作させる分散オブジェクト技術においても用いられる。また、データの共有を実現する他の方法として、各ノードが備えるメモリ空間をソフトウェアにより仮想的に１つの共有メモリ領域とみなすソフトウェア分散共有メモリ（Software Distributed Shared Memory）の技術も用いられる。
【０００４】
しかしながら、他ノードに存在する共有データへアクセスを行う場合、ネットワークを経由したリモートアクセスとなるため、ローカルデータに対するアクセスと比較すると長い時間を要する。また、共有データに対しては、上述の例のように、配布や受け渡し、集約等の処理が行われ、複数のノードから書き込み及び読み出しがなされる。このため、その内容の整合性を保つべく、排他制御が必要となる。しかし、ソフトウェア分散共有メモリを適用している場合には、排他制御の手順が非常に複雑であるため、排他制御処理そのものに時間を要する。さらに、いずれの方法においても、共有データに対し他ノードによりロックがかけられている場合には、その共有データに対するアクセスは待機しなければならない。
【０００５】
このように、ユーザアプリケーションの処理において、共有データへのアクセスを行うと、リモートアクセスに起因する処理遅延及び排他制御に起因する処理遅延が生じ、処理性能が低下してしまうという問題が生じていた。そして、かかる共有データへのアクセスに伴う処理の遅延は、複数のノードに並列処理を行わせることによって仮想的に１つの高性能なコンピュータを構築して高速な処理を実現するクラスタやグリッド等においては、特にその処理性能の低下に重大な影響をもたらしていた。
【０００６】
そこで、少なくとも他ノードによる排他制御により共有データへの書き込みができない状態を回避するべく、次のような技術が提案されている。即ち、予め共有データを各ノードで夫々保持しておき、各ノードでは、夫々自ノードで保持する共有データに書き込みをする。そして、書き込みをしたときには、直ちに他ノードの共有データに対し同期を取る。しかし、かかる技術によれば、排他制御に起因する書き込みの待機は回避できるものの、上述のように、他ノードの共有データとの不整合を防ぐため、自ノードの共有データへの書き込み後、直ちに他ノードの共有データに対し同期を取る必要があることに変わりはない。このため、リモートアクセスによるユーザアプリケーションの処理遅延の問題は結局回避できない。
【特許文献１】特開２００７−５８７６９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
以上のような問題点に鑑み、共有データを各ノードで夫々保持する一方、その同期処理を、ユーザアプリケーションの処理から独立させ、且つ、共有データ内容に不整合が生じないようにして行うことで、共有データを使用することによるユーザアプリケーションの処理遅延を回避しつつ、ノード間で正常にデータを共有することを目的とする。
【課題を解決するための手段】
【０００８】
開示のシステムでは、ネットワーク接続された複数のノードの各々で実行されるユーザアプリケーションが、ノード間で共通して使用する共有データにアクセスしつつ連携して処理を行うシステムにおいて、各ノードで次の機構を実現する。即ち、自ノードのユーザアプリケーションから、共有データの値及び共有データの更新における演算内容として関数が定義された更新関数が指定された新規共有データの登録依頼を受け付けたときに、その共有データの値及び更新関数を自ノードの記憶装置に登録する。ここで、この更新関数としては、演算結果が可換且つ冪等である関数を定義する。そして、自ノードのユーザアプリケーションから共有データに対する参照依頼を受け付けたときには、自ノードに登録された共有データの値を返す。一方、自ノードのユーザアプリケーションから共有データに対する更新依頼を更新値とともに受け付けたときには、更新関数による演算結果に応じて自ノードに登録された共有データの値を更新し、更新完了の通知を返す。また、自ノードに登録された共有データの値を更新したときに、自ノードのユーザアプリケーションに対する更新完了の通知とは非同期に、その更新値を他ノードに登録された共有データの値に反映させる反映依頼を、他ノードに対して送信する。一方、他ノードに登録された共有データの値が当該他ノードにおいて更新され、その更新値を自ノードに登録された共有データの値に反映させる反映依頼を当該他ノードから受信したときには、更新関数による演算結果に応じて、当該他ノードにおける更新値を、自ノードに登録された共有データに反映させる。
【発明の効果】
【０００９】
開示のシステムによれば、ネットワーク接続された各ノードにおいて、夫々共有データの値を保持している。そして、ユーザアプリケーションにより、共有データに対する参照依頼及び更新依頼のいずれがなされた場合であっても、そのアクセスは、自ノードで保持する共有データに対して行う。その一方で、各ノードで保持する共有データへの更新の反映は、ユーザアプリケーションの処理とは非同期に行われる。また、この共有データへの更新の反映は、演算結果が可換且つ冪等である更新関数による演算結果に応じて行われる。このため、共有データへのリモートアクセス及び共有データの排他処理に伴うユーザアプリケーションの処理遅延を回避し、且つ、ノード間の共有データに不整合を発生させることなく、データの共有を実現できる。
【発明を実施するための最良の形態】
【００１０】
以下、分散環境におけるデータ共有機構の一実施例について説明する。
図１は、本実施例において、データ共有機構が適用されるシステムの全体構成図である。本システムでは、複数のノードがネットワークを介して相互に接続されている。各ノードは、少なくともＣＰＵ及び記憶装置を含んで構成されたコンピュータである。そして、これらのノードでは、他ノードとの間でデータを共有し、その共有データにアクセスしつつ連携して処理を行うユーザアプリケーションの処理を実行するユーザアプリケーション処理部１０が夫々動作している。また、各ノードでは、共有データを保持するローカルインスタンス処理部２０及び各ノードで保持する共有データに関する情報を他ノードとの間で送受信するネットワーク層処理部３０を含んで構成される。なお、図１ではノードＡ〜ノードＥの５つのノードが図示されているが、本システムを構成するノードの数及び接続形態はこれに限られない。
【００１１】
次に、ノードの構成について、図２を用いてさらに説明する。
ユーザアプリケーション処理部１０は、上述のように、共有データを用いつつ他ノードとの間で連携して処理を行うものである。そして、共有データに対してアクセスをするときには、ローカルインスタンス処理部２０に対し、アクセス依頼を送信する。ここで、アクセスには、参照処理及び更新処理を含む。このとき、アクセスする対象は自ノードのローカルインスタンス処理部２０で保持する共有データであり、他ノードで保持する共有データにはアクセスしない。
【００１２】
ローカルインスタンス処理部２０は、ローカルインスタンスマップ２０Ａを備え、これに共有データの値を保持する。ローカルインスタンスマップ２０Ａは、図３に示すように、共有データを一意に識別するためのキー，共有データの値，共有データを更新する処理が定義された更新関数，データをメモリ上の形式からネットワーク上の形式に変換するシリアライズ関数及びネットワーク上の形式からメモリ上の形式に変換するデシリアライズ関数を含んで構成される。なお、各ノードのユーザアプリケーション処理部１０では、少なくとも、ある共有データに対応するキー及びその共有データに対応する更新関数の情報が共有されている。そして、ローカルインスタンス処理部２０は、ユーザアプリケーション処理部１０から共有データへのアクセス依頼を受信したときに、このローカルインスタンスマップ２０Ａに登録された共有データに対してアクセスを行う。また、ローカルインスタンス処理部２０では、ローカルインスタンスマップ２０Ａの共有データを更新したときには、ネットワーク層処理部３０に対し、他ノードのローカルインスタンスマップ２０Ａに登録された共有データへの反映依頼を送信させる依頼を送る。一方、他ノードのローカルインスタンスマップ２０Ａに登録された共有データが更新されたことがネットワーク層処理部３０を介して通知されたときには、その更新をローカルインスタンスマップ２０Ａの共有データに反映させる。
【００１３】
ここで、更新関数としては、更新順序が異なっていても同一の結果になる可換の性質を有するとともに、同じ更新を繰り返しても同一の結果になる冪等の性質を有するものを設定する。かかる可換且つ冪等の性質を有する更新関数の具体例としては、最大数を求める関数（Max()）や、最小数を求める関数（Min()）等が該当する。かかる更新関数が共有データに対応付けられ、単に共有データの値を上書きするのではなく、この更新関数に基づいて共有データの値の更新が行われることで、次のような利点がある。即ち、各ノードにおいて夫々共有データの更新がなされ、その後の共有データの同期処理において更新が反映される順序がノード間で異なったとしても、ノード間で共有データの不整合（ここでは、同期を取った後における各ノード間の不整合を意味する）が生じることがない。このため、他ノードの共有データに対して更新を反映させるときに、対象となる全ノードに排他制御をかけ、更新順序を厳守しつつ即時に同期を取らなくても、ノード間における共有データの不整合を回避することができる。
【００１４】
また、かかる更新関数には、ノードのシステム環境により予め定義された関数に限らず、ユーザアプリケーションにおいて演算内容を任意に定義可能な、いわゆるユーザ定義関数を適用可能である。このユーザ定義関数を用いれば、例えば、データに対して複数の更新が一連のトランザクションとして一体不可分に行われるアトミックな更新処理を、任意に定義することができる。
【００１５】
ネットワーク層処理部３０は、図４に示すような、キー及びそのキーに対応する共有データを使用するノードが対応付けられたネットワーク層マップ３０Ａを備える。そして、自ノードのローカルインスタンスマップ２０Ａの共有データの値が更新され、他ノードへの反映依頼を受け取ったときは、ネットワーク層マップ３０Ａに基づいて、その共有データにアクセスを行っている他ノードを特定し、反映依頼を送信する。一方、他ノードでローカルインスタンスマップ２０Ａの共有データの値が更新されたときには、その反映依頼を受信して、自ノードのローカルインスタンス処理部２０に通知する。また、ネットワーク層処理部３０は、図５に示すような、自ノードからアクセスを行う対象となるノードが設定されたノード設定ファイル３０Ｂを備える。このノード設定ファイル３０には、ネットワークに接続された全ての他ノードのうち、共有データの同期を取るべき隣接ノードのみを適宜設定することができる。そして、自ノードが起動されたときには、ネットワーク層マップ３０Ａにおいて、自ノードで使用している共有データを同じく使用している他ノードが漏れなく登録されているかの確認を行う。
【００１６】
なお、これらのローカルインスタンス処理部２０及びネットワーク層処理部３０は、各ノードにおいて、オペレーティングシステム上で動作するミドルウェアとして実装するか、または、ユーザアプリケーション処理部１０にリンクするライブラリとして実装する。また、ローカルインスタンスマップ２０Ａ，ネットワーク層マップ３０Ａ及びノード設定ファイル３０Ｂは、各ノードの記憶装置（例えばメモリやハードディスク等）に格納されている。
【００１７】
また、ローカルインスタンス処理部２０により、第１の登録ステップ，第１の登録手段，参照ステップ，参照手段，更新ステップ及び更新手段が、ローカルインスタンス処理部２０及びネットワーク層処理部３０の連携により、依頼ステップ，依頼手段，反映ステップ，反映手段，起動ステップ及び再依頼ステップが、ネットワーク層処理部３０により、第２の登録ステップが夫々実現される。
【００１８】
次に、ローカルインスタンス処理部２０において実行される処理について、フローチャートを用いて説明する。
図６は、ユーザアプリケーション処理部１０から、新たな共有データの登録依頼があったときに実行される処理を示す。
【００１９】
ステップ１（図では「Ｓ１」と略記する。以下同様）では、ユーザアプリケーション処理部１０より、キー，共有データの初期値，更新関数，シリアライズ関数及びデシリアライズ関数を受信する。ステップ２では、受信したキーが、既にローカルインスタンスマップ２０Ａに登録されているか否かを判定する。受信したキーが登録されていなければ、ステップ３に進み、受信した情報をローカルインスタンスマップ２０Ａに登録し、登録が完了したことをユーザアプリケーション処理部１０に通知する。一方、受信したキーが登録されていれば、ステップ４に進み、ユーザアプリケーション処理部１０に対し、キーが重複している旨のエラーを返す。そして、ステップ５では、新規共有データを登録したことを、ネットワーク層処理部３０に対して通知するとともに、他ノードにおいてキー「Ｘ」の共有データを使用しているかの確認依頼の送信を依頼する。なお、この通知がなされると、ネットワーク層処理部３０では、後述する図１３の処理を開始する。
【００２０】
図７は、ユーザアプリケーション処理部１０から、共有データの参照依頼があったときに実行される処理を示す。
ステップ１１では、ユーザアプリケーション処理部１０から、キーを引数に共有データの参照依頼を受信する。そして、ステップ１２では、ローカルインスタンスマップ２０Ａを参照し、受信した引数のキーに対応する共有データの値をユーザアプリケーション処理部１０に返す。
【００２１】
図８は、ユーザアプリケーション処理部１０から、共有データの更新依頼があったときに実行される処理を示す。
ステップ２１では、ユーザアプリケーション処理部１０から、キー及び共有データの更新値を引数として共有データの更新依頼を受信する。ステップ２２では、引数のキーがローカルインスタンスマップ２０Ａに存在するか否かを判定する。キーが存在すれば、ステップ２３に進み、更新値を、キーに対応する更新関数により演算し、その演算結果とローカルインスタンスマップ２０Ａに登録されている共有データの値とを比較する。一方、ステップ２２でキーが存在しなければ、ステップ２４に進み、ユーザアプリケーション処理部１０に対して更新対象がないことを通知するエラーを返し、処理を終了する。さらに、ステップ２５では、ステップ２３による比較の結果、更新を実行するか否かを判定する。そして、更新値のほうがローカルインスタンスマップ２０Ａに登録された値よりも適切であり、更新を実行するときには、ステップ２６に進み、ローカルインスタンスマップ２０Ａに登録されたデータを更新値で更新し、更新が成功したことをユーザアプリケーション処理部１０に返す。そして、ステップ２７において、ネットワーク層処理部３０に対し、ローカルインスタンスマップ２０Ａの共有データの値を更新したことを通知するとともに、更新対象の共有データを使用している他ノードに対し、更新値の反映依頼を送信するように依頼する。また、ステップ２５において、更新値とローカルインスタンスマップ２０Ａに登録された値とが同値のときには、ステップ２８に進み、更新を実行せずに無視をする。さらに、ステップ２５において、ローカルインスタンスマップ２０Ａに登録された値のほうが更新値よりも適切であり、更新を実行しないときには、ステップ２９に進み、更新が失敗したことをユーザアプリケーション処理部１０に返す。
【００２２】
なお、更新関数による演算結果に応じた更新処理の具体例として、更新対象の共有データに対応付けられた更新関数が、最大値を求める「Max()」の場合を用いて説明する。この場合、更新値のほうがローカルインスタンスマップ２０Ａに登録された共有データの値よりも大きければ、ローカルインスタンスマップ２０Ａに登録された共有データよりも更新値のほうが適切であるため、更新を実行する。また、更新値とローカルインスタンスマップ２０Ａに登録された共有データの値が同値のときは、更新依頼を無視する。さらに、更新値のほうがローカルインスタンスマップ２０Ａに登録された共有データの値よりも小さければ、更新をせず、更新が失敗したことをユーザアプリケーション処理部１０に対して返す。
【００２３】
図９は、他ノードにおいて共有データの更新があり、その更新を反映させる反映依頼があったときに実行される処理を示す。なお、この場合、他ノードから反映依頼を直接受信するのはネットワーク層処理部３０であり、ローカルインスタンス処理部２０では、このネットワーク層処理部３０を介して反映依頼を受け取ることとなる。
【００２４】
ステップ３１では、ネットワーク層処理部３０から、キー及び共有データの更新値を引数として、共有データの更新の反映依頼を受信する。ステップ３２では、引数のキーがローカルインスタンスマップ２０Ａに存在するか否かを判定する。キーが存在すれば、ステップ３３に進み、更新値を、キーに対応する更新関数により演算し、その演算結果とローカルインスタンスマップ２０Ａに登録されている共有データの値とを比較する。一方、ステップ３２でキーが存在しなければ、ネットワーク層処理部３０に対して更新対象がないことを通知するエラーを返し、処理を終了する。そして、ステップ３４では、ステップ３３による比較の結果、更新を実行するか否かを判定する。そして、更新値のほうがローカルインスタンスマップ２０Ａに登録された値よりも適切であり、更新を実行するときには、ステップ３５に進み、ローカルインスタンスマップ２０Ａに登録された共有データを更新し、共有データが更新されたことを通知するイベントをユーザアプリケーション処理部１０に発行する。さらに、ステップ３６において、反映依頼の送信元ノード以外で更新対象の共有データにアクセスしているノードに対し、更新内容を反映させる反映依頼を送信するよう、ネットワーク層処理部３０に対し依頼する。また、ステップ３７において、更新値とローカルインスタンスマップ２０Ａに登録された値とが同値のときには、更新を実行せずに無視をする。さらに、ステップ３８において、更新値のほうがローカルインスタンスマップ２０Ａに登録された値よりも適切であり、更新を実行しないときには、反映依頼の送信元のノードに対し、ローカルインスタンスマップ２０Ａに登録された値を反映させる反映依頼を送信するよう、ネットワーク層処理部３０に対し依頼する。なお、このステップ３８の処理が行われる状況としては、他ノードが起動された場合であって、その起動されたノードが動作していない間にさらに共有データの更新が進んでいたときに、起動されたノードに最新の更新値を反映させる必要がある状況が考えられる。そして、この更新依頼がなされた後、ネットワーク層処理部３０では、図１６に示す処理が実行される。
【００２５】
図１０は、ユーザアプリケーション処理部１０から共有データの削除依頼があったときに実行される処理を示す。
ステップ４１では、ユーザアプリケーション処理部１０から、キーを引数として共有データの削除依頼を受け付ける。ステップ４２では、ローカルインスタンスマップ２０Ａから、引数のキーに対応するデータを削除する。ステップ４３では、ネットワーク層処理部３０に対し、キーを引数として、削除依頼を送信する。
【００２６】
次に、ネットワーク層処理部３０において実行される処理について説明する。
図１１は、ノードを起動したときに実行される処理を示す。
ステップ５１では、ノード設定ファイル３０Ｂを参照して、アクセス対象となる他ノードを特定し、特定したノードの夫々に対して接続する。ステップ５２では、接続したノードの夫々のネットワーク層マップ３０Ａから、各ノードに登録されている共有データのキーをノードごとに取得（受信）する。そして、ステップ５３では、キー及びそのキーが登録されているノードを対応付けたリストを作成する。ステップ５４では、ローカルインスタンス処理部２０に対し、自ノードのキーを問い合わせ、ローカルインスタンスマップ２０Ａに登録された自ノードのキー情報を取得し、そのリストを作成する。そして、ステップ５５では、自ノードのキーのリストを、ステップ５１で接続した他ノード全てに送信する。ステップ５６では、ステップ５３で作成した他ノードのキーのリストから、自ノードに登録されているキーと一致するキーを検索する。そして、ステップ５７では、ステップ５６における検索の結果、自ノードに登録されているキーと一致するものが存在すれば、ステップ５８において、その一致するキーが登録された他ノードにおいて登録された共有データの値との間で同期を取る。具体的には、ローカルインスタンス処理部２０から、ローカルインスタンスマップ２０Ａの共有データの更新が通知されたときに実行される処理（後述の図１４に示す処理）に移行する。一方、自ノードに登録されているキーと一致するものが存在しなければ、処理を終了する。
【００２７】
図１２は、他ノードが起動されたときに実行される処理を示す。なお、このとき、当該他ノードでは、上述の図１１の処理が実行されている。
ステップ６１では、起動された他ノードからの接続を受ける。ステップ６２では、ローカルインスタンス処理部２０に対して自ノードのキーを問い合わせ、ローカルインスタンスマップ２０Ａに登録された自ノードのキー情報を取得してリストを作成する。ステップ６３では、作成した自ノードのキーのリストを起動された他ノードに送信する。ステップ６４では、起動された他ノードから、そのローカルインスタンスマップ２０Ａに登録されているキーのリストを受信する。ステップ６５では、ネットワーク層マップ３０Ａを参照し、起動された他ノードに登録されているキーが登録されていれば、そのキーに対応するノードに、起動された他ノードを追加させて反映する。
【００２８】
図１３は、ローカルインスタンス処理部２０から、新規共有データの登録が通知されたときに実行される処理を示す。なお、この処理は、上述の図６に示す、ローカルインスタンス処理部２０における処理のステップ５の後に実行される。
【００２９】
ステップ７１では、ローカルインスタンス処理部２０から、キーを引数として、ローカルインスタンスマップ２０Ａに共有データを登録したことの通知及び他ノードにおける当該共有データの使用の確認依頼を送信する依頼を受け付ける。ステップ７２では、ノード設定ファイル３０Ｂを参照して、アクセス対象となる他ノードを特定して接続し、接続した全ノードに対して、引数のキーが登録されているかの確認依頼を送信する。なお、このとき、確認依頼を受信した他ノードでは、ローカルインスタンスマップ２０Ａに設定されたキー情報を取得し、これを返信する。ステップ７３では、確認依頼に対する他ノードからの返信に基づいて、他ノードに引数のキーが登録されているか否かを判定する。そして、キーが登録されていれば、ステップ７４に進み、キー及びそのキーが登録されているノードを対応付けてネットワーク層マップ３０Ａに登録する一方、キーが存在しなければ、処理を終了する。さらに、ステップ７５では、その一致するキーが登録された他ノードにおいて登録された共有データの値との間で同期を取る。具体的には、キーが登録されているノードに登録された共有データの値を更新値とし、キー及びその更新値を新たな引数として、ローカルインスタンス処理部２０に対し、反映依頼を送信する。なお、この反映依頼を受信したローカルインスタンス処理部２０では、図９に示す処理を実行する。
【００３０】
図１４は、ローカルインスタンスマップ２０Ａの共有データを更新したことの通知及び他ノードへその更新を反映させる反映依頼が受信されたときに実行される処理を示す。なお、この処理は、上述の図８に示す、ローカルインスタンス処理部２０における処理のステップ２７の後に実行される。
【００３１】
ステップ８１では、ローカルインスタンス処理部２０から、キー及び共有データの更新値を引数として、ローカルインスタンスマップ２０Ａの共有データを更新したことの通知及び他ノードへその更新を反映させる反映依頼を送信する依頼を受信する。ステップ８２では、ネットワーク層マップ３０Ａを参照し、引数のキーが登録された他ノードを検索する。ステップ８３では、ステップ８２の検索の結果、引数のキーが登録された他ノードが存在するか否かを判定する。そして、引数のキーが登録された他ノードが存在するときには、ステップ８４に進み、当該他ノードに対し、キー及び更新値を引数として、その更新値を当該他ノードのローカルインスタンスマップ２０Ａの共有データの値に反映させる反映依頼を送信する。一方、引数のキーが登録された他ノードが存在しないときには、処理を終了する。
【００３２】
図１５は、他ノードで共有データの更新がなされ、その更新を自ノードに反映させるべく他ノードから更新の反映依頼を受信したときであって、自ノードのデータに更新を反映させたときに、更新依頼の送信元のノード以外の他ノードに対して更新の反映依頼を送る処理を示す。なお、この処理は、上述の図９に示す、ローカルインスタンス処理部２０における処理のステップ３６の後に実行される。
【００３３】
ステップ９１では、ローカルインスタンス処理部２０から、キー，共有データの更新値及び更新の反映依頼の送信元ノードを引数として、反映依頼を送信する依頼を受信する。ステップ９２では、ネットワーク層マップ３０Ａを参照し、引数のキーが登録された他ノードを検索する。ステップ９３では、ステップ９２の検索において、引数のキーが登録された他ノードが存在するか否かを判定し、存在すれば、ステップ９４に進み、そのノード（但し、更新依頼の送信元ノードを除く）に対し、反映依頼を送信する。一方、引数のキーが登録された他ノードが存在しなければ、処理を終了する。
【００３４】
図１６は、他ノードで共有データの更新がなされ、その更新を自ノードに反映させるべく当該他ノードから更新の反映依頼を受信したときであって、自ノードのローカルインスタンスマップ２０Ａの共有データの値を更新しなかったときに、反映依頼の送信元ノードに対し、自ノードのローカルインスタンスマップ２０Ａの共有データの値の反映依頼を送る処理を示す。なお、この処理は、上述の図９に示す、ローカルインスタンス処理部２０における処理のステップ３８の後に実行される。
【００３５】
ステップ１０１では、ローカルインスタンス処理部２０から、キー，共有データの更新値及び反映依頼の送信元ノードを引数として、ローカルインスタンスマップ２０Ａに登録された共有データの値の反映依頼を送信する依頼を受信する。ステップ１０２では、送信元ノードに対し、反映依頼を送信する。
【００３６】
図１７は、他ノードで共有データの更新がなされ、その更新を自ノードに反映させるべく他ノードから更新の反映依頼を受信したときの処理を示す。
ステップ１１１では、共有データの更新がなされた他ノードから、キー及び共有データの更新値を引数として更新の反映依頼を受信する。ステップ１１２では、ネットワーク層マップ３０Ａを参照し、反映依頼の送信元ノードを検索する。ステップ１１３では、ステップ１１２の検索において、反映依頼の送信元ノードがネットワーク層マップ３０Ａに存在するか否かを判定する。そして、反映依頼の送信元ノードがネットワーク層マップ３０Ａに存在しなければ、ステップ１１４に進み、反映依頼の送信元ノードを引数のキーに対応させてネットワーク層マップ３０Ａに登録する。一方、ステップ１１３で送信元ノードがネットワーク層マップ３０Ａに存在すれば、ステップ１１５に進む。ステップ１１５では、キー及び更新値を新たな引数として、ローカルインスタンス処理部２０に対し、更新の反映依頼を送信する。なお、この反映依頼を受信したローカルインスタンス処理部２０では、図９に示す処理を実行する。
【００３７】
図１８は、ローカルインスタンス処理部２０から、ローカルインスタンスマップ２０Ａの共有データの削除が通知されたときに実行される処理を示す。
ステップ１２１では、ローカルインスタンス処理部２０から、キーを引数として、ローカルインスタンスマップ２０Ａのデータを削除したことの通知を受信する。ステップ１２２では、ネットワーク層マップ３０Ａから、引数のキーが登録されたノードを検索する。そして、ステップ１２３では、ステップ１２２の検索において、引数のキーが登録されたノードが存在するか否かを判定する。そして、引数のキーが登録されたノードが存在すれば、ステップ１２４に進み、そのノードに自ノードの削除依頼を送る一方、存在しなければ、処理を終了する。ステップ１２５では、自ノードのネットワーク層マップ３０Ａから、キー及びノードの組を削除する。
【００３８】
ここで、本システムにおける処理シーケンスについて、具体例を用いて説明する。なお、以下の具体例においては、少なくともノードＡ及びノードＢがネットワークに接続されているものとする。そして、ノードＡのネットワーク層処理部３０が備えるノード設定ファイル３０ＢにはノードＢが、ノードＢのネットワーク層処理部３０が備えるノード設定ファイル３０ＢにはノードＡが、夫々設定されているものとする。
【００３９】
［具体例１：ノード間におけるデータ配布］
具体例１では、次のことを実現させる。
（Ａ）前準備
Ａ−１：ノードＡでキー「Ｘ」の共有データを登録する
Ａ−２：ノードＢでキー「Ｘ」の共有データを登録する
（Ｂ）データ転送
Ｂ−１：ノードＡでキー「Ｘ」の共有データの値を「ＹＹＹ」で更新する
Ｂ−２：ノードＢでキー「Ｘ」の共有データの値を参照する
（Ｃ）後処理
Ｃ−１：ノードＡでキー「Ｘ」の共有データを削除する
Ｃ−２：ノードＢでキー「Ｘ」の共有データを削除する
図１９は、ノードＡでキー「Ｘ」のデータを登録する処理シーケンスを示す（Ａ−１）。なお、以下の説明における（１）〜（７）は、図１９における（１）〜（７）に対応している（他の処理シーケンスにおいても同様）。
【００４０】
（１）ノードＡのユーザアプリケーション処理部１０から、ノードＡのローカルインスタンス処理部２０に対し、新規共有データの登録依頼を送信する。このとき、キーが「Ｘ」，共有データの初期値が「null」，更新関数が「update()」（シリアライズ関数及びデシリアライズ関数については省略）で登録依頼がなされるとする。
【００４１】
（２−ａ）ノードＡのローカルインスタンス処理部２０では、登録依頼がなされた共有データの情報をローカルインスタンスマップ２０Ａに登録し、ユーザアプリケーション処理部１０に対し、登録が完了したことを通知する。
【００４２】
（２−ｂ）ノードＡのローカルインスタンス処理部２０から、ノードＡのネットワーク層処理部３０に対し、キー「Ｘ」の新規の共有データを登録したことを通知するとともに、他ノードにおけるキー「Ｘ」の共有データの使用の確認依頼を送信する。
【００４３】
（３）ノードＡのネットワーク層処理部３０から、ノードＢのネットワーク層処理部３０に対し、キー「Ｘ」が登録されているかの確認依頼を送信する。
（４）ノードＢのネットワーク層処理部３０から、さらに、ノードＢのローカルインスタンス処理部２０に対し、ローカルインスタンスマップ２０Ａにおいてキー「Ｘ」が登録されているかを問い合わせる。なお、ノードＢのローカルインスタンスマップ２０Ａでは、この時点でキー「Ｘ」が登録されていないものとする。
【００４４】
（５）ノードＢのローカルインスタンス処理部２０から、ノードＢのネットワーク層処理部３０に対し、キー「Ｘ」が登録されていないことを返す。
（６）ノードＢのネットワーク層処理部３０から、ノードＡのネットワーク層処理部３０に対し、ノードＢにキー「Ｘ」が登録されていないことを返す。ここで、ノードＡでは、キー「Ｘ」の共有データが登録されている他ノードが存在しないため、処理を終了する。
【００４５】
図２０は、ノードＢでキー「Ｘ」の共有データを登録する処理シーケンスを示す（Ａ−２）。
（１）ノードＢのユーザアプリケーション処理部１０から、ノードＢのローカルインスタンス処理部２０に対し、新たな共有データの登録依頼を送信する。このとき、キーが「Ｘ」，共有データの初期値が「null」，更新関数が「update()」で登録依頼がなされるとする。
【００４６】
（２−ａ）ノードＢのローカルインスタンス処理部２０では、登録依頼がなされた共有データをローカルインスタンスマップ２０Ａに登録し、ユーザアプリケーション処理部１０に対し、登録が完了したことを返す。
【００４７】
（２−ｂ）ノードＢのローカルインスタンス処理部２０から、ノードＢのネットワーク層処理部３０に対し、キー「Ｘ」の新規の共有データを登録したことを通知するとともに、他ノードにおいてキー「Ｘ」の共有データにアクセスしているかの確認依頼を送信する。
【００４８】
（３）ノードＢのネットワーク層処理部３０から、ノードＡのネットワーク層処理部３０に対し、キー「Ｘ」が登録されているかの確認依頼を送信する。
（４）ノードＡのネットワーク層処理部３０から、さらに、ノードＡのローカルインスタンス処理部２０に対し、ローカルインスタンスマップ２０Ａにおいてキー「Ｘ」が登録されているかを問い合わせる。なお、ノードＡのローカルインスタンスマップ２０Ａでは、上述の（Ａ−１）の処理により、キー「Ｘ」が登録されている。
【００４９】
（５）ノードＡのローカルインスタンス処理部２０から、ノードＡのネットワーク層処理部３０に対し、キー「Ｘ」が登録されていることを返す。このとき、ノードＡのローカルインスタンス処理部２０に登録された、キー「Ｘ」の共有データの値「null」もあわせて返される。また、ノードＡのネットワーク層処理部３０では、ネットワーク層マップ３０Ａに対し、キー「Ｘ」の共有データが登録されているノードとしてノードＢを登録する。
【００５０】
（６）ノードＡのネットワーク層処理部３０から、ノードＢのネットワーク層処理部３０に対し、ノードＡにキー「Ｘ」が登録されていること及びキー「Ｘ」の共有データの値「null」が返される。このとき、ノードＢのネットワーク層処理部３０では、ネットワーク層マップ３０Ａに対し、キー「Ｘ」の共有データが登録されているノードとしてノードＡを登録する。
【００５１】
（７）ノードＢのローカルインスタンス処理部２０から、ノードＢのネットワーク層処理部３０に対し、キー「Ｘ」及びキー「Ｘ」の共有データの値「null」で、ローカルインスタンス処理部２０に対し、反映依頼を送信する。
【００５２】
（８）ノードＢのローカルインスタンス処理部２０では、ローカルインスタンスマップ２０Ａにおけるキー「Ｘ」のデータと更新値とがともに「null」であるため、更新を反映させずに処理を終了する。なお、このように更新を反映せず、また、更新依頼の送信元ノードであるノードＡ以外で、キー「Ｘ」の共有データにアクセスしているノードが存在しないため、ここでノードＢのネットワーク層処理部３０から他ノードにさらに反映依頼を送信することはない。
【００５３】
図２１は、ノードＡでキー「Ｘ」の共有データの値を「ＹＹＹ」で更新する処理シーケンスを示す（Ｂ−１）。
（１）ノードＡのユーザアプリケーション処理部１０から、ノードＡのローカルインスタンス処理部２０に対し、キーが「Ｘ」の共有データを「ＹＹＹ」で更新する更新依頼を送信する。
【００５４】
（２−ａ）ノードＡのローカルインスタンス処理部２０では、ローカルインスタンスマップ２０Ａにおけるキー「Ｘ」の共有データを「ＹＹＹ」に更新し、ユーザアプリケーション処理部１０に対し、更新が成功したことを返す。
【００５５】
（２−ｂ）ノードＡのローカルインスタンス処理部２０から、ノードＡのネットワーク層処理部３０に対し、他ノードにおけるキー「Ｘ」の共有データに更新を反映させるように反映依頼を送信する依頼をする。
【００５６】
（３）ノードＡのネットワーク層処理部３０から、ネットワーク層マップ３０Ａにキー「Ｘ」の共有データを使用しているノードとして登録されているノードＢのネットワーク層処理部３０に対し、キー「Ｘ」の共有データに更新を反映させるように反映依頼を送信する。
【００５７】
（４）ノードＢのネットワーク層処理部３０から、さらに、ノードＢのローカルインスタンス処理部２０に対し、ローカルインスタンスマップ２０Ａにおけるキー「Ｘ」の共有データへの反映依頼を送信する。
【００５８】
（５−ａ）ノードＢのローカルインスタンス処理部２０では、ローカルインスタンスマップ２０Ａにおけるキー「Ｘ」のデータを「ＹＹＹ」に更新し、ネットワーク層処理部３０に対し、更新が成功したことを返す。なお、反映依頼の送信元ノードであるノードＡ以外で、キー「Ｘ」の共有データにアクセスしているノードが存在しないため、ここでノードＢのネットワーク層処理部３０から他ノードにさらに反映依頼を送信することはない。
【００５９】
（５−ｂ）ノードＢのローカルインスタンス処理部２０から、ノードＢのユーザアプリケーション処理部１０に対し、ローカルインスタンスマップ２０Ａのキー「Ｘ」の共有データが更新されたことを通知するイベントを発行する。
【００６０】
図２２は、ノードＢでキー「Ｘ」の共有データの値を参照する処理シーケンスを示す（Ｂ−２）。
（１）ノードＢのユーザアプリケーション処理部１０から、ノードＢのローカルインスタンス処理部２０に対し、キー「Ｘ」の共有データの参照依頼を送信する。
【００６１】
（２）ノードＢのローカルインスタンス処理部２０では、ローカルインスタンスマップ２０Ａのキー「Ｘ」の共有データの値である「ＹＹＹ」を、ユーザアプリケーション処理部１０に返す。
【００６２】
図２３は、ノードＡでキー「Ｘ」の共有データを削除する処理シーケンスを示す（Ｃ−１）。
（１）ノードＡのユーザアプリケーション処理部１０から、ノードＡのローカルインスタンス処理部２０に対し、キー「Ｘ」の共有データの削除依頼を送信する。
【００６３】
（２−ａ）ノードＡのローカルインスタンス処理部２０では、ローカルインスタンスマップ２０Ａから、キー「Ｘ」のデータを削除し、ユーザアプリケーション処理部１０に対し、削除が完了したことを通知する。
【００６４】
（２−ｂ）ノードＡのローカルインスタンス処理部２０から、ノードＡのネットワーク層処理部３０に対し、ネットワーク層マップ３０から、キー「Ｘ」のデータを削除させる削除依頼を送る。
【００６５】
（３）ノードＡのネットワーク層処理部３０では、ネットワーク層マップ３０から、キー「Ｘ」のデータを削除するとともに、ネットワーク層マップ３０Ａにキー「Ｘ」の共有データを使用しているノードとして登録されているノードＢのネットワーク層処理部３０に対し、キー「Ｘ」の削除依頼を送信する。これに従い、ノードＢのネットワーク層処理部３０では、ネットワーク層マップ３０Ａのキー「Ｘ」に対応するノードから、ノードＡを削除する。
【００６６】
図２４は、ノードＢでキー「Ｘ」の共有データを削除する処理シーケンスを示す（Ｃ−２）。
（１）ノードＢのユーザアプリケーション処理部１０から、ノードＢのローカルインスタンス処理部２０に対し、キーが「Ｘ」のデータの削除依頼を送る。
【００６７】
（２−ａ）ノードＢのローカルインスタンス処理部２０では、キーが「Ｘ」のデータを削除し、ユーザアプリケーション処理部１０に対し、削除が完了したことを通知する。
（２−ｂ）ノードＢのローカルインスタンス処理部２０から、ノードＢのネットワーク層処理部３０に対し、ネットワーク層マップ３０から、キー「Ｘ」のデータを削除させる削除依頼を送る。そして、ノードＢのネットワーク層処理部３０では、ネットワーク層マップ３０から、キー「Ｘ」のデータを削除する。なお、この削除の時点で、ネットワーク層マップ３０において、キー「Ｘ」にアクセスしているノードは登録されていないため、他ノードに削除依頼を送信することはない。
【００６８】
［具体例２：ノード間における集約処理］
具体例２では、次のことを実現させる。
（Ａ）前準備
Ａ−１  ノードＡでキー「Ｍ」の共有データを登録する
Ａ−２  ノードＢでキー「Ｍ」の共有データを登録する
（Ｂ）集約処理
Ｂ−１  ノードＡでキー「Ｍ」の共有データの値を「１３」で更新する
Ｂ−２  ノードＢでキー「Ｍ」の共有データの値を「９」で更新する
Ｂ−３  ノードＢでキー「Ｍ」の共有データを参照する
（Ｃ）後処理
Ｃ−１  ノードＡでキー「Ｍ」の共有データを削除する
Ｃ−２  ノードＢでキー「Ｍ」の共有データを削除する
図２５は、ノードＡでキー「Ｍ」の共有データを登録する処理シーケンスを示す（Ａ−１）。
【００６９】
（１）ノードＡのユーザアプリケーション処理部１０から、ノードＡのローカルインスタンス処理部２０に対し、新規共有データの登録依頼を送る。このとき、キーが「Ｍ」，共有データの初期値が「null」，更新関数が、集約処理として最大値を求める「max()」で登録依頼がなされるとする。ここで、（２）〜（６）については、上述の具体例１におけるＡ−１の処理と同様であるため、説明を省略する。
【００７０】
図２６は、ノードＢでキー「Ｍ」の共有データを登録する処理シーケンスを示す（Ａ−２）。
（１）ノードＢのユーザアプリケーション処理部１０から、ノードＢのローカルインスタンス処理部２０に対し、新たな共有データの登録依頼を送る。このとき、キーが「Ｘ」，共有データの初期値が「null」，更新関数が「max()」で登録依頼がなされるとする。ここで、（２）〜（８）については、上述の具体例１におけるＡ−２の処理と同様であるため、説明を省略する。
【００７１】
図２７は、ノードＡでキー「Ｍ」の共有データの値を「１３」で更新する処理シーケンスを示す（Ｂ−１）。
（１）ノードＡのユーザアプリケーション処理部１０から、ノードＡのローカルインスタンス処理部２０に対し、キーが「Ｍ」の共有データを「１３」で更新する更新依頼を送る。
【００７２】
（２−ａ）ノードＡのローカルインスタンス処理部２０では、ローカルインスタンスマップ２０Ａのキー「Ｍ」の共有データを「１３」に更新し、ユーザアプリケーション処理部１０に対し、更新が成功したことを返す。
【００７３】
（２−ｂ）ノードＡのローカルインスタンス処理部２０から、ノードＡのネットワーク層処理部３０に対し、他ノードにおけるキー「Ｍ」の共有データに更新を反映させるように反映依頼を送る。
【００７４】
（３）ノードＡのネットワーク層処理部３０から、ネットワーク層マップ３０Ａにキー「Ｍ」の共有データを使用しているノードとして登録されているノードＢのネットワーク層処理部３０に対し、キー「Ｍ」の共有データに対する更新の反映依頼が送信される。
【００７５】
（４）ノードＢのネットワーク層処理部３０から、さらに、ノードＢのローカルインスタンス処理部２０に対し、ローカルインスタンスマップ２０Ａにおけるキー「Ｍ」の共有データに対する更新の反映依頼を送信する。
【００７６】
（５−ａ）ノードＢのローカルインスタンスでは、ローカルインスタンスマップ２０Ａにおけるキー「Ｍ」のデータがこの時点で「null」であり、更新関数「max()」に基づいて演算して比較すると、「null」よりも更新値である「１３」のほうが大きいため、「１３」で更新する。そして、ネットワーク層処理部３０に対し、更新が成功したことを返す。なお、更新依頼の送信元ノードであるノードＡ以外で、キー「Ｍ」の共有データにアクセスしているノードが存在しないため、ここでノードＢのネットワーク層処理部３０から他ノードにさらに更新の反映依頼を送信することはない。
【００７７】
（５−ｂ）ノードＢのローカルインスタンス処理部２０から、ノードＢのユーザアプリケーション処理部１０に対し、ローカルインスタンスマップ２０Ａのキー「Ｍ」のデータが更新されたことを通知するイベントを発行する。
【００７８】
図２８は、ノードＢでキー「Ｍ」の共有データの値を「９」で更新する処理シーケンスを示す（Ｂ−２）。
（１）ノードＢのユーザアプリケーション処理部１０から、ノードＢのローカルインスタンス処理部２０に対し、キーが「Ｍ」のデータを「９」で更新する更新依頼を送る。
【００７９】
（２）ノードＢのローカルインスタンス処理部２０では、キー「Ｍ」の更新関数「max()」に基づいて演算して比較すると、ローカルインスタンスマップ２０Ａに登録されたキー「Ｍ」のデータが「１３」である一方、更新値が「９」であって「１３」より小さいため、更新を行わない。そして、ユーザアプリケーション処理部１０に対し、更新が失敗したことを返す。
【００８０】
図２９は、ノードＡでキー「Ｍ」の共有データの値を参照する処理シーケンスを示す（Ｂ−３）。
（１）ノードＡのユーザアプリケーション処理部１０から、ノードＡのローカルインスタンス処理部２０に対し、キーが「Ｍ」のデータの参照依頼を送信する。
【００８１】
（２）ノードＡのローカルインスタンス処理部２０では、ローカルインスタンスマップ２０Ａにおけるキー「Ｍ」の共有データの値である「１３」を、ユーザアプリケーション処理部１０に返す。
【００８２】
図３０は、ノードＡでキー「Ｍ」の共有データを削除する処理シーケンスを示す（Ｃ−１）。
（１）ノードＡのユーザアプリケーション処理部１０から、ノードＡのローカルインスタンス処理部２０に対し、キーが「Ｍ」のデータの削除依頼を送る。また、（２）〜（３）については、上述の具体例１におけるＣ−１の処理と同様であるため、説明を省略する。
【００８３】
図３１は、ノードＢでキー「Ｍ」の共有データを削除する処理シーケンスを示す（Ｃ−２）。
（１）ノードＢのユーザアプリケーション処理部１０から、ノードＢのローカルインスタンス処理部２０に対し、キーが「Ｍ」のデータの削除依頼を送る。また、（２）については、上述の具体例１におけるＣ−２の処理と同様であるため、説明を省略する。
【００８４】
［具体例３：ノード間における同期待ち合わせ処理］
具体例３では、次のことを実現させる。
（Ａ）前準備
Ａ−１  ノードＡでキー「Ｓ」の共有データを登録する
Ａ−２  ノードＢでキー「Ｓ」の共有データを登録する
（Ｂ）集約処理
Ｂ−１  ノードＡでキー「Ｓ」の共有データの値に「Ａ」を加えて更新する
Ｂ−２  ノードＢでキー「Ｓ」の共有データの値に「Ｂ」を加えて更新する
Ｂ−３  ノードＡでキー「Ｓ」の共有データを参照する
Ｂ−４  ノードＢでキー「Ｓ」の共有データを参照する
（Ｃ）後処理
Ｃ−１  ノードＡでキー「Ｓ」の共有データを削除する
Ｃ−２  ノードＢでキー「Ｓ」の共有データを削除する
図３２は、ノードＡでキー「Ｓ」の共有データを登録する処理シーケンスを示す（Ａ−１）。
【００８５】
（１）ノードＡのユーザアプリケーション処理部１０から、ノードＡのローカルインスタンス処理部２０に対し、新たな共有データの登録依頼を送る。このとき、キーが「Ｓ」，共有データの初期値が「null」，更新関数が、集合に新たな要素を加える「add()」で登録依頼がなされるとする。ここで、（２）〜（６）については、上述の具体例１におけるＡ−１の処理と同様であるため、説明を省略する。
【００８６】
図３３は、ノードＢでキー「Ｓ」の共有データを登録する処理シーケンスを示す（Ａ−２）。
（１）ノードＢのユーザアプリケーション処理部１０から、ノードＢのローカルインスタンス処理部２０に対し、新たな共有データの登録依頼を送る。このとき、ノードＡと同様に、キーが「Ｓ」，共有データの初期値が「null」，更新関数が「add()」で登録依頼がなされる。また、（２）〜（８）については、上述の具体例１におけるＡ−２の処理と同様であるため、説明を省略する。
【００８７】
図３４は、ノードＡでキー「Ｓ」の共有データの値である集合に、要素「Ａ」を加える処理シーケンスを示す（Ｂ−１）。
（１）ノードＡのユーザアプリケーション処理部１０から、ノードＡのローカルインスタンス処理部２０に対し、キーが「Ｓ」の共有データに「Ａ」を加えて更新する更新依頼を送る。
【００８８】
（２−ａ）ノードＡのローカルインスタンス処理部２０では、ローカルインスタンスマップ２０Ａにおけるキー「Ｓ」の共有データの値である集合に「Ａ」を加えて更新する。その結果、ノードＡのローカルインスタンスマップ２０Ａにおけるキー「Ｓ」のデータは、｛Ａ｝となる。そして、ユーザアプリケーション処理部１０に対し、更新が成功したことを返す。
【００８９】
（２−ｂ）ノードＡのローカルインスタンス処理部２０から、ノードＡのネットワーク層処理部３０に対し、他ノードにおけるキー「Ｓ」の共有データに更新を反映させるように反映依頼を送る。
【００９０】
（３）ノードＡのネットワーク層処理部３０から、ネットワーク層マップ３０Ａにキー「Ｓ」の共有データを使用しているノードとして登録されているノードＢのネットワーク層処理部３０に対し、キー「Ｓ」の共有データに更新を反映させるように反映依頼を送信する。
【００９１】
（４）ノードＢのネットワーク層処理部３０から、さらに、ノードＢのローカルインスタンス処理部２０に対し、ローカルインスタンスマップ２０Ａにおけるキー「Ｓ」の共有データに対する更新の反映依頼が送られる。
【００９２】
（５−ａ）ノードＢのローカルインスタンス処理部２０では、更新関数「add()」に基づき、ローカルインスタンスマップ２０Ａにおけるキー「Ｓ」の共有データに「Ａ」を加えて更新する。その結果、ノードＢのローカルインスタンスマップ２０Ａにおけるキー「Ｓ」のデータは、｛Ａ｝となる。そして、ネットワーク層処理部３０に対し、更新が成功したことを返す。なお、更新依頼の送信元ノードであるノードＡ以外で、キー「Ｘ」の共有データにアクセスしているノードが存在しないため、ここでノードＢのネットワーク層処理部３０から他ノードにさらに反映依頼を送信することはない。
【００９３】
（５−ｂ）ノードＢのローカルインスタンス処理部２０から、ノードＡのユーザアプリケーション処理部１０に対し、ローカルインスタンスマップ２０Ａのキー「Ｓ」のデータが更新されたことを通知するイベントを発行する。
【００９４】
図３５は、ノードＢでキー「Ｓ」の共有データの値である集合に要素「Ｂ」を加える処理シーケンスを示す（Ｂ−２）。
（１）ノードＢのユーザアプリケーション処理部１０から、ノードＢのローカルインスタンス処理部２０に対し、キーが「Ｓ」の共有データに「Ｂ」を加えて更新する更新依頼を送る。
【００９５】
（２−ａ）ノードＢのローカルインスタンス処理部１０では、ローカルインスタンスマップ２０Ａにおけるキー「Ｓ」のデータである集合に「Ｂ」を加えて更新する。その結果、ノードＢのローカルインスタンスマップ２０Ａにおけるキー「Ｓ」のデータは、｛Ａ，Ｂ｝となる。そして、ユーザアプリケーション処理部１０に対し、更新が成功したことを返す。
【００９６】
（２−ｂ）ノードＢのローカルインスタンス処理部２０から、ノードＢのネットワーク層処理部３０に対し、他ノードにおけるキー「Ｓ」の共有データに対し更新を反映させるように反映依頼を送る。
【００９７】
（３）ノードＢのネットワーク層処理部３０から、ネットワーク層マップ３０Ａにキー「Ｓ」の共有データにアクセスしているノードとして登録されているノードＡのネットワーク層処理部３０に対し、キー「Ｓ」の共有データに対する更新の反映依頼を送信する。
【００９８】
（４）ノードＡのネットワーク層処理部３０から、さらに、ノードＡのローカルインスタンス処理部２０に対し、ローカルインスタンスマップ２０Ａにおけるキー「Ｓ」の共有データに対する更新の反映依頼を送る。
【００９９】
（５−ａ）ノードＡのローカルインスタンス処理部２０では、更新関数「add()」に基づき、ローカルインスタンスマップ２０Ａにおけるキー「Ｓ」の共有データに「Ｂ」を加えて更新する。その結果、ノードＡのローカルインスタンスマップ２０Ａにおけるキー「Ｓ」のデータも、｛Ａ，Ｂ｝となる。そして、ネットワーク層処理部３０に対し、更新が成功したことを返す。
【０１００】
（５−ｂ）ノードＡのローカルインスタンス処理部２０から、ノードＡのユーザアプリケーション処理部１０に対し、ローカルインスタンスマップ２０Ａのキー「Ｓ」のデータが更新されたことを通知するイベントを送信する。
【０１０１】
図３６は、ノードＡでキー「Ｓ」の共有データの値を参照する処理シーケンスを示す（Ｂ−３）。
（１）ノードＡのユーザアプリケーション処理部１０から、ノードＡのローカルインスタンス処理部２０に対し、キーが「Ｓ」のデータの参照依頼を送る。
【０１０２】
（２）ノードＡのローカルインスタンス処理部２０では、ローカルインスタンスマップ２０Ａにおける更新依頼がなされたキー「Ｓ」のデータの値である｛Ａ，Ｂ｝を、ユーザアプリケーション処理部１０に返す。
【０１０３】
図３７は、ノードＢでキー「Ｓ」の共有データの値を参照する処理シーケンスを示す（Ｂ−４）。
（１）ノードＢのユーザアプリケーション処理部１０から、ノードＢのローカルインスタンス処理部２０に対し、キーが「Ｓ」のデータの参照依頼を送る。
【０１０４】
（２）ノードＢのローカルインスタンス処理部２０では、ローカルインスタンスマップ２０Ａにおける更新依頼がなされたキー「Ｓ」の共有データの値である｛Ａ，Ｂ｝を、ユーザアプリケーション処理部１０に返す。
【０１０５】
図３８は、ノードＡでキー「Ｓ」の共有データを削除する処理シーケンスを示す（Ｃ−１）。
（１）ノードＡのユーザアプリケーション処理部１０から、ノードＡのローカルインスタンス処理部２０Ａに対し、キーが「Ｓ」の共有データの削除依頼を送る。また、（２）〜（３）については、上述の具体例１におけるＣ−１の処理と同様であるため、説明を省略する。
【０１０６】
図３９は、ノードＡでキー「Ｓ」の共有データを削除する処理シーケンスを示す（Ｃ−２）。
（１）ノードＢのユーザアプリケーションから、ノードＢのローカルインスタンス処理部２０に対し、キーが「Ｓ」の共有データの削除依頼を送る。また、（２）については、上述の具体例１におけるＣ−２の処理と同様であるため、説明を省略する。
【０１０７】
かかる本システムにおけるデータ共有機構によれば、各ノードのローカルインスタンス処理部２０において、夫々共有データの値を保持している。さらに、ユーザアプリケーション処理部１０により、共有データの値に対する参照依頼及び更新依頼のいずれがなされた場合であっても、そのアクセスは、自ノードのローカルインスタンス処理部２０に対して行う。なお、このとき、当該共有データにアクセスするノードは自ノードだけであるため、他ノードとの間での排他制御は必要ない。そして、ローカルインスタンス処理部２０で保持する共有データへのアクセスが完了した時点で、共有データへのアクセスが完了したことがユーザアプリケーション処理部１０に対して通知される。その一方で、ローカルインスタンス処理部２０及びネットワーク層処理部３０により、ユーザアプリケーション処理部１０による処理とは独立して（非同期に）、他ノードの共有データの値を更新する。このため、本システムでは、ユーザアプリケーション処理部１０の処理過程において、共有データへのアクセスが高速なローカルアクセスのみとなるとともに、他ノードの共有データへの同期処理も排他制御も行わない。したがって、他ノードの共有データにリモートアクセスを行うこと及び同期処理や排他制御を行うことによるユーザアプリケーション処理部１０の処理遅延を回避することができる。
【０１０８】
ここで、本システムでは、ローカルインスタンス処理部２０で保持する各共有データに、更新関数を対応付けている。そして、あるノードにおける共有データに対する更新値を他ノードに反映させるときに、単に他ノードの共有データを上書きするのではなく、更新関数による演算結果に応じて更新を行う。さらに、この更新関数による演算結果は、可換で冪等である。このため、ユーザアプリケーション処理部１０により、複数のノードで夫々共有データの更新が行われた場合であっても、その更新順序を厳守して排他制御をしつつ他ノードの共有データに対し即時に同期を取る必要がない。同期先のノードによって共有データの更新順序が逆転したとしても、各ノード間において共有データの値に不整合が生じることがないからである。
【０１０９】
また、ローカルインスタンスマップ２０Ａに対し新規に共有データを登録するときや、ノードを起動するときに、ネットワークに接続された全ノードのうち、ノード設定ファイル３０Ｂに設定されたノードに限り、ネットワーク層マップ３０Ａに登録がされる。そして、その共有データに対する更新の反映も、ノード設定ファイル３０Ｂに設定されたノードに限られる。このため、ノード設定ファイル３０Ｂへの設定内容次第で、共有データの同期処理を行うノードの範囲を変更することができる。
【０１１０】
そして、本システムでは、他ノードのローカルインスタンスマップ２０Ａの共有データが更新され、その更新の反映依頼を受信してこれを自ノードのローカルインスタンスマップ２０Ａの共有データに反映させたときに、次の処理を行っている。即ち、自ノードのネットワーク層マップ３０Ａに登録された他ノードのうち、反映依頼の送信元ノード以外の他ノードに対して、さらにその更新の反映依頼を送信している。こうすることにより、反映依頼の送信元ノードでは共有データの同期処理を行う対象として設定されていないノードであっても、自ノードにおいて共有データの同期処理を行う対象として設定されていれば、同期処理を行うことができる。そして、この処理が各ノードで繰り返されることにより、同期処理を行うノードの範囲が段階的に広がっていく。
【０１１１】
なお、ユーザアプリケーション処理部１０で使用する共有データが１つであれば、上述の処理並びにローカルインスタンスマップ２０Ａ及びネットワーク層マップ３０Ａにおいて、キーを用いなくてもよい。
【０１１２】
また、ネットワークに接続された全ノードにおいて共有データが使用され、全ノードとの間で共有データの同期処理を行う場合には、ノード設定ファイル３０Ｂは無くてもよい。さらに、ネットワーク層マップ３０Ａについても、ネットワークに接続された全ノードにおいて全ての共有データが使用され、全ノードとの間で全ての共有データの同期処理を行う場合であって、且つネットワークに接続された他ノードが識別できているときには、これが無くてもデータ共有機構は実現可能である。
【０１１３】
さらに、各ノードでアクセスしている共有データの情報を、任意のタイミングで、ノード間で交換してもよい。そのようにすれば、共有データにアクセスしているノード間において、より確実に更新を反映させて同期を取ることができる
また、上述のローカルインスタンス処理部２０及びネットワーク層処理部３０による処理のほかに、必要に応じて、共有データにアクセスしている全てのノードにおいて、共有データの値の同期を取ってもよい。かかる同期は、アプリケーションにおいて、共有データにアクセスしている全ノードにおいてその値が一致していなければ次の処理に進めない場合や、ユーザアプリケーションの処理が終了するとき等に必要に応じて取ればよい。そして、各ノードにより行われた更新が他ノードに反映されていることを確認する方法としては、次のようなものがある。即ち、共有データの更新ごとに、一意に識別するＩＤを振っておく。さらに、更新が反映されているかを確認するメッセージを、ＩＤごとに各ノードが他の全てのノードに送信する。そして、全てのノードから更新が反映されている応答を受信したことをもって、共有データの値の同期が取れていることを確認する。また、全てのノードの共有データが一致していることを確認する方法としては、チェックサム等を用いてもよい。
【０１１４】
ここで、一般に、複数のノードを用い、分散コンピューティングを適用して処理を行う例として、いわゆる配送問題や最適配置問題、巡回セールスマン問題等の組合せ最適化問題の求解がある。そして、組合せ最適化問題の求解においては、冗長な探索を回避して処理を高速化するべく、並列分枝限定法が適用される。この並列分枝限定法を分散コンピューティングで行う場合、演算対象となる値の範囲を分割し、分割された範囲内において演算を行う複数の子問題を生成して各ノードで分散処理させる。そして、各ノードでは、子問題の処理結果として、暫定解が夫々算出され、最終的に、全ノードで算出された暫定解のうち、目標とする解に最も近いものが採用される。ここで、処理の過程において、各ノードで算出された暫定解のうち、最終的な解に近いもの又はその評価値を、子問題を処理するノード間において共有することで、それ以降の子問題の処理において不要な探索を回避する枝刈りを行うことができる。例えば、複数の都市及びその各都市間の距離が与えられ、その都市の全てを巡って出発地点に戻るための移動距離が最短のルートを探索する巡回セールスマン問題の求解では、次のことが可能である。即ち、子問題を処理する各ノードで夫々ルートを探索した結果、あるノードにおいて、移動距離が１００キロメートルのルートが暫定解として得られたとする。そして、その移動距離が、その時点で各ノードで得られた子問題における暫定解の移動距離のうち最短である場合、その１００キロメートルという値を評価値としてノード間で共有する。そうすれば、それ以降の各ノードにおけるルート探索において、移動距離が１００キロメートルを超えたときには、少なくともそのルートは最終的な目標とする解になり得ないことが明らかとなるため、その処理を中断し、不要な演算を省くことができる。
【０１１５】
そして、かかる枝刈りのためにノード間において共有するデータは、処理過程において必ずしも即時に同期を取る必要がない。このデータにおいて即時に同期が取れていなくても、不要な演算の一部を省くことができないだけで、最終的な処理結果に誤りが生じることはないからである。そして、かかる分散コンピューティングで並列処理を行う場合、共有データの同期をとることと、その同期を取ることにより処理に遅延が発生することと、を対比すれば、処理における遅延の発生を回避することを優先させる必要がある。本システムにおけるデータ共有機構は、上述のように、共有データの同期処理を、ユーザアプリケーションの処理から独立させて非同期に行うため、ユーザアプリケーションの処理に遅延を発生させない。このため、このような枝刈りに用いるデータを共有するのに有効である。
【０１１６】
以上の実施形態に関し、更に以下の付記を開示する。
【０１１７】
（付記１）ネットワーク接続された複数のノードの各々で実行されるユーザアプリケーションが、ノード間で共通して使用する共有データにアクセスしつつ連携して処理を行うシステムにおいて、各ノードで夫々実行されるデータ共有プログラムであって、自ノードのユーザアプリケーションから、共有データの値、及び演算結果が可換且つ冪等である関数がその共有データの更新における演算内容として定義された更新関数が指定された、新規共有データの登録依頼を受け付けたときに、その共有データの値及び更新関数を自ノードの記憶装置に登録する第１の登録ステップと、自ノードのユーザアプリケーションから共有データに対する参照依頼を受け付けたときに、自ノードに登録された共有データの値を、自ノードのユーザアプリケーションに対して返す参照ステップと、自ノードのユーザアプリケーションから、共有データに対する更新依頼を更新値とともに受け付けたときに、前記更新関数による演算結果に応じて、自ノードに登録された共有データの値を更新値で更新し、更新完了の通知を自ノードのユーザアプリケーションに対して返す更新ステップと、自ノードに登録された共有データの値を更新したときに、自ノードのユーザアプリケーションに対する更新完了の通知とは非同期に、その更新値を他ノードに登録された共有データの値に反映させる反映依頼を、他ノードに対して送信する依頼ステップと、他ノードに登録された共有データの値が当該他ノードにおいて更新され、その更新値を自ノードに登録された共有データの値に反映させる反映依頼を当該他ノードから受信したときに、前記更新関数による演算結果に応じて、当該他ノードにおける更新値を、自ノードに登録された共有データに反映させる反映ステップと、を実行することを特徴とするデータ共有プログラム。
【０１１８】
（付記２）前記更新関数には、ユーザアプリケーションにおいて演算内容を任意に定義可能なユーザ定義関数を用いることができることを特徴とする付記１記載のデータ共有プログラム。
【０１１９】
（付記３）全ての他ノードのうち、自ノードとの間で共有データの値の同期を取る対象とする他ノードを特定する情報を自ノードの記憶装置に登録する第２の登録ステップをさらに含み、前記依頼ステップは、前記登録された他ノードに対してのみ、更新値を反映させる依頼を送信することを特徴とする付記１又は付記２に記載のデータ共有プログラム。
【０１２０】
（付記４）前記反映ステップにより、他ノードにおける更新値を自ノードに登録された共有データの値に反映させたときに、反映依頼の送信元であるノード以外の他ノードに対し、その更新値をさらに反映させる依頼を送信する再依頼ステップをさらに実行することを特徴とする付記１〜付記３のいずれか１つに記載のデータ共有プログラム。
【０１２１】
（付記５）前記反映ステップにより、他ノードにおける更新値を自ノードに登録された共有データの値に反映させたときに、自ノードで動作するユーザアプリケーションに対し、自ノードに登録された共有データの値が更新されたことを通知するイベントを発行することを特徴とする付記１〜付記４のいずれか１つに記載のデータ共有プログラム。
【０１２２】
（付記６）自ノードを起動したときに、自ノードに登録された共有データの値と、他ノードに登録された共有データの値と、の同期を取る起動ステップをさらに含むことを特徴とする付記１〜付記５のいずれか１つに記載のデータ共有プログラム。
【０１２３】
（付記７）自ノードのユーザアプリケーションから、共有データの削除依頼があったときに、自ノードに登録された共有データの値及び更新関数を削除する削除ステップをさらに含むことを特徴とする付記１〜付記６のいずれか１つに記載のデータ共有プログラム。
【０１２４】
（付記８）少なくとも、前記登録ステップ，前記参照ステップ，前記更新ステップ，前記依頼ステップ及び前記反映ステップは、オペレーティングシステム上で動作するミドルウェア又はユーザアプリケーションにリンクするライブラリにおいて実現されることを特徴とする付記１〜付記７のいずれか１つに記載のデータ共有プログラム。
【０１２５】
（付記９）ネットワーク接続された複数のノードの各々で実行されるユーザアプリケーションが、ノード間で共通して使用する共有データにアクセスしつつ連携して処理を行うシステムにおいて、各ノードで夫々実行されるデータ共有方法であって、自ノードのユーザアプリケーションから、共有データの値、及び演算結果が可換且つ冪等である関数がその共有データの更新における演算内容として定義された更新関数が指定された、新規共有データの登録依頼を受け付けたときに、その共有データの値及び更新関数を自ノードの記憶装置に登録する第１の登録ステップと、自ノードのユーザアプリケーションから共有データに対する参照依頼を受け付けたときに、自ノードに登録された共有データの値を、自ノードのユーザアプリケーションに対して返す参照ステップと、自ノードのユーザアプリケーションから、共有データに対する更新依頼を更新値とともに受け付けたときに、前記更新関数による演算結果に応じて、自ノードに登録された共有データの値を更新値で更新し、更新完了の通知を自ノードのユーザアプリケーションに対して返す更新ステップと、自ノードに登録された共有データの値を更新したときに、自ノードのユーザアプリケーションに対する更新完了の通知とは非同期に、その更新値を他ノードに登録された共有データの値に反映させる反映依頼を、他ノードに対して送信する依頼ステップと、他ノードに登録された共有データの値が当該他ノードにおいて更新され、その更新値を自ノードに登録された共有データの値に反映させる反映依頼を当該他ノードから受信したときに、前記更新関数による演算結果に応じて、当該他ノードにおける更新値を、自ノードに登録された共有データに反映させる反映ステップと、を実行することを特徴とするデータ共有方法。
【０１２６】
（付記１０）ネットワーク接続された複数のノードの各々で実行されるユーザアプリケーションが、ノード間で共通して使用する共有データにアクセスしつつ連携して処理を行うシステムにおいて、各ノードに設けられるデータ共有装置であって、自ノードのユーザアプリケーションから、共有データの値、及び演算結果が可換且つ冪等である関数がその共有データの更新における演算内容として定義された更新関数が指定された、新規共有データの登録依頼を受け付けたときに、その共有データの値及び更新関数を自ノードの記憶装置に登録する第１の登録手段と、自ノードのユーザアプリケーションから共有データに対する参照依頼を受け付けたときに、自ノードに登録された共有データの値を、自ノードのユーザアプリケーションに対して返す参照手段と、自ノードのユーザアプリケーションから、共有データに対する更新依頼を更新値とともに受け付けたときに、前記更新関数による演算結果に応じて、自ノードに登録された共有データの値を更新値で更新し、更新完了の通知を自ノードのユーザアプリケーションに対して返す更新手段と、自ノードに登録された共有データの値を更新したときに、自ノードのユーザアプリケーションに対する更新完了の通知とは非同期に、その更新値を他ノードに登録された共有データの値に反映させる反映依頼を、他ノードに対して送信する依頼手段と、他ノードに登録された共有データの値が当該他ノードにおいて更新され、その更新値を自ノードに登録された共有データの値に反映させる反映依頼を当該他ノードから受信したときに、前記更新関数による演算結果に応じて、当該他ノードにおける更新値を、自ノードに登録された共有データに反映させる反映手段と、を含んで構成されたことを特徴とするデータ共有装置。
【図面の簡単な説明】
【０１２７】
【図１】データ共有機構が適用されるシステムの全体構成の説明図
【図２】ノードの構成の説明図
【図３】ローカルインスタンスマップの説明図
【図４】ネットワーク層マップの説明図
【図５】ノード設定ファイルの説明図
【図６】ローカルインスタンス処理部による処理（共有データの登録依頼時）のフローチャート
【図７】ローカルインスタンス処理部による処理（共有データの参照依頼時）のフローチャート
【図８】ローカルインスタンス処理部による処理（共有データの更新依頼時）のフローチャート
【図９】ローカルインスタンス処理部による処理（他ノードにおける更新の反映依頼時）のフローチャート
【図１０】ローカルインスタンス処理部による処理（共有データの削除依頼時）のフローチャート
【図１１】ネットワーク層処理部による処理（自ノード起動時）のフローチャート
【図１２】ネットワーク層処理部による処理（他ノード起動時）のフローチャート
【図１３】ネットワーク層処理部による処理（共有データの登録依頼時）のフローチャート
【図１４】ネットワーク層処理部による処理（共有データの更新依頼時）のフローチャート
【図１５】ネットワーク層処理部による処理（他ノードにおける更新の反映依頼時）のフローチャート
【図１６】ネットワーク層処理部による処理（他ノードにおける更新の反映依頼時）のフローチャート
【図１７】ネットワーク層処理部による処理（他ノードにおける更新の反映依頼時）のフローチャート
【図１８】ネットワーク層処理部による処理（共有データの削除依頼時）のフローチャート
【図１９】ノード間におけるデータ配布の例の処理シーケンス図（Ａ−１）
【図２０】ノード間におけるデータ配布の例の処理シーケンス図（Ａ−２）
【図２１】ノード間におけるデータ配布の例の処理シーケンス図（Ｂ−１）
【図２２】ノード間におけるデータ配布の例の処理シーケンス図（Ｂ−２）
【図２３】ノード間におけるデータ配布の例の処理シーケンス図（Ｃ−１）
【図２４】ノード間におけるデータ配布の例の処理シーケンス図（Ｃ−２）
【図２５】ノード間における集約処理の処理シーケンス図（Ａ−１）
【図２６】ノード間における集約処理の処理シーケンス図（Ａ−２）
【図２７】ノード間における集約処理の処理シーケンス図（Ｂ−１）
【図２８】ノード間における集約処理の処理シーケンス図（Ｂ−２）
【図２９】ノード間における集約処理の処理シーケンス図（Ｂ−３）
【図３０】ノード間における集約処理の処理シーケンス図（Ｃ−１）
【図３１】ノード間における集約処理の処理シーケンス図（Ｃ−２）
【図３２】ノード間における同期待ち合わせ処理の処理シーケンス図（Ａ−１）
【図３３】ノード間における同期待ち合わせ処理の処理シーケンス図（Ａ−２）
【図３４】ノード間における同期待ち合わせ処理の処理シーケンス図（Ｂ−１）
【図３５】ノード間における同期待ち合わせ処理の処理シーケンス図（Ｂ−２）
【図３６】ノード間における同期待ち合わせ処理の処理シーケンス図（Ｂ−３）
【図３７】ノード間における同期待ち合わせ処理の処理シーケンス図（Ｂ−４）
【図３８】ノード間における同期待ち合わせ処理の処理シーケンス図（Ｃ−１）
【図３９】ノード間における同期待ち合わせ処理の処理シーケンス図（Ｃ−２）
【符号の説明】
【０１２８】
１０    ユーザアプリケーション
２０    ローカルインスタンス処理部
２０Ａ    ローカルインスタンスマップ
３０    ネットワーク層処理部
３０Ａ    ネットワーク層マップ
３０Ｂ    ノード設定ファイル
【図１】
2010122724.tif 000003
【図２】
2010122724.tif 000004
【図３】
2010122724.tif 000005
【図４】
2010122724.tif 000006
【図５】
2010122724.tif 000007
【図６】
2010122724.tif 000008
【図７】
2010122724.tif 000009
【図８】
2010122724.tif 000010
【図９】
2010122724.tif 000011
【図１０】
2010122724.tif 000012
【図１１】
2010122724.tif 000013
【図１２】
2010122724.tif 000014
【図１３】
2010122724.tif 000015
【図１４】
2010122724.tif 000016
【図１５】
2010122724.tif 000017
【図１６】
2010122724.tif 000018
【図１７】
2010122724.tif 000019
【図１８】
2010122724.tif 000020
【図１９】
2010122724.tif 000021
【図２０】
2010122724.tif 000022
【図２１】
2010122724.tif 000023
【図２２】
2010122724.tif 000024
【図２３】
2010122724.tif 000025
【図２４】
2010122724.tif 000026
【図２５】
2010122724.tif 000027
【図２６】
2010122724.tif 000028
【図２７】
2010122724.tif 000029
【図２８】
2010122724.tif 000030
【図２９】
2010122724.tif 000031
【図３０】
2010122724.tif 000032
【図３１】
2010122724.tif 000033
【図３２】
2010122724.tif 000034
【図３３】
2010122724.tif 000035
【図３４】
2010122724.tif 000036
【図３５】
2010122724.tif 000037
【図３６】
2010122724.tif 000038
【図３７】
2010122724.tif 000039
【図３８】
2010122724.tif 000040
【図３９】
2010122724.tif 000041