(57)【特許請求の範囲】
【請求項１】
複数のキーの各々に対応するデータ値を管理するノード装置に、
前記複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻における前記データ値又は前記所定のコマンドの情報とを含む履歴要素を第１記憶部に登録する履歴要素登録ステップと、
特定の論理クロック値の示す時刻における前記データ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の前記論理クロック値又は当該参照要求で指定された前記論理クロック値を前記特定の論理クロック値として含み且つ当該参照要求の情報を含む第１マーカを、前記第１記憶部又は当該第１記憶部とは異なる第２記憶部に登録するマーカ登録ステップと、
前記ノード装置が属するシステム全体における確定クロック値が、前記第１記憶部又は前記第２記憶部内の前記第１マーカに含まれる前記特定の論理クロック値以上になった場合には、前記第１記憶部において前記特定の論理クロック値以下である論理クロック値を含む前記履歴要素から、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値を特定するデータ特定ステップと、
を実行させるためのデータ管理プログラム。
【請求項２】
前記所定のコマンドがデータを削除するための削除コマンドであった場合、前記第１マーカが前記第１記憶部又は前記第２記憶部に登録されているか判断し、登録されている場合には、前記データ特定ステップにおいて当該第１マーカに含まれる前記特定の論理クロック値の示す時刻における前記データ値が特定されるまで、前記第１記憶部内の前記履歴要素を保持する
請求項１記載のデータ管理プログラム。
【請求項３】
前記データ特定ステップが、
前記第１マーカが前記第１記憶部に登録されている場合には、当該第１マーカに、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値を設定し、第２マーカとして前記第１記憶部に格納するステップ
を含み、
所定のタイミングまで前記第１記憶部内の前記第２マーカを保持する
請求項１又は２記載のデータ管理プログラム。
【請求項４】
前記データ特定ステップが、
前記第１マーカが前記第２記憶部に登録されている場合には、当該第１マーカに含まれる前記特定の論理クロック値と、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値とを含む第２マーカを前記第１記憶部に登録するステップ
を含み、
所定のタイミングまで前記第１記憶部内の前記第２マーカを保持する
請求項１又は２記載のデータ管理プログラム。
【請求項５】
複数のキーの各々に対応するデータ値を管理するノード装置により実行されるデータ管理方法であって、
前記複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻における前記データ値又は前記所定のコマンドの情報とを含む履歴要素を第１記憶部に登録する履歴要素登録ステップと、
特定の論理クロック値の示す時刻における前記データ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の前記論理クロック値又は当該参照要求で指定された前記論理クロック値を前記特定の論理クロック値として含み且つ当該参照要求の情報を含む第１マーカを、前記第１記憶部又は当該第１記憶部とは異なる第２記憶部に登録するマーカ登録ステップと、
前記ノード装置が属するシステム全体における確定クロック値が、前記第１記憶部又は前記第２記憶部内の前記第１マーカに含まれる前記特定の論理クロック値以上になった場合には、前記第１記憶部において前記特定の論理クロック値以下である論理クロック値を含む前記履歴要素から、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値を特定するデータ特定ステップと、
を含むデータ管理方法。
【請求項６】
複数のキーの各々に対応するデータ値を管理するノード装置であって、
前記複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻における前記データ値又は前記所定のコマンドの情報とを含む履歴要素を第１記憶部に登録する履歴要素登録部と、
特定の論理クロック値の示す時刻における前記データ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の前記論理クロック値又は当該参照要求で指定された前記論理クロック値を前記特定の論理クロック値として含み且つ当該参照要求の情報を含む第１マーカを、前記第１記憶部又は当該第１記憶部とは異なる第２記憶部に登録するマーカ登録部と、
前記ノード装置が属するシステム全体における確定クロック値が、前記第１記憶部又は前記第２記憶部内の前記第１マーカに含まれる前記特定の論理クロック値以上になった場合には、前記第１記憶部において前記特定の論理クロック値以下である論理クロック値を含む前記履歴要素から、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値を特定するデータ特定部と、
を有するノード装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分散処理システムにおけるデータ管理技術に関する。
【背景技術】
【０００２】
例えば、データストアの方式として、ｋｅｙ（キー）とｖａｌｕｅ（値）のペアでデータを管理するｋｅｙ−ｖａｌｕｅストア方式が近年知られている。図１にｋｅｙ−ｖａｌｕｅストア方式の一例を示す。図１の例では、データベースには、キーＡとキーＡの値である「ｈｅｌｌｏ」とを含むレコードと、キーＢとキーＢの値である「ｗｏｒｌｄ」とを含むレコードと、・・・といった複数のレコードが格納されている。例えばデータベースに対してキーＡの問い合わせ（例えばｇｅｔ（ｋｅｙ＝Ａ）コマンド）を送信すると、キーＡの値である「ｈｅｌｌｏ」がデータベースから返ってくる。
【０００３】
さらに、分散型のｋｅｙ−ｖａｌｕｅストア方式も知られている。図２に分散型のｋｅｙ−ｖａｌｕｅストア方式を採用した分散処理システムの一例を示す。図２の例では、分散処理システムは、ノードＡ乃至Ｄを含み、これらのノードは連携して処理を行うようになっている。また、図２の例では、ノードＡが、キーＡのレコードと、・・・とを担当し、ノードＢが、キーＢのレコードと、・・・とを担当するようになっているものとする。例えばキーＡの値を取得する場合には、いずれかのノードに対してキーＡの問い合わせ（ｇｅｔ（ｋｅｙ＝Ａ）コマンド）を送信する。ここでは、キーＡの問い合わせをノードＤに対して送信したものとする。そうすると、キーＡの問い合わせを受信したノードＤは、キーＡの担当ノードを探索し、キーＡの担当ノードであるノードＡにキーＡの問い合わせを転送する。ノードＡは、キーＡの問い合わせを受信すると、自身が管理するデータベースからキーＡの値である「ｈｅｌｌｏ」を読み出し、ノードＤに応答する。そして、ノードＤは、ノードＡからキーＡの値である「ｈｅｌｌｏ」を受信すると、ユーザ端末に送信する。これにより、ユーザは、目的の値（ｖａｌｕｅ）を得ることができる。
【０００４】
一方、分散処理システムにおいて、論理時計（論理クロックとも呼ぶ）によってノード間の処理の順序関係を表す手法（例えば、Ｌａｍｐｏｒｔのアルゴリズム等）が従来から知られている。例えば、図３に示すように、送信側のノードが、送信時点の論理クロック値をタイムスタンプとしてメッセージに設定した上で当該メッセージを送信し、受信側のノードでは、メッセージに設定されたタイムスタンプに所定数（図３では１）を加算した値を新たな論理クロック値として算出する。従って、論理クロックでは、時間が進んでいく一方で、時間が戻されるようなことはない（すなわち、論理クロック値は増えていく一方で、論理クロック値が減らされるようなことはない）。なお、図３において、矢印の始点側の数値は、送信側ノードの論理クロック値を示し、矢印の終点側の数値は、受信側ノードの論理クロック値を示している。また、矢印の上部に付された数値は、送信側ノードによって設定されたタイムスタンプ（すなわち、送信時点の論理クロック値）を示している。
【０００５】
例えば図３では、ノードＡにおいてイベントが発生し、ノードＡの論理クロック値が１の時に、ノードＡからノードＢへメッセージ（タイムスタンプ：１）が送信されている。そして、そのメッセージを受信したノードＢでは、メッセージ受信前の論理クロック値は０であるが、受信メッセージに含まれるタイムスタンプが１であるため、論理クロック値は１まで進んでいると判断し、タイムスタンプに１加算した値（＝２）を新たな論理クロック値としている。その後、さらにノードＡにおいてイベントが発生し、ノードＡの論理クロック値が２の時に、ノードＡからノードＣへメッセージ（タイムスタンプ：２）が送信されている。そして、そのメッセージを受信したノードＣでは、メッセージ受信前の論理クロック値は０であるが、受信メッセージに含まれるタイムスタンプが２であるため、論理クロック値は２まで進んでいると判断し、タイムスタンプに１加算した値（＝３）を新たな論理クロック値としている。その後、ノードＣにおいてイベントが発生し、ノードＣの論理クロック値が４の時に、ノードＣからノードＤへメッセージ（タイムスタンプ：４）が送信されている。そして、そのメッセージを受信したノードＤでは、メッセージ受信前の論理クロック値は０であるが、受信メッセージに含まれるタイムスタンプが４であるため、論理クロック値は４まで進んでいると判断し、タイムスタンプに１加算した値（＝５）を新たな論理クロック値としている。また、ノードＢにおいてイベントが発生し、ノードＢの論理クロック値が３の時に、ノードＢからノードＣへメッセージ（タイムスタンプ：３）が送信されている。そして、そのメッセージを受信したノードＣでは、受信メッセージに含まれるタイムスタンプは３であるが、自身の論理クロック値は４まで進んでいるため、自身の論理クロック値に１加算した値（＝５）を新たな論理クロック値としている。その後、ノードＤにおいてイベントが発生し、ノードＤの論理クロック値が６の時に、ノードＤからノードＡへメッセージ（タイムスタンプ：６）が送信されている。そして、そのメッセージを受信したノードＡでは、メッセージ受信前の論理クロック値は２であるが、受信メッセージに含まれるタイムスタンプが６であるため、論理クロック値は６まで進んでいると判断し、タイムスタンプに１加算した値（＝７）を新たな論理クロック値としている。その後、ノードＡにおいてイベントが発生し、ノードＡの論理クロック値が８の時に、ノードＡからノードＣへメッセージ（タイムスタンプ：８）が送信されている。そして、そのメッセージを受信したノードＣでは、メッセージ受信前の論理クロック値は５であるが、受信メッセージに含まれるタイムスタンプが８であるため、論理クロック値は８まで進んでいると判断し、タイムスタンプに１加算した値（＝９）を新たな論理クロック値としている。また、ノードＤにおいてイベントが発生し、ノードＤの論理クロック値が７の時に、ノードＤからノードＣへメッセージ（タイムスタンプ：７）が送信されている。そして、そのメッセージを受信したノードＣでは、受信メッセージに含まれるタイムスタンプは７であるが、自身の論理クロック値は９まで進んでいるため、自身の論理クロック値に１加算した値（＝１０）を新たな論理クロック値としている。このように、各ノードが論理クロック値を交換しながら処理を進めていく。
【０００６】
さらに、分散処理システムとして、例えば結果整合性（Eventual Consistency）を実装したシステムが知られている。この結果整合性とは、ある時点ではデータの整合が取れていないかもしれないが、最終的に整合が取れていれば良いという考え方である。
【０００７】
例えば図４に結果整合性を実装した分散処理システムの一例を示す。図４の例では、分散処理システムは、ノードＡ乃至Ｇを含み、ノードＡが、キーＡのレコードを担当するようになっているものとする。例えばユーザＢは、キーＡの値を設定するため、ユーザ端末を操作してｓｅｔ（ｋｅｙ＝Ａ，ｖａｌｕｅ＝Ｙ）コマンドを入力し、ユーザ端末は、ユーザＢからの入力を受け付け、ノードＦに対してｓｅｔコマンドを送信する。また、例えばユーザＡが、キーＡの値を取得するため、ユーザ端末を操作してｇｅｔ（ｋｅｙ＝Ａ）コマンドを入力し、ユーザ端末は、ユーザＡからの入力を受け付け、ノードＣに対してｇｅｔコマンドを送信する。なお、コマンド毎に、そのコマンドがノードに届いた時点で、ノードによってタイムスタンプが振られるようになっている。図４の例では、ｇｅｔコマンドにはｔ＝９が振られ、ｓｅｔコマンドにはｔ＝７が振られたものとする。すなわち、タイムスタンプからすると、ｇｅｔコマンドよりｓｅｔコマンドの方が古いものとなる。
【０００８】
その後、図５に示すように、ノードＣは、キーＡの担当ノードを探索し、キーＡの担当ノードであるノードＡにｇｅｔコマンドを転送する。同様に、ノードＦは、キーＡの担当ノードを探索し、キーＡの担当ノードであるノードＡにｓｅｔコマンドを転送する。なお、ここでは、図５に示すように、ｓｅｔコマンドについて何らかの理由で遅延が発生し、ｓｅｔコマンドより先にｇｅｔコマンドがノードＡに届いたものとする。この場合、図６に示すように、元々設定されていた「Ｘ」がキーＡの値として取得される。その後、ｓｅｔコマンドがノードＡに届くと、キーＡの値が「Ｘ」から「Ｙ」に更新される。なお、一定期間経過後、ユーザＡがキーＡの値を再取得すれば、更新後の値「Ｙ」を取得することができる。このように、結果整合性を実装した分散処理システムでは、最終的に更新後の値が取れれば良く、ある時点では更新後の値が取れなくても許容される。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】ＷＯ２００７／０３２０４６公報
【特許文献２】特開２０００−２５９４７３号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかし、上でも述べたように、結果整合性の考え方は、最終的にデータの整合が取れていれば良いというものであるため、いずれの時点でデータの整合が取れたか（すなわち、いつ「確定」したか）という観点は存在しなかった。そのため、結果整合性及び分散型のｋｅｙ−ｖａｌｕｅストア方式を採用した分散処理システムでは、論理クロックが進行していく中で、システム全体として現在どこまでデータが確定しているのかを把握することができず、ある時点における複数のデータ値を把握することはできなかった。
【００１１】
従って、本発明の目的は、複数のキーの各々に対応するデータ値を分散管理する分散処理システムにおいて、ある時点における複数のデータ値を把握できるようにするための技術を提供することである。
【課題を解決するための手段】
【００１２】
本データ管理方法は、複数のキーの各々に対応するデータ値を管理するノード装置により実行されるデータ管理方法である。そして、本方法は、複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻におけるデータ値又は所定のコマンドの情報とを含む履歴要素を第１記憶部に登録する履歴要素登録ステップと、特定の論理クロック値の示す時刻におけるデータ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の論理クロック値又は当該参照要求で指定された論理クロック値を特定の論理クロック値として含み且つ当該参照要求の情報を含む第１マーカを、第１記憶部又は当該第１記憶部とは異なる第２記憶部に登録するマーカ登録ステップと、ノード装置が属するシステム全体における確定クロック値が、第１記憶部又は第２記憶部内の第１マーカに含まれる特定の論理クロック値以上になった場合には、第１記憶部において特定の論理クロック値以下である論理クロック値を含む履歴要素から、特定の論理クロック値の示す時刻における、担当キーに対応するデータ値を特定するデータ特定ステップとを含む。
【発明の効果】
【００１３】
複数のキーの各々に対応するデータ値を分散管理する分散処理システムにおいて、ある時点における複数のデータ値を把握できる。
【図面の簡単な説明】
【００１４】
【図１】図１は、ｋｅｙ−ｖａｌｕｅストア方式を説明するための図である。
【図２】図２は、分散型のｋｅｙ−ｖａｌｕｅストア方式を採用した分散処理システムの一例を示す図である。
【図３】図３は、従来の論理クロックを説明するための図である。
【図４】図４は、結果整合性を実装した従来の分散処理システムの動作例を説明するための図である。
【図５】図５は、結果整合性を実装した従来の分散処理システムの動作例を説明するための図である。
【図６】図６は、結果整合性を実装した従来の分散処理システムの動作例を説明するための図である。
【図７】図７は、第１の実施の形態に係る分散処理システムの構成図である。
【図８】図８は、第１の実施の形態におけるノード装置の機能ブロック図である。
【図９】図９（ａ）乃至（ｃ）は、第１の実施の形態に係る分散処理システム全体の処理を説明するための図である。
【図１０】図１０（ａ）及び（ｂ）は、第１の実施の形態に係る分散処理システム全体の処理を説明するための図である。
【図１１】図１１は、ノード装置Ａ及びＢの動作を示すシーケンス図である。
【図１２】図１２は、コマンド受信時のノード装置の処理フローを示す図である。
【図１３】図１３は、コマンド処理完了時のノード装置の処理フローを示す図である。
【図１４】図１４は、クロックリスト受信時のノード装置の処理フローを示す図である。
【図１５】図１５は、確定クロック値特定処理の処理フローを示す図である。
【図１６】図１６は、第２の実施の形態におけるノード装置の機能ブロック図である。
【図１７】図１７は、第２の実施の形態の処理フローを示す図である。
【図１８】図１８（ａ）及び（ｂ）は、第３の実施の形態に係る分散処理システムの全体構成を説明するための図である。
【図１９】図１９は、マーカを登録した場合の一例を示す図である。
【図２０】図２０は、確定部分の履歴要素からデータ値を特定又は計算する処理を説明するための図である。
【図２１】図２１は、第３の実施の形態におけるノード装置の機能ブロック図である。
【図２２】図２２（ａ）乃至（ｄ）は、第３の実施の形態に係る分散処理システム全体の処理を説明するための図である。
【図２３】図２３（ａ）乃至（ｄ）は、第３の実施の形態に係る分散処理システム全体の処理を説明するための図である。
【図２４】図２４は、ある時点における複数のデータ値を参照するための他の手法の一例を示す図である。
【図２５】図２５（ａ）乃至（ｄ）は、削除コマンド受信時の処理を説明するための図である。
【図２６】図２６（ａ）乃至（ｄ）は、削除コマンド受信時の処理を説明するための図である。
【図２７】図２７（ａ）乃至（ｄ）は、レコードＡが削除された後に参照要求を受信した場合の処理を説明するための図である。
【図２８】図２８（ａ）及び（ｂ）は、レコードＡが削除された後に参照要求を受信した場合の処理を説明するための図である。
【図２９】図２９は、ユーザ端末からコマンド又は参照要求を受信した際のノード装置の処理フローを示す図である。
【図３０】図３０は、コマンド受信処理の処理フローを示す図である。
【図３１】図３１は、クロックリスト受信時のノード装置の処理フローである。
【図３２】図３２は、第４の実施の形態におけるノード装置の機能ブロック図である。
【図３３】図３３（ａ）乃至（ｄ）は、第４の実施の形態に係る分散処理システム全体の処理を説明するための図である。
【図３４】図３４（ａ）乃至（ｄ）は、第４の実施の形態に係る分散処理システム全体の処理を説明するための図である。
【図３５】図３５は、コマンド受信処理２の処理フローを示す図である。
【図３６】図３６は、クロックリスト受信時のノード装置の処理フローである。
【図３７】図３７は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１５】
［実施の形態１］
図７乃至図１５を用いて、第１の実施の形態について説明する。図７に第１の実施の形態に係るシステムの構成図を示す。例えばインターネットであるネットワーク１には、複数のノード装置（図７では、ノード装置Ａ乃至Ｃ）を含む分散処理システム１００と、複数のユーザ端末（図７では、ユーザ端末Ａ及びＢ）とが接続されている。なお、分散処理システム１００は、結果整合性及び分散型のｋｅｙ−ｖａｌｕｅストア方式を採用したシステムであり、分散処理システム１００に含まれる各ノード装置には、結果整合性及び分散型のｋｅｙ−ｖａｌｕｅストア方式を実現するための分散フレームワーク（図示せず）が実装されているものとする。図７では、ノード装置が３台、ユーザ端末が２台の例を示しているが、ノード装置及びユーザ端末の台数は、これに限定されない。
【００１６】
図８に、第１の実施の形態に係るノード装置の機能ブロック図を示す。第１の実施の形態に係るノード装置は、メッセージ受信部１１と、メッセージ処理部１２と、メッセージ送信部１３と、コマンドリスト管理部１４と、確定クロック処理部１５と、データベース１６とを有する。なお、コマンドリスト管理部１４は、自ノード装置が受け付けたコマンド（例えばｇｅｔコマンド、ｓｅｔコマンドなど）の識別子と、当該コマンドを受け付けた時点の論理クロック値との対を含むコマンドリストを格納するコマンドリスト格納部１４１を管理する。また、確定クロック処理部１５は、クロックリスト受信部１５１と、確定クロック管理部１５３と、クロックリスト送信部１５５と、確定クロック値格納部１５７とを有する。データベース１６には、自ノード装置が担当するキー（以下、担当キーと呼ぶ）及び当該担当キーに対応するデータ値が格納される。
【００１７】
メッセージ受信部１１は、ユーザ端末からのコマンドや、分散処理システム１００内の他のノード装置からのメッセージを受信する。なお、メッセージ受信部１１は、ユーザ端末から新たなコマンドを受け付けた場合には、コマンドの情報を、メッセージ処理部１２又はコマンドリスト管理部１４に出力する。メッセージ処理部１２は、データベース１６に格納されているデータを用いて、メッセージ受信部１１が受信したコマンドやメッセージに応じた処理を実施し、必要に応じて処理結果をデータベース１６に格納する。また、メッセージ処理部１２は、処理完了時には、処理完了通知をコマンドリスト管理部１４に出力する。メッセージ送信部１３は、メッセージ処理部１２の処理結果をコマンド要求元のユーザ端末に送信したり、分散処理システム１００内の他のノード装置にメッセージを送信したりする。
【００１８】
コマンドリスト管理部１４は、メッセージ受信部１１及びメッセージ処理部１２からの通知に応じて、コマンドリスト格納部１４１内のコマンドリストを更新したり、コマンドリストから自ノード装置における確定クロック値（以下、第１の確定クロック値と呼ぶ場合もある）を計算したりする。例えば、論理クロック値が１０の時にｇｅｔコマンドを受け付け、論理クロック値が１４の時にｓｅｔコマンドを受け付け、論理クロック値が１６の時にｇｅｔコマンドを受け付けており、これらのコマンドの処理が未だ完了していない場合には、コマンドリスト＝｛１０：ｇｅｔ，１４：ｓｅｔ，１６：ｇｅｔ｝といったようなデータがコマンドリスト格納部１４１に格納される。なお、コマンドリストに含まれる最小の論理クロック値から１減じた値が第１の確定クロック値となる。例えば上記のようなコマンドリストであれば、コマンドリストに含まれる最小の論理クロック値は１０であり、第１の確定クロック値は９（＝１０−１）となる。なお、コマンドリストが空の場合には、現時点における自ノード装置の論理クロック値が第１の確定クロック値となる。
【００１９】
また、確定クロック処理部１５のクロックリスト受信部１５１は、分散処理システム１００内の他のノード装置からクロックリストを受信する。クロックリストは、分散処理システム１００内のノード装置の間で回覧されるデータである。なお、クロックリストには、ノード装置の識別情報と、当該ノード装置の第１の確定クロック値との対が含まれる。例えば、ノード装置Ａの第１の確定クロック値が１０であり、ノード装置Ｂの第１の確定クロック値が５であり、ノード装置Ｃの第１の確定クロック値が７であった場合、クロックリスト＝｛ノードＡ：１０，ノードＢ：５，ノードＣ：７｝となる。
【００２０】
確定クロック処理部１５の確定クロック管理部１５３は、コマンドリスト管理部１４によって計算された第１の確定クロック値を用いて、クロックリスト受信部１５１が受信したクロックリストを更新し、更新後のクロックリストから分散処理システム１００全体における確定クロック値（以下、系全体の確定クロック値又は第２の確定クロック値と呼ぶ場合もある）を特定し、確定クロック値格納部１５７に格納する。クロックリスト送信部１５５は、確定クロック管理部１５３によって更新されたクロックリストを、分散処理システム１００内の他のノード装置に送信する。
【００２１】
次に、図９及び図１０を用いて、分散処理システム１００全体の処理について説明する。例えば、分散処理システム１００の起動時にクロックリストを生成するノード装置が予め決められており、システムが正常に起動した後、そのノード装置が、分散処理システム１００内のノード装置の情報（例えば、ノード装置の総数やノード装置の識別情報など）を取得する。そして、取得した情報を用いてクロックリストを生成し、クロックリストの回覧を開始する。なお、ここでは、「ノード装置Ａ−＞ノード装置Ｂ−＞ノード装置Ｃ」の順でクロックリストが回覧されるものとし、ノード装置Ｃの後、再びノード装置Ａに戻るものとする。なお、図９（ａ）に示すように、分散処理システム１００において、ノード装置Ａの第１の確定クロック値が１０であり、ノード装置Ｂの第１の確定クロック値が８であり、ノード装置Ｃの第１の確定クロック値が１２であるものとする。ここで、例えば、クロックリスト＝｛ノードＡ：５，ノードＢ：４，ノードＣ：７｝がノード装置Ａに回ってきたとすると、ノード装置Ａは、自ノード装置の第１の確定クロック値（＝１０）に従って、クロックリストを更新する。なお、図９（ａ）における太枠の丸印は、クロックリストを所持しているノード装置を示している（以下、同じ）。そうすると、図９（ｂ）に示すように、クロックリストは、｛ノードＡ：１０，ノードＢ：４，ノードＣ：７｝といった内容に更新される。そして、更新後のクロックリストに含まれる最小の第１の確定クロック値（＝４）を、系全体の確定クロック値として特定する。なお、特定された系全体の確定クロック値（＝４）は、ノード装置Ａの確定クロック値格納部１５７に格納される。その後、クロックリストは、ノード装置Ｂへ送信される。
【００２２】
そして、ノード装置Ｂは、クロックリスト＝｛ノードＡ：１０，ノードＢ：４，ノードＣ：７｝を受信すると、自ノード装置の第１の確定クロック値（＝８）に従って、クロックリストを更新する。そうすると、図９（ｃ）に示すように、クロックリストは、｛ノードＡ：１０，ノードＢ：８，ノードＣ：７｝といった内容に更新される。そして、更新後のクロックリストに含まれる最小の第１の確定クロック値（＝７）を、系全体の確定クロック値として特定する。なお、特定された系全体の確定クロック値（＝７）は、ノード装置Ｂの確定クロック値格納部１５７に格納される。その後、クロックリストは、ノード装置Ｃへ送信される。
【００２３】
そして、ノード装置Ｃは、クロックリスト＝｛ノードＡ：１０，ノードＢ：８，ノードＣ：７｝を受信すると、自ノード装置の第１の確定クロック値（＝１２）に従って、クロックリストを更新する。そうすると、図１０（ａ）に示すように、クロックリストは、｛ノードＡ：１０，ノードＢ：８，ノードＣ：１２｝といった内容に更新される。そして、更新後のクロックリストに含まれる最小の第１の確定クロック値（＝８）を、系全体の確定クロックとして特定する。なお、特定された系全体の確定クロック値（＝８）は、ノード装置Ｃの確定クロック値格納部１５７に格納される。その後、クロックリストは、ノード装置Ａへ送信される。
【００２４】
そして、図１０（ｂ）に示すように、ノード装置Ａは、クロックリスト＝｛ノードＡ：１０，ノードＢ：８，ノードＣ：１２｝を受信すると、自ノード装置の第１の確定クロック値に従って、クロックリストを更新する。ここでは、ノード装置Ａの第１の確定クロック値は１０のままであったものとする。従って、クロックリストの内容は、更新前と変わらない。なお、このような場合には、クロックリストの更新処理を省略してもよい。その後、クロックリストに含まれる最小の第１の確定クロック値（＝８）を、系全体の確定クロック値として特定する。なお、特定された系全体の確定クロック値（＝８）は、ノード装置Ａの確定クロック値格納部１５７に格納される。
【００２５】
このように、分散処理システム１００内の各ノード装置は、クロックリストが自ノード装置に回ってきた時に、クロックリストを最新の状態に更新し、分散処理システム１００における系全体の確定クロック値を特定する。そして、クロックリストを次のノード装置に渡す。
【００２６】
なお、図９及び図１０では、ノード装置Ａ乃至Ｃにおいて、第１の確定クロック値が変化しない例を示したが、分散処理システム１００では、並行してコマンドの処理も行われているので、コマンドリストが順次更新され、第１の確定クロック値も徐々に変化することになる。例えば図１１を用いて、第１の確定クロック値が変化する場合について説明する。なお、図１１の例では説明を簡単にするために、ノード装置Ａ及びＢのみが存在するものとする。
【００２７】
まず、ノード装置Ａが、ノード装置Ｂからクロックリスト＝｛ノードＡ：１，ノードＢ：１｝を受信する（図１１のＴ１）。このとき、ノード装置Ａの第１の確定クロック値は３であり、ノード装置Ａがクロックリストを更新すると、クロックリスト＝｛ノードＡ：３，ノードＢ：１｝となる。そうすると、ノード装置Ｂの第１の確定クロック値（＝１）が、クロックリスト内の第１の確定クロック値の中で最小のものとなる。よって、Ｔ１の段階では「１」が系全体の確定クロック値として特定される。その後、クロックリストは、ノード装置Ａからノード装置Ｂへ送信される。
【００２８】
そして、ノード装置Ｂが、ノード装置Ａからクロックリスト＝｛ノードＡ：３，ノードＢ：１｝を受信する（図１１のＴ２）。このとき、ノード装置Ｂの第１の確定クロック値は４であり、ノード装置Ｂがクロックリストを更新すると、クロックリスト＝｛ノードＡ：３，ノードＢ：４｝となる。そうすると、ノード装置Ａの第１の確定クロック値（＝３）が、クロックリスト内の第１の確定クロック値の中で最小のものとなる。よって、Ｔ２の段階では「３」が系全体の確定クロック値として特定される。その後、クロックリストは、ノード装置Ｂからノード装置Ａへ送信される。
【００２９】
そして、ノード装置Ａが、ノード装置Ｂからクロックリスト＝｛ノードＡ：３，ノードＢ：４｝を受信する（図１１のＴ３）。このとき、ノード装置Ａの第１の確定クロック値は６になっているので、ノード装置Ａがクロックリストを更新すると、クロックリスト＝｛ノードＡ：６，ノードＢ：４｝となる。そうすると、ノード装置Ｂの第１の確定クロック値（＝４）が、クロックリスト内の第１の確定クロック値の中で最小のものとなる。よって、Ｔ３の段階では「４」が系全体の確定クロック値として特定される。その後、クロックリストは、ノード装置Ａからノード装置Ｂへ送信される。
【００３０】
そして、ノード装置Ｂが、ノード装置Ａからクロックリスト＝｛ノードＡ：６，ノードＢ：４｝を受信する（図１１のＴ４）。このとき、ノード装置Ｂの第１の確定クロック値は８になっているので、ノード装置Ｂがクロックリストを更新すると、クロックリスト＝｛ノードＡ：６，ノードＢ：８｝となる。そうすると、ノード装置Ａの第１の確定クロック値（＝６）が、クロックリスト内の第１の確定クロック値の中で最小のものとなる。よって、Ｔ４の段階では「６」が系全体の確定クロック値として特定される。その後、クロックリストは、ノード装置Ｂからノード装置Ａへ送信される。
【００３１】
そして、ノード装置Ａが、ノード装置Ｂからクロックリスト＝｛ノードＡ：６，ノードＢ：８｝を受信する（図１１のＴ５）。このとき、ノード装置Ａの第１の確定クロック値は６のままであるので、クロックリストの内容は変わらない。但し、Ｔ３の段階では最小の第１の確定クロック値は４であったが、Ｔ４の段階でノード装置Ｂによってクロックリストが更新されたことにより、Ｔ５の段階では最小の第１の確定クロック値が６に変わっている。よって、Ｔ５の段階では「６」が系全体の確定クロック値として特定される。その後、クロックリストは、ノード装置Ａからノード装置Ｂへ送信される。
【００３２】
そして、ノード装置Ｂは、ノード装置Ａからクロックリスト＝｛ノードＡ：６，ノードＢ：８｝を受信する（図１１のＴ６）。このとき、ノード装置Ｂの第１の確定クロック値は１２になっているので、ノード装置Ｂがクロックリストを更新すると、クロックリスト＝｛ノードＡ：６，ノードＢ：１２｝となる。なお、Ｔ６の段階では、最小の第１の確定クロック値（＝６）がＴ４の時と変わっていないため、系全体の確定クロック値は「６」のままである。その後、クロックリストは、ノード装置Ｂからノード装置Ａへ送信される。
【００３３】
そして、ノード装置Ａは、ノード装置Ｂからクロックリスト＝｛ノードＡ：６，ノードＢ：１２｝を受信する（図１１のＴ７）。このとき、ノード装置Ａの第１の確定クロック値は１３になっているので、ノード装置Ａがクロックリストを更新すると、クロックリスト＝｛ノードＡ：１３，ノードＢ：１２｝となる。そうすると、ノード装置Ｂの第１の確定クロック値（＝１２）が、クロックリスト内の第１の確定クロック値の中で最小のものとなる。よって、Ｔ７の段階では「１２」が系全体の確定クロック値として特定される。
【００３４】
このように第１の確定クロック値の変化に応じて、系全体の確定クロック値も変化していく。なお、図１１では、ノード装置Ａ及びＢの２台のみが存在する例を示したが、ノード装置が３台以上存在する場合も、各ノード装置の処理は同じである。
【００３５】
以上のような処理を実施することにより、分散処理システム１００における系全体の確定クロック値を特定することができ、分散処理システム１００全体として、どこまでデータが確定しているのかを把握できるようになる。
【００３６】
次に、第１の実施の形態に係るノード装置の処理フローについて説明する。最初に、図１２を用いて、コマンド受信時の処理フローを説明する。まず、メッセージ受信部１１が、ユーザ端末から新たなコマンドを受信し（図１２：ステップＳ１）、コマンド受信時の論理クロック値を特定する。そして、メッセージ受信部１１は、コマンドの識別子やコマンド受信時の論理クロック値などを含むコマンド情報を、メッセージ処理部１２及びコマンドリスト管理部１４に通知する。
【００３７】
そして、コマンドリスト管理部１４は、メッセージ受信部１１からコマンド情報を受信すると、コマンドの識別子とコマンド受信時の論理クロック値との対をコマンドリストに登録する（ステップＳ３）。すなわち、コマンドを受信する毎に、コマンドの識別子とコマンド受信時の論理クロック値との対がコマンドリストに登録されていく。
【００３８】
また、メッセージ処理部１２は、メッセージ受信部１１からコマンド情報を受信すると、受信コマンドに応じた処理を実施する。メッセージ処理部１２については、従来と変わらないため、これ以上説明しない。そして、処理を終了する。
【００３９】
次に、図１３を用いて、コマンドの処理完了時の処理フローを説明する。例えば、コマンドリスト管理部１４は、コマンドリスト格納部１４１に格納されているコマンドリストを検索し、処理中のコマンドがあるか判断する（図１３：ステップＳ１１）。例えば、コマンドリストが空の場合には処理中のコマンドはないと判断し、コマンドリストに、コマンドの識別子とコマンド受信時の論理クロック値との対が１つでも登録されている場合には処理中のコマンドがあると判断する。なお、コマンドリストが空の場合、すなわち処理中のコマンドがないと判断された場合には（ステップＳ１１：Ｎｏルート）、処理を終了する。
【００４０】
一方、処理中のコマンドがあると判断された場合（ステップＳ１１：Ｙｅｓルート）、コマンドリスト管理部１４は、いずれかのコマンドの処理が完了したか判断する（ステップＳ１３）。例えば、図１３の処理フローと並行して、メッセージ処理部１２がコマンドに応じた処理を実施しており、処理が完了した場合には、処理が完了したコマンドの識別子などの情報を含む処理完了通知がコマンドリスト管理部１４に対して送信される。従って、コマンドリスト管理部１４は、処理完了通知を受信した場合、処理が完了したと判断する。なお、処理完了通知を受信していなければ（ステップＳ１３：Ｎｏルート）、処理完了通知を受信するまで待つ。
【００４１】
そして、いずれかのコマンドの処理が完了したと判断された場合（ステップＳ１３：Ｙｅｓルート）、コマンドリスト管理部１４は、処理が完了したコマンドの識別子と当該コマンド受信時の論理クロック値との対のデータをコマンドリスト格納部１４１内のコマンドリストから削除する（ステップＳ１５）。
【００４２】
また、メッセージ処理部１２による処理が完了した場合には、メッセージ送信部１３が、処理結果をコマンド要求元へ送信する（ステップＳ１７）。その後、ステップＳ１１の処理に戻り、コマンドリストが空になるまで処理を繰り返す。なお、図１３の処理フローにおいて、ステップＳ１５及びＳ１７については順番の入れ替えが可能であり、また並列に実施するようにしてもよい。
【００４３】
以上、図１２及び図１３に示したような処理を実施することにより、処理中のコマンドの情報を適切に管理することができる。
【００４４】
次に、図１４及び図１５を用いて、クロックリスト受信時の処理フローを説明する。まず、クロックリスト受信部１５１が、分散処理システム１００内の他のノード装置からクロックリストを受信し（図１４：ステップＳ２１）、受信したクロックリストを、確定クロック管理部１５３に出力する。
【００４５】
そして、確定クロック管理部１５３は、クロックリスト受信部１５１からクロックリストを受信すると、確定クロック値特定処理を実施する（ステップＳ２３）。この確定クロック値特定処理については図１５を用いて説明する。
【００４６】
まず、確定クロック管理部１５３は、コマンドリスト管理部１４に、現時点における自ノード装置の第１の確定クロック値を算出するよう指示する。コマンドリスト管理部１４は、確定クロック管理部１５３からの指示に応じて、コマンドリスト格納部１４１に格納されているコマンドリストから、現時点における第１の確定クロック値を算出する（図１５：ステップＳ３１）。具体的には、コマンドリストに含まれる最小の論理クロック値から１減じた値を、現時点における第１の確定クロック値として算出する。論理クロック値は、増えていく一方であるという性質があるため、コマンドリストに含まれる最小の論理クロック値の１つ前のところまでは、確定しているものとみなすことができる。例えば、コマンドリストに含まれる最小の論理クロック値が１０であった場合には、第１の確定クロック値として９（＝１０−１）が算出される。なお、全ての処理が完了し、コマンドリストが空の場合もある。コマンドリストが空の場合には、現時点における論理クロック値を第１の確定クロック値として算出する。例えば背景技術の欄で述べたように、各ノード装置は論理クロック値を交換しながら処理を行う。すなわち、コマンドリストが空の状態でも、他のノード装置からメッセージを受信することで、論理クロック値は進んでいくことになる。そのため、コマンドリストが空の場合には、現時点における論理クロック値を第１の確定クロック値とする。その後、コマンドリスト管理部１４は、算出した第１の確定クロック値を確定クロック管理部１５３に出力する。
【００４７】
そして、確定クロック管理部１５３は、コマンドリスト管理部１４から第１の確定クロック値を受信すると、その第１の確定クロック値を用いてクロックリストを更新する（ステップＳ３３）。すなわち、ステップＳ３１において算出された第１の確定クロック値で、クロックリストに含まれる自ノード装置の第１の確定クロック値を書き換える。
【００４８】
その後、確定クロック管理部１５３は、更新後のクロックリストから系全体の確定クロック値を特定し、確定クロック値格納部１５７に格納する（ステップＳ３５）。具体的には、更新後のクロックリストに含まれる第１の確定クロック値のうち、最小のものを系全体の確定クロック値として特定する。
【００４９】
そして、確定クロック管理部１５３は、更新後のクロックリストを送信するようクロックリスト送信部１５５に指示する。クロックリスト送信部１５５は、確定クロック管理部１５３からの指示に応じて、更新後のクロックリストを、分散処理システム１００内の次のノード装置へ送信する（ステップＳ３７）。そして、処理を終了する。なお、クロックリストの回し方としては、例えば、予め回す順番が決定されているような場合（例えばノード識別番号の昇順又は降順など）もあれば、ランダムに回すような場合もある。また、例えば、分散処理システム１００内の他のノード装置のうち、第１の確定クロック値が最も小さいノード装置をクロックリストから特定し、特定したノード装置へ送信するような場合もある。系全体の確定クロック値は、クロックリストに含まれる最小の第１の確定クロック値であるから、第１の確定クロック値が最小であるノード装置へ優先的に回すようにすれば、当該ノード装置の第１の確定クロック値が更新された場合には直ぐに系全体の確定クロック値に反映されるようになる。
【００５０】
また、クロックリストの数は、１個である必要はなく、複数のクロックリストを回覧するようにしてもよい。例えばクロックリストの数を増やせば、クロックリストの受信間隔が短くなるので、図１４及び図１５に示した処理の実行間隔も短くなる。従って、系全体の確定クロック値をより細かく把握できるようになる。さらに、複数のクロックリストを回覧する際には、クロックリストの回し方は自由である。
【００５１】
以上のような処理を実施することにより、分散処理システム１００における系全体の確定クロック値を特定することができる。そして、系全体の確定クロック値が分かることによって、システム全体としてどこまでデータが確定しているのか把握できるようになる。
【００５２】
［実施の形態２］
次に、第２の実施の形態について説明する。まず、第２の実施の形態に係るノード装置の機能ブロック図を図１６に示す。なお、本実施の形態に係るノード装置は、複数のキーの各々に対応するデータ値を複数のノード装置に分散して管理する分散処理システム（例えば分散型のｋｅｙ−ｖａｌｕｅストア方式を実装した分散処理システム）に含まれるノード装置である。そして、本実施の形態に係るノード装置は、履歴要素登録部１５０１と、マーカ登録部１５０３と、第１記憶部１５０５と、第２記憶部１５０７と、データ特定部１５０９とを有する。履歴要素登録部１５０１は、担当キーに係る所定のコマンドを受け付けた場合に、そのコマンドに係る履歴要素を第１記憶部１５０５に登録する。マーカ登録部１５０３は、複数レコードの参照要求を受け付けた場合、参照要求の情報などを含むマーカを第１記憶部１５０５又は第２記憶部１５０７に登録する。データ特定部１５０９は、第１記憶部１５０５及び第２記憶部１５０７に格納されているデータを用いて処理を行う。
【００５３】
次に、図１６に示したノード装置の処理内容を図１７を用いて説明する。まず、担当キーに係るコマンドを受け付けた場合、履歴要素登録部１５０１が、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻におけるデータ値又は所定のコマンドの情報（例えばコマンドで指定された演算内容の情報など）とを含む履歴要素を第１記憶部１５０５に登録する（図１７：ステップＳ１００１）。また、特定の論理クロック値の示す時刻における複数のデータ値を参照するための参照要求を受け付けた場合、マーカ登録部１５０３が、当該参照要求を受け付けた時点の論理クロック値又は当該参照要求で指定された論理クロック値を特定の論理クロック値として含み且つ当該参照要求の情報を含む第１マーカを第１記憶部１５０５又は第２記憶部１５０７に登録する（ステップＳ１００３）。このように第１マーカを登録しておくことで、分散処理システム全体における確定クロック値が徐々に変化していく中で、どのタイミングでデータ値を求めれば良いかが分かる。なお、分散処理システム全体における確定クロック値は、第１の実施の形態で説明したような処理を実施することによって特定される。
【００５４】
そして、分散処理システム全体における確定クロック値が、第１記憶部１５０５又は第２記憶部１５０７内の第１マーカに含まれる特定の論理クロック値以上になった場合に、データ特定部１５０９が、特定の論理クロック値以下である論理クロック値を含む履歴要素から、特定の論理クロック値の示す時刻における、担当キーに対応するデータ値を特定する（ステップＳ１００５）。分散処理システム全体における確定クロック値が特定の論理クロック値以上であるということは、特定の論理クロック値の示す時刻におけるデータ値が確定していると判断できる。そして、適切な履歴要素から、特定の論理クロック値の示す時刻におけるデータ値が特定されるので、特定の論理クロック値の示す時刻におけるデータ値を把握できるようになる。
【００５５】
［実施の形態３］
次に、第３の実施の形態について説明する。まず、本実施の形態における分散処理システムの全体構成について簡単に説明する。本実施の形態では、例えば図１８に示すように、受け付けたコマンド毎に履歴要素を格納するものとする。図１８では、分散処理システムは、処理を受け持つノード装置Ａ乃至Ｃを含み、各ノード装置には、分散フレームワークが実装されている。なお、図１８では、ノード装置Ｂが、キーＡのレコード（以下、レコードＡと呼ぶ）の担当となっている。例えば図１８（ａ）に示すようにノード装置Ａがｓｅｔ（ｋｅｙ＝Ａ，２）コマンドを受け付けたとすると、分散フレームワークにより、ｓｅｔコマンドに対してタイムスタンプが振られる。ここでは、ｔ＝３が振られたものとする。その後、キーＡの担当ノードを探索し、分散フレームワークの連携によって、キーＡの担当ノードであるノード装置Ｂにｓｅｔコマンドが転送される。そうすると、ｓｅｔコマンドの履歴要素｛２，ｔ＝３｝がノード装置Ｂのデータベースに登録される。ここで、履歴要素｛２，ｔ＝３｝は、ｔ＝３の時点で、キーＡのデータ値として２が設定されたことを示している。なお、コマンドを受け付けたノード装置のことを、レセプタと呼び、あるレコードを担当するノード装置のことを、コンテナと呼ぶ場合もある。図１８（ａ）の例では、ノード装置Ａは、ｓｅｔコマンドのレセプタであり、ノード装置Ｃは、ｇｅｔコマンドのレセプタである。また、ノード装置Ｂは、レコードＡのコンテナである。
【００５６】
その後、例えばノード装置Ｃがｇｅｔ（ｋｅｙ＝Ａ）コマンドを受け付けたとすると、分散フレームワークが連携して、キーＡの担当であるノード装置ＢのデータベースからキーＡのデータ値を取得し、ｇｅｔコマンドの要求元に出力する。ここで、ノード装置Ｂのデータベースには、履歴要素｛２，ｔ＝３｝が登録されているので、キーＡのデータ値として２が取得される。なお、ｇｅｔコマンドについても、ｇｅｔコマンドを受け付けた時点で、分散フレームワークによりタイムスタンプが振られる。
【００５７】
その後、例えば図１８（ｂ）に示すようにノード装置Ａがｉｎｃ（ｋｅｙ＝Ａ）コマンドを受け付けたとすると、同様に、分散フレームワークにより、ｉｎｃコマンドに対してタイムスタンプが振られる。ここでは、ｔ＝５が振られたものとする。なお、ｉｎｃコマンドは、キーＡのデータ値を１インクリメントさせるためのコマンドであるものとする。その後、キーＡの担当ノード装置を探索し、分散フレームワークの連携によって、キーＡの担当ノードであるノード装置Ｂにｉｎｃコマンドが転送される。そうすると、ｉｎｃコマンドの履歴要素｛ｉｎｃ，ｔ＝５｝がノード装置Ｂのデータベースに登録される。ここで、履歴要素｛ｉｎｃ，ｔ＝５｝は、ｔ＝５の時点で、ｉｎｃコマンドを受け付けたことを示している。
【００５８】
その後、例えばノード装置Ｃが再びｇｅｔ（ｋｅｙ＝Ａ）コマンドを受け付けたとすると、分散フレームワークが連携して、キーＡの担当であるノード装置ＢのデータベースからキーＡのデータ値を取得し、ｇｅｔコマンドの要求元に出力する。ここで、ノード装置Ｂのデータベースには、履歴要素として｛２，ｔ＝３｝と｛ｉｎｃ，ｔ＝５｝が登録されているので、ｔ＝３の時点のデータ値（＝２）を１インクリメントした値（＝３）がキーＡのデータ値として取得される。なお、上では、ｉｎｃコマンドを例にして説明したが、他の演算についても同様に、コマンドで指定された演算内容の情報とタイムスタンプとを含む履歴要素を登録しておく。このように、レコード単位で、コマンドの履歴要素をタイムスタンプの順に蓄積しておき、例えばｇｅｔコマンドを受けた場合には、履歴要素を用いて、現時点におけるデータ値を計算し、計算結果を返すようになっている。
【００５９】
また、本実施の形態では、ある時点における複数のデータ値を参照するための参照要求をユーザ端末から受信した場合には、参照要求の情報（以下、ｓｎａｐｓｈｏｔと記す）と、参照要求受信時の論理クロック値又は参照要求で指定された論理クロック値とを含むマーカを登録するようにする。例えば図１９に示すように、ｔ＝７の時点における複数のデータ値を参照するための参照要求を受信した場合には、マーカ｛ｓｎａｐｓｈｏｔ，ｔ＝７｝を各ノード装置のデータベースに登録する。なお、図１９では、ノード装置ＡがレコードＡのコンテナであり、ノード装置ＢがレコードＢのコンテナであり、ノード装置ＣがレコードＣのコンテナであるものとする。そして、各ノード装置では、第１の実施の形態で説明したような処理を実施することによって分散処理システムにおける系全体の確定クロック値を特定し、系全体の確定クロック値が、マーカに含まれる論理クロック値以上になったか判断する。例えば、マーカ｛ｓｎａｐｓｈｏｔ，ｔ＝７｝が登録されていた場合には、系全体の確定クロック値が７以上になったか判断する。系全体の確定クロック値が７未満であれば、ｔ＝７の時点におけるデータ値は未だ確定していないことになる。一方、系全体の確定クロック値が７以上になっていれば、ｔ＝７の時点におけるデータ値は既に確定していることになり、マーカより下に蓄積されている履歴要素から、ｔ＝７の時点におけるデータ値を特定する。
【００６０】
例えば図１９に示したような状態で、系全体の確定クロック値が７以上になった場合には、レコードＡについては、マーカの下に蓄積されている履歴要素のうち最新の履歴要素は｛４，ｔ＝４｝である。履歴要素｛４，ｔ＝４｝は、ｔ＝４の時点で、キーＡのデータ値として４が設定されたことを示している。そして、ｔ＝４の時点からｔ＝７の時点までの間に、キーＡに係るコマンドは受けていないので、ｔ＝７の時点におけるキーＡのデータ値は４となる。また、レコードＢについては、マーカの下に蓄積されている履歴要素のうち最新の履歴要素は｛１４，ｔ＝６｝である。履歴要素｛１４，ｔ＝６｝は、ｔ＝６の時点で、キーＢのデータ値として１４が設定されたことを示している。そして、ｔ＝６の時点からｔ＝７の時点までの間に、キーＢに係るコマンドは受けていないので、ｔ＝７の時点におけるキーＢのデータ値は１４となる。さらに、レコードＣについては、マーカの下に蓄積されている履歴要素のうち最新の履歴要素は｛２２，ｔ＝２｝である。履歴要素｛２２，ｔ＝２｝は、ｔ＝２の時点で、キーＣのデータ値として２２が設定されたことを示している。そして、ｔ＝２の時点からｔ＝７の時点までの間に、キーＣに係るコマンドは受けていないので、ｔ＝７の時点におけるキーＣのデータ値は２２となる。なお、演算内容の情報を含む履歴要素があった場合には、上で説明したように、マーカの下に蓄積されている複数の履歴要素を用いて、データ値を計算する。
【００６１】
なお、図２０に示すように、レコードＡについて、｛１，ｔ＝０｝、｛２，ｔ＝２｝、｛３，ｔ＝３｝、｛４，ｔ＝４｝といった履歴要素が蓄積されている状態において、系全体の確定クロック値が３になった場合には、履歴要素のうち、｛１，ｔ＝０｝、｛２，ｔ＝２｝、｛３，ｔ＝３｝の３つが確定部分となる。そして、この確定部分の履歴要素から、ｔ＝３の時点におけるデータ値を特定（もしくは計算）すると、ｔ＝３の時点におけるキーＡのデータ値は３であることが分かる。この場合、確定部分の履歴要素のうち、ｔ＝３の時点におけるキーＡのデータ値を含む履歴要素があれば、他の履歴要素を削除しても問題はない。従って、この場合には、｛１，ｔ＝０｝、｛２，ｔ＝２｝の２つの履歴要素は削除することができる。
【００６２】
図２１に、本実施の形態に係るノード装置の機能ブロック図を示す。なお、本実施の形態におけるシステム構成は、図７に示したシステム構成と同じである。本実施の形態に係るノード装置は、メッセージ受信部１１と、メッセージ送信部１３と、コマンドリスト管理部１４と、確定クロック処理部１５と、メッセージ処理部１７と、データベース１８と、データ処理部１９とを有する。なお、コマンドリスト管理部１４は、上で述べたようなコマンドリストを格納するコマンドリスト格納部１４１を管理する。また、確定クロック処理部１５は、クロックリスト受信部１５１と、確定クロック管理部１５３と、クロックリスト送信部１５５と、確定クロック値格納部１５７とを有する。なお、メッセージ受信部１１とメッセージ送信部１３とコマンドリスト管理部１４と確定クロック処理部１５とは、基本的には第１の実施の形態で説明したものと同じである。
【００６３】
また、メッセージ処理部１７は、履歴要素をデータベース１８に登録する履歴登録部１７１と、マーカをデータベース１８に登録するマーカ登録部１７３とを有する。この他、メッセージ処理部１７は、第１の実施の形態で説明したメッセージ処理部１２と同じ機能も有する。なお、マーカを登録する際には、各ノード装置におけるマーカ登録部１７３が連携して、各ノード装置のデータベース１８に同じマーカを登録する。これにより、複数レコードで一貫したデータ値を参照できるようになる。また、データ処理部１９は、確定クロック処理部１５の確定クロック値格納部１５７とデータベース１８とに格納されているデータとを用いて処理を実施し、データベース１８を更新したり、処理結果を送信するようメッセージ送信部１３に指示したりする。メッセージ送信部１３は、データ処理部１９からの指示に応じて、データベース１８に格納されているデータをユーザ端末に送信したり、データベース１８を更新したりする。
【００６４】
次に、図２２及び図２３を用いて、本実施の形態における分散処理システム全体の処理について説明する。例えば、分散処理システムにおいて、レコードＡ乃至Ｃの各々について、図２２（ａ）に示すような履歴要素が蓄積されているものとする。ここでは、レコードＡに対するコマンドに係る履歴要素を格納するための記憶領域を記憶領域Ａ、レコードＢに対するコマンドに係る履歴要素を格納するための記憶領域を記憶領域Ｂ、レコードＣに対するコマンドに係る履歴要素を格納するための記憶領域を記憶領域Ｃと呼ぶ（以下、同じ）。また、図２２（ａ）において、記憶領域内の１ブロックは、１つの履歴要素を示している（以下、同じ）。なお、これらの記憶領域は、ノード装置のデータベース１８に確保される。図２２（ａ）において、記憶領域Ａには、下から順に、｛１，ｔ＝０｝、｛２，ｔ＝２｝、｛３，ｔ＝３｝、｛４，ｔ＝４｝といった４つの履歴要素が蓄積されている。また、記憶領域Ｂは、下から順に、｛１１，ｔ＝０｝、｛１２，ｔ＝２｝、｛１３，ｔ＝３｝、｛１４，ｔ＝６｝といった４つの履歴要素が蓄積されている。さらに、記憶領域Ｃには、下から順に、｛２１，ｔ＝０｝、｛２２，ｔ＝２｝といった２つの履歴要素が蓄積されている。
【００６５】
例えば図２２（ａ）に示した状態において、ｔ＝７の時点における複数のデータ値を参照するための参照要求を受信した場合には、各ノード装置のマーカ登録部１７３が連携して、データベース１８にマーカ｛ｓｎａｐｓｈｏｔ，ｔ＝７｝を登録する。マーカの登録位置は、そのマーカに含まれる論理クロック値から特定される。なお、マーカが登録されると、各記憶領域の内容は、図２２（ｂ）に示すような内容となる。図２２（ｂ）では、マーカに含まれる論理クロック値が、蓄積されている履歴要素内の論理クロック値より大きいため、各記憶領域の一番上にマーカが積まれている。なお、図２２（ｂ）において、記憶領域内の網掛けのブロックは、マーカを示している（以下、同じ）。
【００６６】
その後、例えば、いずれかのノード装置が、ｔ＝６の時点で、ｓｅｔ（ｋｅｙ＝Ｃ，２４）コマンドを受け付け、ｔ＝８の時点で、ｓｅｔ（ｋｅｙ＝Ｂ，１５）コマンドを受け付けたものとする。そうすると、履歴登録部１７１が、データベース１８に履歴要素を登録する。例えば図２２（ｃ）に示すように、記憶領域Ｃにおいて、履歴要素｛２４，ｔ＝６｝がマーカの下に挿入される。また、記憶領域Ｂにおいて、履歴要素｛１５，ｔ＝８｝がマーカの上に積まれる。
【００６７】
その後、ｔ＝４の時点までデータが確定したものとする。すなわち、系全体の確定クロック値が４と特定されたものとする。この場合、データ処理部１９が、データベース１８に蓄積されている履歴要素から、ｔ＝４の時点におけるデータ値を特定（もしくは計算）する。例えば図２２（ｄ）に示すように、レコードＡについては、記憶領域Ａに蓄積されている履歴要素のうち、｛１，ｔ＝０｝、｛２，ｔ＝２｝、｛３，ｔ＝３｝、｛４，ｔ＝４｝の４つが確定部分となり、この確定部分の履歴要素から、ｔ＝４の時点におけるキーＡのデータ値は４と特定される。また、レコードＢについては、記憶領域Ｂに蓄積されている履歴要素のうち、｛１１，ｔ＝０｝、｛１２，ｔ＝２｝、｛１３，ｔ＝３｝の３つが確定部分となり、この確定部分の履歴要素から、ｔ＝４の時点におけるキーＢのデータ値は１３と特定される。さらに、レコードＣについては、記憶領域Ｃに蓄積されている履歴要素のうち、｛２１，ｔ＝０｝、｛２２，ｔ＝２｝の２つが確定部分であり、この確定部分の履歴要素から、ｔ＝４の時点におけるキーＣのデータ値は２２と特定される。なお、記憶領域Ａにおいて、履歴要素｛４，ｔ＝４｝が保持されていれば、当該履歴要素の下に蓄積されている履歴要素を削除することができる。同様に、記憶領域Ｂにおいて、履歴要素｛１３，ｔ＝３｝が保持されていれば、当該履歴要素の下に蓄積されている履歴要素を削除することができる。さらに、記憶領域Ｃにおいて、履歴要素｛２２，ｔ＝２｝が保持されていれば、当該履歴要素の下に蓄積されている履歴要素を削除することができる。従って、データ処理部１９は、記憶領域Ａから、｛１，ｔ＝０｝、｛２，ｔ＝２｝、｛３，ｔ＝３｝の３つの履歴を削除し、記憶領域Ｂから、｛１１，ｔ＝０｝、｛１２，ｔ＝２｝の２つの履歴要素を削除し、記憶領域Ｃから、｛２１，ｔ＝０｝を削除する。これらの履歴要素が削除されると、各記憶領域の内容は、図２３（ａ）に示すような内容となる。
【００６８】
その後、例えば、いずれかのノード装置が、ｔ＝５の時点で、ｓｅｔ（ｋｅｙ＝Ａ，５）コマンドを受け付け、ｔ＝９の時点で、ｓｅｔ（ｋｅｙ＝Ｃ，２５）コマンドを受け付けたものとする。そうすると、履歴登録部１７１が、データベース１８に履歴要素を登録する。例えば図２３（ｂ）に示すように、記憶領域Ａにおいて、履歴要素｛５，ｔ＝５｝がマーカの下に挿入される。また、記憶領域Ｃにおいて、履歴要素｛２５，ｔ＝９｝がマーカの上に積まれる。
【００６９】
その後、系全体の確定クロック値が、マーカに含まれる論理クロック値以上になったものとする。ここでは、系全体の確定クロック値が７と特定されたものとする。この場合、データ処理部１９が、データベース１８においてマーカの下に蓄積されている履歴要素から、マーカに含まれる論理クロック値の示す時刻におけるデータ値を特定（もしくは計算）する。図２３（ｃ）に示すように、レコードＡについては、記憶領域Ａにおいてマーカの下に蓄積されている履歴要素は、｛４，ｔ＝４｝、｛５，ｔ＝５｝の２つであり、この２つの履歴要素から、ｔ＝７の時点におけるキーＡのデータ値は５と特定される。また、レコードＢについては、記憶領域Ｂにおいてマーカの下に蓄積されている履歴要素は、｛１３，ｔ＝３｝、｛１４，ｔ＝６｝の２つであり、この２つの履歴要素から、ｔ＝７の時点におけるキーＢのデータ値は１４と特定される。さらに、レコードＣについては、記憶領域Ｃにおいてマーカの下に蓄積されている履歴要素は、｛２２、ｔ＝２｝、｛２４，ｔ＝６｝の２つであり、この２つの履歴要素から、ｔ＝７の時点におけるキーＣのデータ値は２４と特定される。そして、データ処理部１９は、マーカ内の参照要求の情報（すなわち、「ｓｎａｐｓｈｏｔ」）の代わりに、特定（もしくは計算）した値を設定する。例えば、ｔ＝７の時点におけるデータ値が５と特定された際に、このデータ値をマーカ｛ｓｎａｐｓｈｏｔ，ｔ＝７｝に設定すると、｛５，ｔ＝７｝といった内容になる。なお、説明の便宜上、以下では、データ値が設定される前のマーカ（すなわち、「ｓｎａｐｓｈｏｔ」が設定されているマーカ）を第１のマーカと呼び、データ値が設定された後のマーカを第２のマーカと呼ぶ場合もある。また、データ処理部１９は、各記憶領域においてマーカの下に蓄積されている履歴要素を削除する。マーカに含まれる論理クロック値の示す時刻におけるデータ値が特定された後であれば、マーカの下に蓄積されている履歴要素は削除しても問題ないためである。マーカの下に蓄積されている履歴要素を削除すると、各記憶領域の内容は、図２３（ｄ）に示すような内容となる。なお、図２３（ｄ）において、斜線を付したブロックは、第２のマーカを示している（以下、同じ）。図２３（ｄ）において、記憶領域Ａには、第２のマーカ｛５，ｔ＝７｝のみが蓄積されている。また、記憶領域Ｂには、第２のマーカ｛１４，ｔ＝７｝と履歴要素｛１５，ｔ＝８｝とが蓄積されている。さらに、記憶領域Ｃには、第２のマーカ｛２４，ｔ＝７｝と履歴要素｛２５，ｔ＝９｝とが蓄積されている。図２３（ｄ）に示した状態において、例えば、ｇｅｔ（ｋｅｙ＝Ｂ）コマンドを受け付けた場合には、現時点のデータ値（＝１５）を返す。一方で、第２のマーカに含まれるデータ値を取得するためのコマンドを受け付けた場合には、第２のマーカに含まれるデータ値（＝１４）を返すようにする。
【００７０】
このように、系全体の確定クロック値が、第１のマーカに含まれる論理クロック値以上になった場合に、第１のマーカの下に蓄積されている履歴要素から、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定（もしくは計算）する。
【００７１】
なお、ある時点における複数のデータ値を参照する手法として、例えば図２４に示すような手法も考えられる。具体的には、複数のデータ値を参照するための参照要求を受けた場合、分散処理システム全体でロック（ジャイアントロックとも呼ばれる）をかけ、外部からの更新要求を拒否する。例えばｔ＝７の時点で参照要求を受け付けた場合には、図２４に示すように、ｔ＝８の時点で、外部からｓｅｔ（ｋｅｙ＝Ｃ，２３）コマンドがあったとしても、これを拒否する。その後、ｔ＝７の時点までデータが確定するのを待ち、確定した場合には、蓄積されている履歴要素からデータ値を特定する。しかしながら、この手法では、分散処理システム全体でロックをかけるため、分散処理システムの性能に対して大きな影響を与えてしまう。これに対し、本実施の形態に係る手法であれば、ロックが不要であるため、分散処理システムの性能に対して影響を与えずに、ある時点における複数のデータ値を参照できるようになる。
【００７２】
次に、図２５及び図２６を用いて、ｄｅｌｅｔｅコマンド（以下、削除コマンドとも呼ぶ）を受け付けた場合の処理について説明する。例えば、分散処理システムにおいて、図２５（ａ）に示すような履歴要素が蓄積されているものとする。図２５（ａ）において、記憶領域Ａには、下から順に、｛１，ｔ＝０｝、｛２，ｔ＝２｝、｛３，ｔ＝３｝、｛４，ｔ＝４｝といった４つの履歴要素が蓄積されている。また、記憶領域Ｂは、下から順に、｛１１，ｔ＝０｝、｛１２，ｔ＝２｝、｛１３，ｔ＝３｝、｛１４，ｔ＝６｝といった４つの履歴要素が蓄積されている。さらに、記憶領域Ｃには、下から順に、｛２１，ｔ＝０｝、｛２２，ｔ＝２｝といった２つの履歴要素が蓄積されている。
【００７３】
例えば図２５（ａ）に示した状態において、ｔ＝７の時点における複数のデータ値を参照するための参照要求を受信した場合には、各ノード装置のマーカ登録部１７３が連携して、データベース１８に第１のマーカ｛ｓｎａｐｓｈｏｔ，ｔ＝７｝を登録する。なお、第１のマーカが登録されると、各記憶領域の内容は、図２５（ｂ）に示すような内容となる。図２５（ｂ）では、第１のマーカに含まれる論理クロック値が、蓄積されている履歴要素内の論理クロック値より大きいため、各記憶領域の一番上に第１のマーカが積まれている。
【００７４】
その後、いずれかのノード装置が、ｔ＝８の時点で、ｄｅｌｅｔｅ（ｋｅｙ＝Ａ）コマンドを受け付けたものとする。そうすると、履歴登録部１７１が、記憶領域Ａに第１のマーカが登録されているか判断し、登録されている場合には、記憶領域Ａ内の履歴要素を削除せずに、ｄｅｌｅｔｅコマンドに係る履歴要素｛ｄｅｌ，ｔ＝８｝を記憶領域Ａに登録する。例えば図２５（ｃ）に示すように、記憶領域Ａにおいて、履歴要素｛ｄｅｌ，ｔ＝８｝が第１のマーカの上に積まれる。
【００７５】
また、例えば、ｄｅｌｅｔｅコマンドを受け付けたノード装置とは別のノード装置が、ｔ＝６の時点で、ｓｅｔ（ｋｅｙ＝Ｃ，２４）コマンドを受け付け、ｔ＝８の時点で、ｓｅｔ（ｋｅｙ＝Ｂ，１５）コマンドを受け付けていたものとする。そうすると、履歴登録部１７１が、データベース１８に履歴要素を登録する。例えば図２５（ｄ）に示すように、記憶領域Ｃにおいて、履歴要素｛２４，ｔ＝６｝が第１のマーカの下に挿入される。また、記憶領域Ｂにおいて、履歴要素｛１５，ｔ＝８｝が第１のマーカの上に積まれる。
【００７６】
その後、系全体の確定クロック値が、第１のマーカに含まれる論理クロック値以上になったものとする。ここでは、系全体の確定クロック値が７と特定されたものとする。この場合、データ処理部１９が、データベース１８において第１のマーカの下に蓄積されている履歴要素から、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定（もしくは計算）する。図２６（ａ）に示すように、レコードＡについては、記憶領域Ａにおいて第１のマーカの下に蓄積されている履歴要素は、｛１，ｔ＝０｝、｛２，ｔ＝２｝、｛３，ｔ＝３｝、｛４，ｔ＝４｝の４つであり、この４つの履歴要素から、ｔ＝７の時点におけるキーＡのデータ値は４と特定される。また、レコードＢについては、記憶領域Ｂにおいて第１のマーカの下に蓄積されている履歴要素は、｛１１，ｔ＝０｝、｛１２，ｔ＝２｝、｛１３，ｔ＝３｝、｛１４，ｔ＝６｝の４つであり、この４つの履歴要素から、ｔ＝７の時点におけるキーＢのデータ値は１４と特定される。さらに、レコードＣについては、記憶領域Ｃにおいて第１のマーカの下に蓄積されている履歴要素は、｛２１，ｔ＝０｝、｛２２、ｔ＝２｝、｛２４，ｔ＝６｝の３つであり、この３つの履歴要素から、ｔ＝７の時点におけるキーＣのデータ値は２４と特定される。
【００７７】
そして、データ処理部１９は、第１のマーカ内の参照要求の情報（すなわち、「ｓｎａｐｓｈｏｔ」）の代わりに、特定（もしくは計算）した値を設定し、第２のマーカとして格納する。また、データ処理部１９は、各記憶領域において第２のマーカの下に蓄積されている履歴要素を削除する。第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値が特定された後であれば、第２のマーカの下に蓄積されている履歴要素は削除しても問題ないためである。第２のマーカの下に蓄積されている履歴要素を削除すると、各記憶領域の内容は、図２６（ｂ）に示すような内容となる。図２６（ｂ）において、記憶領域Ａには、第２のマーカ｛４，ｔ＝７｝と削除コマンドに係る履歴要素｛ｄｅｌ，ｔ＝８｝とが蓄積されている。また、記憶領域Ｂには、第２のマーカ｛１４，ｔ＝７｝と履歴要素｛１５，ｔ＝８｝とが蓄積されている。さらに、記憶領域Ｃには、第２のマーカ｛２４，ｔ＝７｝が蓄積されている。
【００７８】
その後、任意のタイミングにて、メッセージ送信部１３が、第２のマーカに設定されているデータ値を、参照要求の要求元に通知する。例えば図２６（ｃ）に示すように、ｔ＝７の時点におけるキーＡ乃至Ｃのデータ値として、４、１４、２４が参照要求の要求元へ通知される。そして、記憶領域Ａには削除コマンドに係る履歴要素が蓄積されているので、第２のマーカに設定されているデータ値を参照要求の要求元へ通知した後に、レコードＡに係るデータを削除する。具体的には、記憶領域Ａ内のデータを削除する。例えば記憶領域Ａ内のデータを削除すると、各記憶領域の内容は、図２６（ｄ）に示すような内容となる。図２６（ｄ）において、記憶領域Ｂ及びＣの内容は、図２６（ｃ）と同じであるが、記憶領域Ａは、空の状態になっている。
【００７９】
このように、削除コマンドを受け付けたとしても、第１のマーカが登録されている場合には、記憶領域に蓄積されている履歴要素を削除しないようにする。これにより、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定（もしくは計算）できるようになる。
【００８０】
次に、図２７及び図２８を用いて、あるレコードが削除された後に参照要求を受信した場合の処理について説明する。例えば、分散処理システムにおいて、図２７（ａ）に示すような履歴要素が蓄積されているものとする。ここでは、削除コマンドによって、レコードＡに係るデータが削除され、各記憶領域の内容が、図２７（ａ）に示すような内容になっているものとする。図２７（ａ）において、記憶領域Ａは、空の状態となっている。また、記憶領域Ｂには、下から順に、｛１１，ｔ＝０｝、｛１２，ｔ＝２｝、｛１３，ｔ＝３｝、｛１４，ｔ＝６｝といった４つの履歴要素が蓄積されている。さらに、記憶領域Ｃには、下から順に、｛２１，ｔ＝０｝、｛２２，ｔ＝２｝といった２つの履歴要素が蓄積されている。
【００８１】
例えば図２７（ａ）に示した状態において、ｔ＝７の時点における複数のデータ値を参照するための参照要求を受信した場合には、各ノード装置のマーカ登録部１７３が連携して、データベース１８に第１のマーカ｛ｓｎａｐｓｈｏｔ，ｔ＝７｝を登録する。ここで、レコードＡに係るデータは削除された後であるため、記憶領域Ａには、第１のマーカを登録しない。但し、後で説明するように、レコードＡに係るデータが再設定された場合に、第１のマーカを登録することになるので、第１のマーカをデータベース１８内の所定の領域に格納し、第１のマーカを保持しておく。なお、記憶領域Ｂ及びＣに第１のマーカが登録されると、図２７（ｂ）に示すような内容となる。図２７（ｂ）では、第１のマーカに含まれる論理クロック値が、蓄積されている履歴要素内の論理クロック値より大きいため、記憶領域Ｂ及びＣの一番上に第１のマーカが積まれている。
【００８２】
その後、いずれかのノード装置が、ｔ＝５の時点で、ｓｅｔ（ｋｅｙ＝Ｃ，２４）コマンドを受け付け、ｔ＝６の時点で、ｓｅｔ（ｋｅｙ＝Ａ，１）コマンドを受け付けたたものとする。そうすると、履歴登録部１７１が、データベース１８に履歴要素を登録する。例えば図２７（ｃ）に示すように、記憶領域Ｃにおいて、履歴要素｛２４，ｔ＝５｝がマーカの下に挿入される。また、図２７（ｂ）では、記憶領域Ａは空の状態であったが、図２７（ｃ）に示すように、記憶領域Ａに履歴要素｛１，ｔ＝６｝が追加される。そして、今回登録した履歴要素が１つ目の履歴要素であるか判断し、１つ目の履歴要素であった場合には、登録すべき第１のマーカがあるか判断する。例えば、第１のマーカが保持されている場合には、登録すべき第１のマーカがあると判断する。そして、登録すべき第１のマーカがある場合には、今回履歴要素を登録した記憶領域に第１のマーカを追加する。ここでは、記憶領域Ａに追加した履歴要素｛１，ｔ＝６｝が１つ目の履歴要素であり、且つ、登録すべき第１のマーカ｛ｓｎａｐｓｈｏｔ，ｔ＝７｝があるので、例えば図２７（ｄ）に示すように、記憶領域Ａにおいて、履歴要素｛１，ｔ＝７｝の上に第１のマーカが積まれる。
【００８３】
その後、系全体の確定クロック値が、第１のマーカに含まれる論理クロック値以上になったものとする。ここでは、系全体の確定クロック値が７と特定されたものとする。この場合、データ処理部１９が、データベース１８において第１のマーカの下に蓄積されている履歴要素から、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定（もしくは計算）する。図２８（ａ）に示すように、レコードＡについては、記憶領域Ａにおいて第１のマーカの下に蓄積されている履歴要素は、｛１，ｔ＝６｝のみであり、ｔ＝７の時点におけるキーＡのデータ値は１と特定される。また、レコードＢについては、記憶領域Ｂにおいて第１のマーカの下に蓄積されている履歴要素は、｛１１，ｔ＝０｝、｛１２，ｔ＝２｝、｛１３，ｔ＝３｝、｛１４，ｔ＝６｝の４つであり、この４つの履歴要素から、ｔ＝７の時点におけるキーＢのデータ値は１４と特定される。さらに、レコードＣについては、記憶領域Ｃにおいて第１のマーカの下に蓄積されている履歴要素は、｛２１，ｔ＝０｝、｛２２、ｔ＝２｝、｛２４，ｔ＝５｝の３つであり、この３つの履歴要素から、ｔ＝７の時点におけるキーＣのデータ値は２４と特定される。
【００８４】
そして、データ処理部１９は、第１のマーカ内の参照要求の情報（すなわち、「ｓｎａｐｓｈｏｔ」）の代わりに、特定（もしくは計算）した値を設定し、第２のマーカとして格納する。また、データ処理部１９は、各記憶領域において第２のマーカの下に蓄積されている履歴要素を削除する。第２のマーカの下に蓄積されている履歴要素を削除すると、各記憶領域の内容は、図２８（ｂ）に示すような内容となる。図２８（ｂ）において、記憶領域Ａには、第２のマーカ｛１，ｔ＝７｝が蓄積されている。また、記憶領域Ｂには、第２のマーカ｛１４，ｔ＝７｝が蓄積されている。さらに、記憶領域Ｃには、第２のマーカ｛２４，ｔ＝７｝が蓄積されている。そして、任意のタイミングにて、第２のマーカに設定されているデータ値が、参照要求の要求元に通知される。
【００８５】
次に、第３の実施の形態におけるノード装置の処理フローについて説明する。最初に、図２９を用いて、ユーザ端末からコマンド又は参照要求を受信した際の処理フローを説明する。まず、メッセージ受信部１１が、ユーザ端末からコマンド又は参照要求を受信する。そして、メッセージ受信部１１は、コマンドを受信したか判断する（図２９：ステップＳ５１）。コマンドを受信した場合には（ステップＳ５１：Ｙｅｓルート）、メッセージ受信部１１は、受信したコマンドをメッセージ処理部１７に出力する。そして、メッセージ処理部１７は、受信したコマンドについてコマンド受信処理を実施し（ステップＳ５３）、その後、処理を終了する。このコマンド受信処理については図３０を用いて説明する。
【００８６】
まず、メッセージ処理部１７が、受信したコマンドが削除コマンドであるか判断する（図３０：ステップＳ６１）。受信したコマンドが削除コマンドでなければ（ステップＳ６１：Ｎｏルート）、メッセージ処理部１７の履歴登録部１７１が、タイムスタンプに従って、受信したコマンドに係る履歴要素をデータベース１８内の該当する記憶領域に登録する（ステップＳ６３）。上で述べたような、レコード別の記憶領域がデータベース１８内に確保されており、該当する記憶領域に、受信したコマンドに係る履歴要素を登録する。この際、記憶領域内の履歴要素がタイムスタンプの順に蓄積されるように登録する。なお、上でも説明したが、履歴要素には、コマンド受信時に分散フレームワークによって振られるタイムスタンプと、そのタイムスタンプの示す時刻におけるデータ値又はコマンドの情報（例えばコマンドで指定された演算内容の情報など）とが含まれる。例えば、受信したコマンドがｓｅｔコマンドであれば、ｓｅｔコマンドで指定されたデータ値が履歴要素に設定され、受信したコマンドがｉｎｃコマンドであれば、演算内容（すなわち、インクリメント）を表す情報が履歴要素に設定される。
【００８７】
その後、履歴登録部１７１は、ステップＳ６３において登録した履歴要素が、記憶領域において１つ目の履歴要素であったか判断する（ステップＳ６５）。１つ目の履歴要素でなければ（ステップＳ６５：Ｎｏルート）、処理を終了し、元の処理に戻る。
【００８８】
一方、１つ目の履歴要素であった場合（ステップＳ６５：Ｙｅｓルート）、マーカ登録部１７３が、登録すべき第１のマーカがあるかどうか判断する（ステップＳ６７）。上でも述べたように、例えばレコードに係るデータが削除された後で参照要求を受信した場合には、第１のマーカがデータベース１８内の所定の領域において保持される。従って、データベース１８内の所定の領域で保持されている第１のマーカがあるかどうか判断し、第１のマーカが保持されていれば、登録すべき第１のマーカがあると判断する。登録すべき第１のマーカがなければ（ステップＳ６７：Ｎｏルート）、処理を終了し、元の処理に戻る。
【００８９】
一方、登録すべき第１のマーカがある場合には（ステップＳ６７：Ｙｅｓルート）、マーカ登録部１７３が、ステップＳ６３において履歴要素を登録した記憶領域に、第１のマーカを登録する（ステップＳ６９）。その後、処理を終了し、元の処理に戻る。
【００９０】
また、ステップＳ６１において、受信したコマンドが削除コマンドであると判断された場合（ステップＳ６１：Ｙｅｓルート）、履歴登録部１７１は、データベース１８を検索し、削除コマンドで指定されたレコードに対応する記憶領域に第１のマーカが登録されているか判断する（ステップＳ７１）。該当する記憶領域に第１のマーカが登録されていなければ（ステップＳ７１：Ｎｏルート）、履歴登録部１７１は、該当する記憶領域内のデータ（すなわち、履歴要素）を削除する（ステップＳ７３）。その後、処理を終了し、元の処理に戻る。
【００９１】
一方、該当する記憶領域に第１のマーカが登録されている場合には（ステップＳ７１：Ｙｅｓルート）、履歴登録部１７１は、削除コマンドに係る履歴要素を該当する記憶領域に登録する（ステップＳ７５）。その後、処理を終了し、元の処理に戻る。
【００９２】
図２９の説明に戻って、ステップＳ５１において、コマンドを受信していないと判断された場合（ステップＳ５１：Ｎｏルート）、メッセージ受信部１１は、複数のデータ値を参照するための参照要求を受信したか判断する（ステップＳ５５）。参照要求を受信していなければ（ステップＳ５５：Ｎｏルート）、以下で説明するステップＳ５７をスキップし、処理を終了する。一方、参照要求を受信した場合には（ステップＳ５５：Ｙｅｓルート）、メッセージ受信部１１は、受信した参照要求をメッセージ処理部１７に出力する。そして、メッセージ処理部１７のマーカ登録部１７３は、メッセージ受信部１１が受信した参照要求を受け取ると、第１のマーカをデータベース１８内の各記憶領域に登録する（ステップＳ５７）。第１のマーカには、参照要求の情報（すなわち、「ｓｎａｐｓｈｏｔ」）と、当該参照要求を受信した時点の論理クロック値又は参照要求で指定された論理クロック値とが含まれる。また、第１のマーカに、参照要求の要求元の情報（例えば要求元のＩＰアドレスなど）を含めるようにしてもよい。なお、マーカ登録部１７３が、他のノード装置におけるマーカ登録部１７３と連携することによって、同じ論理クロック値を含む第１のマーカが、各ノード装置のデータベース１８内の各記憶領域に登録される。その後、処理を終了する。
【００９３】
以上のような処理を実施することによって、コマンドに係る履歴要素及び第１のマーカをデータベース１８内の記憶領域に登録することができる。また、削除コマンドを受信したとしても、第１のマーカが登録されている場合には、該当する記憶領域内のデータを削除しないので、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定（もしくは計算）できるようになる。
【００９４】
次に、図３１を用いて、クロックリスト受信時の処理フローを説明する。まず、確定クロック処理部１５のクロックリスト受信部１５１が、他のノード装置からのクロックリストを受信し（図３１：ステップＳ８１）、受信したクロックリストを確定クロック管理部１５３に出力する。そして、確定クロック管理部１５３は、クロックリスト受信部１５１からクロックリストを受信すると、確定クロック値特定処理を実施する（ステップＳ８３）。なお、確定クロック値特定処理が実施されると、系全体の確定クロック値が特定され、確定クロック値格納部１５７に格納される。確定クロック値特定処理は、第１の実施の形態で説明した処理と同じであるため、ここでは、詳細な説明は省略する。
【００９５】
その後、データ処理部１９が、確定クロック値格納部１５７に格納されているデータを用いて、系全体の確定クロック値が、前回処理時から変化しているか判断する（ステップＳ８５）。例えば本ステップ実施時の系全体の確定クロック値を保持するようにし、次回本ステップを実施する際に、保持しておいた系全体の確定クロック値を、前回処理時の系全体の確定クロック値として用いるようにする。すなわち、本ステップ実施時の系全体の確定クロック値と前回処理時の系全体の確定クロック値とを比較することで、系全体の確定クロック値に変化があったかどうか判断する。系全体の確定クロック値が前回処理時から変化していなければ（ステップＳ８５：Ｎｏルート）、以下で説明する処理をスキップし、処理を終了する。
【００９６】
一方、系全体の確定クロック値が前回処理時から変化している場合（ステップＳ８５：Ｙｅｓルート）、データ処理部１９は、確定クロック値格納部１５７とデータベース１８とに格納されているデータを用いて、系全体の確定クロック値が第１マーカに含まれる論理クロック値以上になったか判断する（ステップＳ８７）。系全体の確定クロック値が第１マーカに含まれる論理クロック値未満である場合（ステップＳ８７：Ｎｏルート）、処理はステップＳ８９に移行する。そして、データ処理部１９は、データベース１８に格納されているデータを用いて、系全体の確定クロック値の示す時刻におけるデータ値を特定又は計算する（ステップＳ８９）。具体的には、図２２（ｄ）で説明したように、データベース１８内の記憶領域に蓄積されている確定部分の履歴要素から、系全体の確定クロック値の示す時刻におけるデータ値を特定又は計算する。そして、データ処理部１９は、データベース１８内の記憶領域から、系全体の確定クロック値の示す時刻におけるデータ値を含む履歴要素より古い履歴要素を削除する（ステップＳ９１）。具体的には、図２３（ａ）で説明したように、系全体の確定クロック値の示す時刻におけるデータ値を含む履歴要素より下に蓄積されている履歴要素を記憶領域から削除する。その後、処理を終了する。
【００９７】
一方、ステップＳ８７において、系全体の確定クロック値が第１のマーカに含まれる論理クロック値以上になったと判断された場合（ステップＳ８７：Ｙｅｓルート）、処理はステップＳ９３に移行する。そして、データ処理部１９は、データベース１８に格納されているデータを用いて、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定又は計算する（ステップＳ９３）。具体的には、図２３（ｃ）で説明したように、データベース１８内の記憶領域において第１のマーカの下に蓄積されている履歴要素から、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定又は計算する。そして、データ処理部１９は、特定又は計算されたデータ値を第１のマーカに設定し、第２のマーカとして格納する（ステップＳ９５）。具体的には、上で説明したように、第１のマーカ内の参照要求の情報（すなわち、「ｓｎａｐｓｈｏｔ」）の代わりに、特定又は計算したデータ値を設定する。そして、データ処理部１９は、データベース１８に格納されているデータを用いて、系全体の確定クロック値の示す時刻におけるデータ値を特定又は計算する（ステップＳ９７）。例えば、第１のマーカに含まれる論理クロック値が７であった場合に、系全体の確定クロック値が１０になったとすると、第１のマーカに含まれる論理クロック値（＝７）の示す時刻におけるデータ値と、系全体の確定クロック値（＝１０）の示す時刻におけるデータ値とを特定又は計算する必要がある。上で説明したステップＳ９３では、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定又は計算し、ステップＳ９７では、系全体の確定クロック値の示す時刻におけるデータ値を特定又は計算する。ステップＳ９７の処理は、上で説明したステップＳ８９の処理と同じであるため、ここでは、これ以上述べない。なお、第１のマーカに含まれる論理クロック値と系全体の確定クロック値とが同じ場合には、系全体の確定クロック値の示す時刻におけるデータ値は、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値と同じであるため、ステップＳ９７の処理は省略可能である。
【００９８】
その後、データ処理部１９は、データベース１８内の記憶領域から、系全体の確定クロック値の示す時刻におけるデータ値を含む履歴要素より古い履歴要素を削除する（ステップＳ９９）。ここでは、第２のマーカはデータベース１８内の記憶領域から削除されない。
【００９９】
そして、データ処理部１９は、データベース１８内の記憶領域に蓄積されている第２のマーカに参照要求の要求元の情報が含まれているか判断する（ステップＳ１０１）。第２のマーカに参照要求の要求元の情報が含まれていなければ（ステップＳ１０１：Ｎｏルート）、以下で説明するステップＳ１０３をスキップし、処理を終了する。この場合、第２のマーカは、データ値を参照要求の要求元に送信するまでは少なくとも保持される。
【０１００】
一方、第２のマーカに参照要求の要求元の情報が含まれている場合（ステップＳ１０１：Ｙｅｓルート）、データ処理部１９は、その第２のマーカに含まれるデータ値を送信するようメッセージ送信部１３に指示する。そして、メッセージ送信部１３は、データ処理部１９からの指示に応じて、データベース１８内の記憶領域において、参照要求の要求元の情報を含む第２のマーカを特定し、特定した第２のマーカに含まれるデータ値を参照要求の要求元に送信し、特定した第２のマーカをデータベース１８内の記憶領域から削除する（ステップＳ１０３）。なお、ステップＳ１０３では、第２のマーカを削除しないようにし、以降の任意のタイミングで削除するようにしてもよい。第２のマーカに含まれるデータ値を参照要求の要求元に送信した後であれば、その第２のマーカをいつ削除しても問題はない。また、データ処理部１９は、データベース１８内の記憶領域に、削除コマンドに係る履歴要素が蓄積されているか、第１又は第２のマーカが蓄積されているか判断する。削除コマンドに係る履歴要素が蓄積されており、且つ、第１及び第２のマーカのどちらも蓄積されていない場合には、削除コマンドで指定されたレコードに対応する記憶領域内のデータを削除する。その後、処理を終了する。
【０１０１】
以上のような処理を実施することによって、系全体の確定クロック値が第１のマーカに含まれる論理クロック値以上になった時点で、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定（もしくは計算）することができるようになる。なお、各ノード装置のデータベース１８内の記憶領域には、同じ論理クロック値を含む第１のマーカが登録されることになるので、上で述べたような処理が各ノード装置で実施されることになる。例えば、各ノード装置によって特定（もしくは計算）されたデータ値を収集することで、特定の時点における複数のデータ値を把握できるようになる。
【０１０２】
［実施の形態４］
次に、第４の実施の形態について説明する。上で説明した第３の実施の形態では、履歴要素を蓄積するための記憶領域に第１のマーカも蓄積するようになっていたが、第４の実施の形態では、履歴要素を蓄積するための記憶領域とは別の領域で第１のマーカを保持するような構成を採用する。
【０１０３】
図３２に、本実施の形態に係るノード装置の機能ブロック図を示す。なお、本実施の形態におけるシステム構成は、図７に示したシステム構成と同じである。本実施の形態に係るノード装置は、メッセージ受信部１１と、メッセージ送信部１３と、コマンドリスト管理部１４と、確定クロック処理部１５と、メッセージ処理部１７と、データベース１８と、データ処理部１９と、マーカ格納部２０とを有する。なお、マーカ格納部２０を有する点以外は、基本的には第３の実施の形態と同じである。但し、本実施の形態では、マーカ登録部１７３は、第１のマーカをマーカ格納部２０に登録するようになる。また、データ処理部１９は、確定クロック値格納部１５７とデータベース１８とマーカ格納部２０とに格納されているデータを用いて処理を実施するようになる。
【０１０４】
図３３及び図３４を用いて、本実施の形態における分散処理システム全体の処理について説明する。例えば、分散処理システムにおいて、図３３（ａ）に示すような履歴要素が蓄積されているものとする。図３３（ａ）において、記憶領域Ａには、下から順に、｛１，ｔ＝０｝、｛２，ｔ＝２｝、｛３，ｔ＝３｝、｛４，ｔ＝４｝といった４つの履歴要素が蓄積されている。また、記憶領域Ｂは、下から順に、｛１１，ｔ＝０｝、｛１２，ｔ＝２｝、｛１３，ｔ＝３｝、｛１４，ｔ＝６｝といった４つの履歴要素が蓄積されている。さらに、記憶領域Ｃには、下から順に、｛２１，ｔ＝０｝、｛２２，ｔ＝２｝といった２つの履歴要素が蓄積されている。なお、ここでは、あるノード装置が、レコードＡ乃至Ｃの担当になっているもとのする。
【０１０５】
例えば図３３（ａ）に示した状態において、ｔ＝７の時点における複数のデータ値を参照するための参照要求を受信した場合には、各ノード装置のマーカ登録部１７３が連携して、図３３（ｂ）に示すように、マーカ格納部２０に第１のマーカ｛ｓｎａｐｓｈｏｔ，ｔ＝７｝を登録する。
【０１０６】
そして、例えば、いずれかのノード装置が、ｔ＝６の時点で、ｓｅｔ（ｋｅｙ＝Ｃ，２４）コマンドを受け付け、ｔ＝８の時点で、ｓｅｔ（ｋｅｙ＝Ｂ，１５）コマンドを受け付けたものとする。そうすると、履歴登録部１７１が、データベース１８に履歴要素を登録する。例えば図３３（ｃ）に示すように、記憶領域Ｃにおいて、一番上に履歴要素｛２４，ｔ＝６｝が積まれ、記憶領域Ｂにおいて、一番上に履歴要素｛１５，ｔ＝８｝が積まれる。
【０１０７】
その後、ｔ＝４の時点までデータが確定したものとする。すなわち、系全体の確定クロック値が４と特定されたものとする。この場合、データ処理部１９が、データベース１８に蓄積されている履歴要素から、ｔ＝４の時点におけるデータ値を特定（もしくは計算）する。例えば図３３（ｄ）に示すように、レコードＡについては、記憶領域Ａに蓄積されている履歴要素のうち、｛１，ｔ＝０｝、｛２，ｔ＝２｝、｛３，ｔ＝３｝、｛４，ｔ＝４｝の４つが確定部分となり、この確定部分の履歴要素から、ｔ＝４の時点におけるキーＡのデータ値は４と特定される。また、レコードＢについては、記憶領域Ｂに蓄積されている履歴要素のうち、｛１１，ｔ＝０｝、｛１２，ｔ＝２｝、｛１３，ｔ＝３｝の３つが確定部分となり、この確定部分の履歴要素から、ｔ＝４の時点におけるキーＢのデータ値は１３と特定される。さらに、レコードＣについては、記憶領域Ｃに蓄積されている履歴要素のうち、｛２１，ｔ＝０｝、｛２２，ｔ＝２｝の２つが確定部分であり、この確定部分の履歴要素から、ｔ＝４の時点におけるキーＣのデータ値は２２と特定される。なお、記憶領域Ａにおいて、履歴要素｛４，ｔ＝４｝が保持されていれば、当該履歴要素の下に蓄積されている履歴要素を削除することができる。同様に、記憶領域Ｂにおいて、履歴要素｛１３，ｔ＝３｝が保持されていれば、当該履歴要素の下に蓄積されている履歴要素を削除することができる。さらに、記憶領域Ｃにおいて、履歴要素｛２２，ｔ＝２｝が保持されていれば、当該履歴要素の下に蓄積されている履歴要素を削除することができる。従って、データ処理部１９は、記憶領域Ａから、｛１，ｔ＝０｝、｛２，ｔ＝２｝、｛３，ｔ＝３｝の３つの履歴を削除し、記憶領域Ｂから、｛１１，ｔ＝０｝、｛１２，ｔ＝２｝の２つの履歴要素を削除し、記憶領域Ｃから、｛２１，ｔ＝０｝を削除する。これらの履歴要素が削除されると、各記憶領域の内容は、図３４（ａ）に示すような内容となる。
【０１０８】
そして、例えば、いずれかのノード装置が、ｔ＝５の時点で、ｓｅｔ（ｋｅｙ＝Ａ，５）コマンドを受け付け、ｔ＝９の時点で、ｓｅｔ（ｋｅｙ＝Ｃ，２５）コマンドを受け付けたものとする。そうすると、履歴登録部１７１が、データベース１８に履歴要素を登録する。例えば図３４（ｂ）に示すように、記憶領域Ａにおいて、一番上に履歴要素｛５，ｔ＝５｝が積まれ、記憶領域Ｃにおいて、一番上に履歴要素｛２５，ｔ＝９｝が積まれる。
【０１０９】
その後、系全体の確定クロック値が、マーカに含まれる論理クロック値以上になったものとする。この場合、データ処理部１９が、確定クロック値格納部１５７に格納されている系全体の確定クロック値と、マーカ格納部２０に格納されている第１のマーカに含まれる論理クロック値とを比較し、系全体の確定クロック値が、マーカに含まれる論理クロック値以上になったものと判断する。ここでは、系全体の確定クロック値が７になったものとする。そうすると、データ処理部１９が、データベース１８内の記憶領域において、第１のマーカに含まれる論理クロック値以下の論理クロック値を含む履歴要素を特定し、特定した履歴要素から、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定（もしくは計算）する。図３４（ｃ）に示すように、レコードＡについては、記憶領域Ａにおいて、｛４，ｔ＝４｝、｛５，ｔ＝５｝の２つの履歴要素が特定され、この２つの履歴要素から、ｔ＝７の時点におけるキーＡのデータ値は５と特定される。また、レコードＢについては、記憶領域Ｂにおいて、｛１３，ｔ＝３｝、｛１４，ｔ＝６｝の２つの履歴要素が特定され、この２つの履歴要素から、ｔ＝７の時点におけるキーＢのデータ値は１４と特定される。さらに、レコードＣについては、記憶領域Ｃにおいて、｛２２，ｔ＝２｝、｛２４，ｔ＝６｝の２つの履歴要素が特定され、この２つの履歴要素から、ｔ＝７の時点におけるキーＣのデータ値は２４と特定される。そして、データ処理部１９は、第１のマーカに含まれる論理クロック値と、特定（もしくは計算）されたデータ値とを含む第２のマーカをデータベース１８内の各記憶領域に登録する。ここでは、記憶領域Ａには、第２のマーカ｛５，ｔ＝７｝が登録され、記憶領域Ｂには、第２のマーカ｛１４，ｔ＝７｝が登録され、記憶領域Ｃには、第２のマーカ｛２４，ｔ＝７｝が登録される。そして、データ処理部１９は、各記憶領域から、第２のマーカに含まれる論理クロック値以下の論理クロック値を含む履歴要素を削除する。第２のマーカが登録された後であれば、第２のマーカに含まれる論理クロック値以下の論理クロック値を含む履歴要素を削除しても問題ないためである。また、データ処理部１９は、マーカ格納部２０から第１のマーカを削除する。第２のマーカを各記憶領域に登録し、第２のマーカに含まれる論理クロック値以下の論理クロック値を含む履歴要素を各記憶領域から削除し、マーカ格納部２０から第１のマーカを削除すると、各記憶領域の内容は、図３４（ｄ）に示すような内容となる。図３４（ｄ）において、記憶領域Ａには、第２のマーカ｛５，ｔ＝７｝のみが蓄積されている。また、記憶領域Ｂには、第２のマーカ｛１４，ｔ＝７｝と履歴要素｛１５，ｔ＝８｝とが蓄積されている。さらに、記憶領域Ｃには、第２のマーカ｛２４，ｔ＝７｝と履歴要素｛２５，ｔ＝９｝とが蓄積されている。
【０１１０】
なお、本実施の形態におけるノード装置の処理フローは、基本的には第３の実施の形態で説明したものと同じであるが、本実施の形態では、ステップＳ５３（図２９）において、図３０に示したコマンド受信処理の代わりに、図３５に示すような処理（以下、コマンド受信処理２と呼ぶ）を実施する。また、本実施の形態では、図３１に示した処理の代わりに、図３６に示すような処理を実施する。以下、図３５及び図３６の処理フローについて説明する。
【０１１１】
最初に、コマンド受信処理２（図３５）の処理フローについて説明する。まず、メッセージ処理部１７が、受信したコマンドが削除コマンドであるか判断する（図３５：ステップＳ１１１）。受信したコマンドが削除コマンドでなければ（ステップＳ１１１：Ｎｏルート）、メッセージ処理部１７の履歴登録部１７１が、タイムスタンプに従って、受信したコマンドに係る履歴要素をデータベース１８内の該当する記憶領域に登録する（ステップＳ１１３）。その後、処理を終了し、元の処理に戻る。なお、ステップＳ１１１及びステップＳ１１３の処理は、ステップＳ６１及びステップＳ６３（図３０）の処理と同じである。
【０１１２】
一方、受信したコマンドが削除コマンドであると判断された場合（ステップＳ１１１：Ｙｅｓルート）、履歴登録部１７１は、第１のマーカがマーカ格納部２０に登録されているか判断する（ステップＳ１１５）。第１のマーカがマーカ格納部２０に登録されていなければ（ステップＳ１１５：Ｎｏルート）、履歴登録部１７１は、該当する記憶領域内のデータ（すなわち、履歴要素）を削除する（ステップＳ１１７）。すなわち、削除コマンドで指定されたレコードに対応する記憶領域内のデータを削除する。その後、処理を終了し、元の処理に戻る。
【０１１３】
一方、マーカ格納部２０に第１のマーカが登録されている場合には（ステップＳ１１５：Ｙｅｓルート）、履歴登録部１７１は、削除コマンドに係る履歴要素を該当する記憶領域に登録する（ステップＳ１１９）。その後、処理を終了し、元の処理に戻る。
【０１１４】
次に、図３６に示す処理フローについて説明する。なお、図３６は、クロックリスト受信時の処理フローを示す。まず、確定クロック処理部１５のクロックリスト受信部１５１が、他のノード装置からのクロックリストを受信し（図３６：ステップＳ１２１）、受信したクロックリストを確定クロック管理部１５３に出力する。そして、確定クロック管理部１５３は、クロックリスト受信部１５１からクロックリストを受信すると、確定クロック値特定処理を実施する（ステップＳ１２３）。なお、確定クロック値特定処理が実施されると、系全体の確定クロック値が特定され、確定クロック値格納部１５７に格納される。確定クロック値特定処理は、第１の実施の形態で説明した処理と同じであるため、ここでは、詳細な説明は省略する。
【０１１５】
その後、データ処理部１９が、確定クロック値格納部１５７に格納されているデータを用いて、系全体の確定クロック値が、前回処理時から変化しているか判断する（ステップＳ１２５）。例えば本ステップの処理を前回実施した時点における系全体の確定クロック値を保持しておき、現時点の系全体の確定クロック値と前回処理時の系全体の確定クロック値とを比較することで、系全体の確定クロック値に変化があったかどうか判断する。系全体の確定クロック値が前回処理時から変化していなければ（ステップＳ１２５：Ｎｏルート）、以下で説明する処理をスキップし、処理を終了する。なお、ステップＳ１２１乃至ステップＳ１２５の処理は、ステップＳ８１乃至ステップＳ８５（図３１）の処理と同じである。
【０１１６】
一方、系全体の確定クロック値が前回処理時から変化している場合（ステップＳ１２５：Ｙｅｓルート）、データ処理部１９は、確定クロック値格納部１５７とマーカ格納部２０とに格納されているデータを用いて、系全体の確定クロック値が第１マーカに含まれる論理クロック値以上になったか判断する（ステップＳ１２７）。本ステップの処理は、基本的にはステップＳ８７（図３１）の処理と同じであるが、本実施の形態では、マーカ格納部２０に第１のマーカが格納されるため、本ステップでは、データベース１８ではなく、マーカ格納部２０に格納されているデータを用いる。
【０１１７】
系全体の確定クロック値が第１マーカに含まれる論理クロック値未満である場合（ステップＳ１２７：Ｎｏルート）、処理はステップＳ１２９に移行する。そして、データ処理部１９は、データベース１８に格納されているデータを用いて、系全体の確定クロック値の示す時刻におけるデータ値を特定又は計算する（ステップＳ１２９）。そして、データ処理部１９は、データベース１８内の記憶領域から、系全体の確定クロック値の示す時刻におけるデータ値を含む履歴要素より古い履歴要素を削除する（ステップＳ１３１）。その後、処理を終了する。なお、ステップＳ１２９及びステップＳ１３１の処理は、ステップＳ８９及びステップＳ９１（図３１）の処理と同じである。
【０１１８】
一方、系全体の確定クロック値が第１のマーカに含まれる論理クロック値以上になった場合（ステップＳ１２７：Ｙｅｓルート）、処理はステップＳ１３３に移行する。そして、データ処理部１９は、データベース１８とマーカ格納部２０とに格納されているデータを用いて、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定又は計算する（ステップＳ１３３）。具体的には、図３４（ｃ）で説明したように、データベース１８内の記憶領域において、第１のマーカに含まれる論理クロック値以下の論理クロック値を含む履歴要素を特定し、特定した履歴要素から、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定又は計算する。なお、ノード装置が担当しているレコードが複数ある場合には、レコード毎に、第１のマーカに含まれる論理クロック値の示す時刻におけるデータ値を特定又は計算する。そして、データ処理部１９は、特定又は計算されたデータ値と、第１のマーカに含まれる論理クロック値とを含む第２のマーカを、データベース１８内の記憶領域に登録するとともに、その第１のマーカをマーカ格納部２０から削除する（ステップＳ１３５）。なお、ノード装置が担当しているレコードが複数ある場合には、データベース１８内にレコード数分の記憶領域が確保されていることになるので、各記憶領域に第２のマーカを登録する。この場合、ステップＳ１３３においてレコード毎にデータ値が特定又は計算されるので、例えばレコードＡの記憶領域には、レコードＡに係るデータ値を含む第２のマーカを登録し、レコードＢの記憶領域には、レコードＢに係るデータ値を含む第２のマーカを登録する。そして、データ処理部１９は、データベース１８に格納されているデータを用いて、系全体の確定クロック値の示す時刻におけるデータ値を特定又は計算する（ステップＳ１３７）。そして、データ処理部１９は、データベース１８内の記憶領域から、系全体の確定クロック値の示す時刻におけるデータ値を含む履歴要素より古い履歴要素を削除する（ステップＳ１３９）。
【０１１９】
そして、データ処理部１９は、データベース１８内の記憶領域に蓄積されている第２のマーカに参照要求の要求元の情報が含まれているか判断する（ステップＳ１４１）。第２のマーカに参照要求の要求元の情報が含まれていなければ（ステップＳ１４１：Ｎｏルート）、以下で説明するステップＳ１４３をスキップし、処理を終了する。この場合、第２のマーカは、データ値を参照要求の要求元に送信するまでは少なくとも保持される。
【０１２０】
一方、第２のマーカに参照要求の要求元の情報が含まれている場合（ステップＳ１４１：Ｙｅｓルート）、データ処理部１９は、その第２のマーカに含まれるデータ値を送信するようメッセージ送信部１３に指示する。そして、メッセージ送信部１３は、データ処理部１９からの指示に応じて、データベース１８内の記憶領域において、参照要求の要求元の情報を含む第２のマーカを特定し、特定した第２のマーカに含まれるデータ値を参照要求の要求元に送信し、特定した第２のマーカをデータベース１８内の記憶領域から削除する（ステップＳ１４３）。なお、ステップＳ１４３では、第２のマーカを削除しないようにし、以降の任意のタイミングで削除するようにしてもよい。その後、処理を終了する。なお、ステップＳ１３７乃至ステップＳ１４３の処理は、ステップＳ９７乃至ステップＳ１０３（図３１）の処理と同じである。
【０１２１】
以上のような処理を実施することによって、履歴要素を蓄積するための記憶領域とは別の領域で第１のマーカを管理するようにしても、第３の実施の形態と同様に、特定の論理クロック値の示す時刻におけるデータ値を把握できるようになる。
【０１２２】
以上本発明の本実施の形態について説明したが、本発明はこれに限定されるものではない。例えば図８、図１６、図２１及び図３２に示したノード装置の機能ブロック図は一例であって必ずしも実際のプログラムモジュール構成と一致しない場合もある。データ格納部の構成も同様に一例にすぎない。また、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしてもよい。
【０１２３】
なお、上で述べたノード装置は、コンピュータ装置によって実現することもできる。例えば、図３７に示すように、メモリ２５０１とプロセッサ（ＣＰＵ２５０３）とハードディスク・ドライブ（ＨＤＤ）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とを備え、これらがバス２５１９を介して接続されたコンピュータを用いてもよい。オペレーティング・システム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５等の記憶部に格納しておき、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出して利用することもできる。必要に応じてＣＰＵ２５０３は、表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、必要な動作を行ってもよい。また、処理途中のデータについては、メモリ２５０１に格納され、必要があればＨＤＤ２５０５に格納してもよい。実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされてもよい。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及び必要なアプリケーション・プログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。なお、図８のデータベース１６は、図３７におけるメモリ２５０１やＨＤＤ２５０５等として実現してもよい。図８、図２１及び図３２のコマンドリスト格納部１４１及び確定クロック値格納部１５７と、図１６の第１記憶部１５０５及び第２記憶部１５０７と、図２１及び図３２のデータベース１８と、図３２のマーカ格納部２０とについても同様である。図１６の履歴要素登録部１５０１、マーカ登録部１５０３及びデータ特定部１５０９は、プロセッサ２５０３及びプログラムの組み合わせ、すなわち、プロセッサ２５０３がプログラムを実行することにより実現してもよい。より具体的には、プロセッサ２５０３は、ＨＤＤ２５０５又はメモリ２５０１に記憶されたプログラムに従った動作を行うことで、上で述べたような処理部として機能してもよい。図８、図２１又は図３２のメッセージ受信部１１、メッセージ処理部１２、メッセージ送信部１３、コマンドリスト管理部１４、確定クロック処理部１５、メッセージ処理部１７、データ処理部１９、クロックリスト受信部１５１、確定クロック管理部１５３、クロックリスト送信部１５５、履歴登録部１７１及びマーカ登録部１７３についても同様である。
【０１２４】
以上述べた本実施の形態をまとめると、以下のようになる。
【０１２５】
本データ管理方法は、複数のキーの各々に対応するデータ値を管理するノード装置により実行されるデータ管理方法である。そして、本データ管理方法は、複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻におけるデータ値又は所定のコマンドの情報とを含む履歴要素を第１記憶部に登録する履歴要素登録ステップと、特定の論理クロック値の示す時刻におけるデータ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の論理クロック値又は当該参照要求で指定された論理クロック値を特定の論理クロック値として含み且つ当該参照要求の情報を含む第１マーカを、第１記憶部又は当該第１記憶部とは異なる第２記憶部に登録するマーカ登録ステップと、ノード装置が属するシステム全体における確定クロック値が、第１記憶部又は第２記憶部内の第１マーカに含まれる特定の論理クロック値以上になった場合には、第１記憶部において特定の論理クロック値以下である論理クロック値を含む履歴要素から、特定の論理クロック値の示す時刻における、担当キーに対応するデータ値を特定するデータ特定ステップとを含む。
【０１２６】
このように、第１マーカを登録しておくことで、分散処理システム全体における確定クロック値が、第１マーカに含まれる特定の論理クロック値以上になったか否かによって、特定の論理クロック値の示す時刻におけるデータ値が確定したか否かを判断できるようになる。そして、特定の論理クロック値の示す時刻まで確定した場合には、特定の論理クロック値の示す時刻におけるデータ値が、適切な履歴要素から特定される。これにより、特定の論理クロック値の示す時刻におけるデータ値を把握できるようになる。
【０１２７】
また、本データ管理方法において、データ特定ステップの後、第１記憶部から、第１マーカに含まれる特定の論理クロック値以下である論理クロック値を含む履歴要素を削除するステップをさらに含むようにしてもよい。第１マーカに含まれる特定の論理クロック値の示す時刻におけるデータ値を特定した後であれば、特定の論理クロック値以下である論理クロック値を含む履歴要素を削除しても問題ないためである。
【０１２８】
さらに、所定のコマンドがデータを削除するための削除コマンドであった場合、第１マーカが第１記憶部又は第２記憶部に登録されているか判断し、登録されている場合には、データ特定ステップにおいて当該第１マーカに含まれる特定の論理クロック値の示す時刻におけるデータ値が特定されるまで、第１記憶部内の履歴要素を保持するようにしてもよい。このようにすれば、削除コマンドを受けた場合であっても、第１マーカが登録されていれば、履歴要素は削除されないため、上で述べたように、第１マーカに含まれる特定の論理クロック値の示す時刻におけるデータ値を特定できる。
【０１２９】
また、本データ管理方法において、データ特定ステップの後、データ特定ステップにおいて特定されたデータ値を参照要求の送信元に送信するステップをさらに含むようにしてもよい。このように、各ノード装置が、特定したデータ値を参照要求の送信元に返すようにすれば、特定の論理クロック値の示す時刻における複数のデータ値を容易に収集することができる。
【０１３０】
さらに、上で述べたデータ特定ステップが、第１マーカが第１記憶部に登録されている場合には、当該第１マーカに、特定の論理クロック値の示す時刻における、担当キーに対応するデータ値を設定し、第２マーカとして第１記憶部に格納するステップを含むようにしてもよい。そして、所定のタイミングまで第１記憶部内の第２マーカを保持するようにしてもよい。例えば参照要求に対する応答を直ぐに返さないような場合には、データ値の取得指示があるまでは保持しておくようにする。
【０１３１】
また、上で述べたデータ特定ステップが、第１マーカが第２記憶部に登録されている場合には、当該第１マーカに含まれる特定の論理クロック値と、特定の論理クロック値の示す時刻における、担当キーに対応するデータ値とを含む第２マーカを第１記憶部に登録するステップを含むようにしてもよい。そして、所定のタイミングまで第１記憶部内の第２マーカを保持するようにしてもよい。なお、第２マーカを登録した後、第１マーカは第１記憶部から削除するようにしてもよい。
【０１３２】
さらに、上で述べた履歴要素登録ステップにおいて、第１記憶部において当該担当キーに係る履歴要素を論理クロック値の順に蓄積し、上で述べたマーカ登録ステップにおいて、第１マーカを第１記憶部に登録する際には、第１記憶部において蓄積されている履歴要素に対して、第１マーカに含まれる特定の論理クロック値から特定される位置に当該第１マーカを挿入するようにしてもよい。このように、論理クロック値の順に蓄積しておくことによって、第１マーカに含まれる特定の論理クロック値以下である論理クロック値を含む要素履歴を容易に特定できるようになり、データの管理も容易になる。
【０１３３】
本ノード装置は、複数のキーの各々に対応するデータ値を管理するノード装置であって、複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻におけるデータ値又は所定のコマンドの情報とを含む履歴要素を第１記憶部に登録する履歴要素登録部と、特定の論理クロック値の示す時刻におけるデータ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の論理クロック値又は当該参照要求で指定された論理クロック値を特定の論理クロック値として含み且つ当該参照要求の情報を含む第１マーカを、第１記憶部又は当該第１記憶部とは異なる第２記憶部に登録するマーカ登録部と、ノード装置が属するシステム全体における確定クロック値が、第１記憶部又は第２記憶部内の第１マーカに含まれる特定の論理クロック値以上になった場合には、第１記憶部において特定の論理クロック値以下である論理クロック値を含む履歴要素から、特定の論理クロック値の示す時刻における、担当キーに対応するデータ値を特定するデータ特定部とを有する。
【０１３４】
なお、上で述べたような処理をコンピュータに実施させるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブル・ディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ（例えばＲＯＭ）、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。なお、処理途中のデータについては、ＲＡＭ等の記憶装置に一時保管される。
【０１３５】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０１３６】
（付記１）
複数のキーの各々に対応するデータ値を管理するノード装置に、
前記複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻における前記データ値又は前記所定のコマンドの情報とを含む履歴要素を第１記憶部に登録する履歴要素登録ステップと、
特定の論理クロック値の示す時刻における前記データ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の前記論理クロック値又は当該参照要求で指定された前記論理クロック値を前記特定の論理クロック値として含み且つ当該参照要求の情報を含む第１マーカを、前記第１記憶部又は当該第１記憶部とは異なる第２記憶部に登録するマーカ登録ステップと、
前記ノード装置が属するシステム全体における確定クロック値が、前記第１記憶部又は前記第２記憶部内の前記第１マーカに含まれる前記特定の論理クロック値以上になった場合には、前記第１記憶部において前記特定の論理クロック値以下である論理クロック値を含む前記履歴要素から、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値を特定するデータ特定ステップと、
を実行させるためのデータ管理プログラム。
【０１３７】
（付記２）
前記データ特定ステップの後、前記第１記憶部から、前記第１マーカに含まれる前記特定の論理クロック値以下である論理クロック値を含む前記履歴要素を削除するステップ
をさらに含む付記１記載のデータ管理プログラム。
【０１３８】
（付記３）
前記所定のコマンドがデータを削除するための削除コマンドであった場合、前記第１マーカが前記第１記憶部又は前記第２記憶部に登録されているか判断し、登録されている場合には、前記データ特定ステップにおいて当該第１マーカに含まれる前記特定の論理クロック値の示す時刻における前記データ値が特定されるまで、前記第１記憶部内の前記履歴要素を保持する
付記１又は２記載のデータ管理プログラム。
【０１３９】
（付記４）
前記データ特定ステップの後、前記データ特定ステップにおいて特定された前記データ値を前記参照要求の送信元に送信するステップ
をさらに含む付記１乃至３のいずれか１つ記載のデータ管理プログラム。
【０１４０】
（付記５）
前記データ特定ステップが、
前記第１マーカが前記第１記憶部に登録されている場合には、当該第１マーカに、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値を設定し、第２マーカとして前記第１記憶部に格納するステップ
を含み、
所定のタイミングまで前記第１記憶部内の前記第２マーカを保持する
付記１乃至３のいずれか１つ記載のデータ管理プログラム。
【０１４１】
（付記６）
前記データ特定ステップが、
前記第１マーカが前記第２記憶部に登録されている場合には、当該第１マーカに含まれる前記特定の論理クロック値と、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値とを含む第２マーカを前記第１記憶部に登録するステップ
を含み、
所定のタイミングまで前記第１記憶部内の前記第２マーカを保持する
付記１乃至３のいずれか１つ記載のデータ管理プログラム。
【０１４２】
（付記７）
前記履歴要素登録ステップにおいて、前記第１記憶部において当該担当キーに係る前記履歴要素を前記論理クロック値の順に蓄積し、
前記マーカ登録ステップにおいて、前記第１マーカを前記第１記憶部に登録する際には、前記第１記憶部において蓄積されている前記履歴要素に対して、前記第１マーカに含まれる前記特定の論理クロック値から特定される位置に当該第１マーカを挿入する
付記５記載のデータ管理プログラム。
【０１４３】
（付記８）
複数のキーの各々に対応するデータ値を管理するノード装置により実行されるデータ管理方法であって、
前記複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻における前記データ値又は前記所定のコマンドの情報とを含む履歴要素を第１記憶部に登録する履歴要素登録ステップと、
特定の論理クロック値の示す時刻における前記データ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の前記論理クロック値又は当該参照要求で指定された前記論理クロック値を前記特定の論理クロック値として含み且つ当該参照要求の情報を含む第１マーカを、前記第１記憶部又は当該第１記憶部とは異なる第２記憶部に登録するマーカ登録ステップと、
前記ノード装置が属するシステム全体における確定クロック値が、前記第１記憶部又は前記第２記憶部内の前記第１マーカに含まれる前記特定の論理クロック値以上になった場合には、前記第１記憶部において前記特定の論理クロック値以下である論理クロック値を含む前記履歴要素から、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値を特定するデータ特定ステップと、
を含むデータ管理方法。
【０１４４】
（付記９）
複数のキーの各々に対応するデータ値を管理するノード装置であって、
前記複数のキーのうち担当するキーである担当キーに係る所定のコマンドを受け付けた場合、当該所定のコマンドを受け付けた時点の論理クロック値と当該論理クロック値の示す時刻における前記データ値又は前記所定のコマンドの情報とを含む履歴要素を第１記憶部に登録する履歴要素登録部と、
特定の論理クロック値の示す時刻における前記データ値を参照するための参照要求を受け付けた場合、当該参照要求を受け付けた時点の前記論理クロック値又は当該参照要求で指定された前記論理クロック値を前記特定の論理クロック値として含み且つ当該参照要求の情報を含む第１マーカを、前記第１記憶部又は当該第１記憶部とは異なる第２記憶部に登録するマーカ登録部と、
前記ノード装置が属するシステム全体における確定クロック値が、前記第１記憶部又は前記第２記憶部内の前記第１マーカに含まれる前記特定の論理クロック値以上になった場合には、前記第１記憶部において前記特定の論理クロック値以下である論理クロック値を含む前記履歴要素から、前記特定の論理クロック値の示す時刻における、前記担当キーに対応する前記データ値を特定するデータ特定部と、
を有するノード装置。
【符号の説明】
【０１４５】
１  ネットワーク
１１  メッセージ受信部    １２，１７  メッセージ処理部
１３  メッセージ送信部    １４  コマンドリスト管理部
１５  確定クロック処理部    １６，１８  データベース
１９  データ処理部    ２０  マーカ格納部
１００  分散処理システム    １４１  コマンドリスト格納部
１５１  クロックリスト受信部    １５３  確定クロック管理部
１５５  クロックリスト送信部    １５７  確定クロック値格納部
１７１  履歴登録部    １７３  マーカ登録部
【図１】
0005488178.tif 000002
【図２】
0005488178.tif 000003
【図３】
0005488178.tif 000004
【図４】
0005488178.tif 000005
【図５】
0005488178.tif 000006
【図６】
0005488178.tif 000007
【図７】
0005488178.tif 000008
【図８】
0005488178.tif 000009
【図９】
0005488178.tif 000010
【図１０】
0005488178.tif 000011
【図１１】
0005488178.tif 000012
【図１２】
0005488178.tif 000013
【図１３】
0005488178.tif 000014
【図１４】
0005488178.tif 000015
【図１５】
0005488178.tif 000016
【図１６】
0005488178.tif 000017
【図１７】
0005488178.tif 000018
【図１８】
0005488178.tif 000019
【図１９】
0005488178.tif 000020
【図２０】
0005488178.tif 000021
【図２１】
0005488178.tif 000022
【図２２】
0005488178.tif 000023
【図２３】
0005488178.tif 000024
【図２４】
0005488178.tif 000025
【図２５】
0005488178.tif 000026
【図２６】
0005488178.tif 000027
【図２７】
0005488178.tif 000028
【図２８】
0005488178.tif 000029
【図２９】
0005488178.tif 000030
【図３０】
0005488178.tif 000031
【図３１】
0005488178.tif 000032
【図３２】
0005488178.tif 000033
【図３３】
0005488178.tif 000034
【図３４】
0005488178.tif 000035
【図３５】
0005488178.tif 000036
【図３６】
0005488178.tif 000037
【図３７】
0005488178.tif 000038