(57)【要約】【課題】順序が入れ替わらないことを保証する複数の処理にかかる時間の短縮化を図ること。【解決手段】時刻ｔ０において、クライアントＫは、非同期実行によるＲＰＣにより、処理１の処理要求を分散処理装置１０１−１に送信する。次に、時刻ｔ１において、分散処理装置１０１−１は、処理１の処理要求を受け付けると、順序情報１１１に、処理１を最初に受け付けたことを記憶するとともに、分散処理装置１０１−２に、非同期実行による子ＲＰＣにより、処理１を実行させる。時刻ｔ３において、分散処理装置１０１−１は、処理２を完了すると、処理２の処理結果をクライアントＫに送信するか判断する。時刻ｔ３の時点では、順序情報１１１が示す処理２の前の処理１の処理結果を送信していないため、分散処理装置１０１−１は、処理２の処理結果を送信せずに待機する。【選択図】図１
2015210791.tif 000002
【特許請求の範囲】
【請求項１】
要求元装置から複数の処理の各々の処理の処理要求を順次受け付けて自装置または他装置のいずれかに前記各々の処理を実行させる際に、前記各々の処理の処理要求を前記要求元装置から受け付けた順序を示す順序情報を記憶し、
前記自装置または前記他装置のいずれかが前記各々の処理を完了したことに応じて、前記各々の処理の処理結果を前記順序情報が示す順序に従って前記要求元装置に送信する、
制御部を有することを特徴とする分散処理装置。
【請求項２】
前記制御部は、
前記各々の処理の処理要求を受け付けた場合、前記順序情報により特定される前記各々の処理の前の処理を実行させている装置と、前記各々の処理を実行させる装置とが同一であれば、当該装置に前記各々の処理の処理要求を送信することを特徴とする請求項１に記載の分散処理装置。
【請求項３】
前記制御部は、
前記各々の処理の処理要求を受け付けた場合、前記順序情報により特定される前記各々の処理の前の処理を分散した部分処理を実行させている１つの装置と、前記各々の処理を分散して実行させる装置群のうちの先頭に実行させる装置とが同一であれば、前記１つの装置に前記各々の処理を分散した部分処理の処理要求を送信することを特徴とする請求項１または２に記載の分散処理装置。
【請求項４】
前記制御部は、
前記各々の処理の処理要求を受け付けた場合、前記順序情報により特定される前記各々の処理の前の処理を分散して実行させている、または実行させる第１の装置群と、前記各々の処理を分散して実行させる第２の装置群との両方に含まれる装置がなければ、前記第２の装置群に前記各々の処理を分散した部分処理の処理要求を送信することを特徴とする請求項１〜３のいずれか一つに記載の分散処理装置。
【請求項５】
前記制御部は、
データが送信された順序に従って前記データを受け付けることを保証する通信プロトコルを用いて前記各々の処理の処理要求を前記他装置に送信することにより、前記各々の処理を前記他装置に実行させることを特徴とする請求項１〜４のいずれか一つに記載の分散処理装置。
【請求項６】
複数の装置を含む分散処理システムであって、
前記複数の装置のうちのいずれかの装置は、
要求元装置から複数の処理の各々の処理の処理要求を順次受け付けて前記複数の装置のうちのいずれかに前記各々の処理を実行させる際に、前記各々の処理の処理要求を前記要求元装置から受け付けた順序を示す順序情報を記憶し、
前記複数の装置のうちのいずれかが前記各々の処理を完了したことに応じて、前記各々の処理の処理結果を前記順序情報が示す順序に従って前記要求元装置に送信する、
ことを特徴とする分散処理システム。
【請求項７】
コンピュータに、
要求元装置から複数の処理の各々の処理の処理要求を順次受け付けて前記コンピュータまたは他装置のいずれかに前記各々の処理を実行させる際に、前記各々の処理の処理要求を前記要求元装置から受け付けた順序を示す順序情報を記憶し、
前記コンピュータまたは前記他装置のいずれかが前記各々の処理を完了したことに応じて、前記各々の処理の処理結果を前記順序情報が示す順序に従って前記要求元装置に送信する、
処理を実行させることを特徴とする分散処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分散処理装置、分散処理システム、および分散処理プログラムに関する。
【背景技術】
【０００２】
従来、ある装置上で動作するプロセスが、他の装置に処理を実行させるＲＰＣ（Ｒｅｍｏｔｅ  Ｐｒｏｃｅｄｕｒｅ  Ｃａｌｌ）と呼ばれる技術がある。また、ＲＰＣを用いて、複数の装置に処理を分散させる技術がある。ＲＰＣには、同期実行と非同期実行とがある。同期実行を行う場合、複数の処理の処理要求を送信する要求元装置は、複数の処理のうちのいずれかの処理の処理要求を、処理要求の要求先装置に送信し、いずれかの処理の処理結果を要求先装置から受け取った後、いずれかの処理の次の処理の処理要求を送信する。一方、非同期実行を行う場合、要求元装置は、いずれかの処理の処理要求を要求先装置に送信し、いずれかの処理の処理結果を要求先装置から受け取るのを確認することなく、次の処理の処理要求をある装置に送信する。
【０００３】
関連する先行技術として、例えば、要求元装置からＲＰＣ要求を受けると、リソースを確保しＲＰＣ処理をする非同期処理を起動するとともにＲＰＣ応答を抑止し、非同期処理が終了したら再度リソースを確保し抑止した応答を要求元装置へ送信するものがある。また、ＲＰＣがネスト形式になっている場合、エラーを発見したノードが、最初の要求元装置と途中のノードに直接エラーを報告する技術がある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００６−１８５２２９号公報
【特許文献２】特開平７−６１３９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、従来技術によれば、複数の処理の順序が入れ替わらないことを保証しつつ、複数の処理の実行にかかる時間を短縮することが難しい。具体的には、例えば、同期実行を行うと、複数の処理の順序が入れ替わらないことを保証できるが、ある処理の処理結果を受け取るまで待つために時間がかかる。また、非同期実行を行うと、複数の処理の実行にかかる時間を短縮することができるが、ある処理と後続の処理の順序が入れ替わってしまう場合があるし、また、後続の処理結果を先行処理の処理結果より先に受け取る恐れがある。
【０００６】
１つの側面では、本発明は、順序が入れ替わらないことを保証する複数の処理にかかる時間を短縮化できる分散処理装置、分散処理システム、および分散処理プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一側面によれば、要求元装置から複数の処理の各々の処理の処理要求を順次受け付けて自装置または他装置のいずれかに各々の処理を実行させる際に、各々の処理の処理要求を要求元装置から受け付けた順序を示す順序情報を記憶し、自装置または他装置のいずれかが各々の処理を完了したことに応じて、各々の処理の処理結果を順序情報が示す順序に従って要求元装置に送信する分散処理装置、分散処理システム、および分散処理プログラムが提案される。
【発明の効果】
【０００８】
本発明の一態様によれば、順序が入れ替わらないことを保証する複数の処理にかかる時間の短縮化を図ることができるという効果を奏する。
【図面の簡単な説明】
【０００９】
【図１】図１は、分散処理システム１００の動作例を示す説明図である。
【図２】図２は、分散処理システム２００の接続例を示す説明図である。
【図３】図３は、ノードＡのハードウェア構成例を示すブロック図である。
【図４】図４は、ノードＡの機能構成例を示すブロック図である。
【図５】図５は、同一宛先におけるＲＰＣ呼び出しの送信例を示す説明図である。
【図６】図６は、多段のＲＰＣの送信例を示す説明図である。
【図７】図７は、経路情報の一例を示す説明図である。
【図８】図８は、セション実行ユニットの処理内容の一例を示す説明図である。
【図９】図９は、メッセージのフォーマットの一例を示す説明図である。
【図１０】図１０は、レスポンスのフォーマットの一例を示す説明図である。
【図１１】図１１は、メッセージ管理表の記憶内容の一例を示す説明図である。
【図１２】図１２は、送信待機表の記憶内容の一例を示す説明図である。
【図１３】図１３は、２層階層におけるクライアントとサーバとの関係の一例を示す説明図である。
【図１４】図１４は、２層階層におけるコマンド実行前の初期状態を示す説明図である。
【図１５】図１５は、２層階層におけるコマンド実行開始後の時刻０の状態を示す説明図である。
【図１６】図１６は、２層階層におけるコマンド実行開始後の時刻１の状態を示す説明図である。
【図１７】図１７は、２層階層におけるコマンド実行開始後の時刻２の状態を示す説明図である。
【図１８】図１８は、２層階層におけるコマンド実行開始後の時刻３の状態を示す説明図である。
【図１９】図１９は、２層階層におけるコマンド実行開始後の時刻４の状態を示す説明図である。
【図２０】図２０は、２層階層におけるコマンド実行開始後の時刻５の状態を示す説明図である。
【図２１】図２１は、２層階層におけるコマンド実行開始後の時刻６の状態を示す説明図である。
【図２２】図２２は、２層階層におけるコマンド実行開始後の時刻７の状態を示す説明図である。
【図２３】図２３は、３層階層におけるクライアントとサーバとの関係の一例を示す説明図である。
【図２４】図２４は、３層階層におけるコマンド実行前の初期状態を示す説明図である。
【図２５】図２５は、３層階層におけるコマンド実行開始後の時刻０の状態を示す説明図である。
【図２６】図２６は、３層階層におけるコマンド実行開始後の時刻１の状態を示す説明図である。
【図２７】図２７は、３層階層におけるコマンド実行開始後の時刻２の状態を示す説明図である。
【図２８】図２８は、３層階層におけるコマンド実行開始後の時刻３の状態を示す説明図である。
【図２９】図２９は、３層階層におけるコマンド実行開始後の時刻４の状態を示す説明図である。
【図３０】図３０は、３層階層におけるコマンド実行開始後の時刻５の状態を示す説明図である。
【図３１】図３１は、３層階層におけるコマンド実行開始後の時刻６の状態を示す説明図である。
【図３２】図３２は、３層階層におけるコマンド実行開始後の時刻７の状態を示す説明図である。
【図３３】図３３は、３層階層におけるコマンド実行開始後の時刻８の状態を示す説明図である。
【図３４】図３４は、３層階層におけるコマンド実行開始後の時刻９の状態を示す説明図である。
【図３５】図３５は、３層階層におけるコマンド実行開始後の時刻１０の状態を示す説明図である。
【図３６】図３６は、３層階層におけるコマンド実行開始後の時刻１１の状態を示す説明図である。
【図３７】図３７は、３層階層におけるコマンド実行開始後の時刻１２の状態を示す説明図である。
【図３８】図３８は、３層階層におけるコマンド実行開始後の時刻１３の状態を示す説明図である。
【図３９】図３９は、３層階層におけるコマンド実行開始後の時刻１４の状態を示す説明図である。
【図４０】図４０は、３層階層におけるコマンド実行開始後の時刻１５の状態を示す説明図である。
【図４１】図４１は、３層階層におけるコマンド実行開始後の時刻１６の状態を示す説明図である。
【図４２】図４２は、３層階層におけるコマンド実行開始後の時刻１７の状態を示す説明図である。
【図４３】図４３は、３層階層におけるコマンド実行開始後の時刻１８の状態を示す説明図である。
【図４４】図４４は、３層階層におけるコマンド実行開始後の時刻１９の状態を示す説明図である。
【図４５】図４５は、３層階層におけるコマンド実行開始後の時刻２０の状態を示す説明図である。
【図４６】図４６は、メッセージ送信時における経路情報の判断対象の順序の一例を示す説明図である。
【図４７】図４７は、コマンド実行開始から完了までにかかる時間の比較の一例を示す説明図である。
【図４８】図４８は、メッセージ受信処理手順の一例を示すフローチャートである。
【図４９】図４９は、メッセージ送信処理手順の一例を示すフローチャート（その１）である。
【図５０】図５０は、メッセージ送信処理手順の一例を示すフローチャート（その２）である。
【図５１】図５１は、メッセージ送信処理手順の一例を示すフローチャート（その３）である。
【図５２】図５２は、レスポンス送信処理手順の一例を示すフローチャートである。
【図５３】図５３は、レスポンス受信処理手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下に図面を参照して、開示の分散処理装置、分散処理システム、および分散処理プログラムの実施の形態を詳細に説明する。
【００１１】
（実施の形態１）
図１は、分散処理システム１００の動作例を示す説明図である。図１の（ａ）が示すように、実施の形態１における分散処理システム１００に含まれる分散処理装置１０１−１、１０１−２は、分散処理を実行するコンピュータである。図１に示す分散処理システム１００は、要求された処理を、分散処理装置１０１−１、１０１−２で分散処理するシステムである。分散処理装置１０１−１、１０１−２は、例えば、サーバである。また、分散処理システム１００には、複数の処理要求を分散処理装置１０１−１に送信する要求元装置としてクライアントコンピュータＫが接続される。以下、説明の簡略化のために、クライアントコンピュータＫを、「クライアントＫ」と称する。
【００１２】
分散処理装置１０１−１は、クライアントＫから要求された処理要求を、メッセージ通信を用いて分散処理装置１０１−２に依頼する。メッセージ通信の一例として、ＲＰＣと呼ばれる技術がある。ＲＰＣには、同期実行と非同期実行とがある。同期実行を行う場合、複数の処理の処理要求を順次送信する要求元装置は、複数の処理のうちのいずれかの処理の処理要求を要求先装置に送信し、いずれかの処理の処理結果を要求先装置から受け取った後、いずれかの処理の次の処理の処理要求を送信する。一方、非同期実行を行う場合、要求元装置は、いずれかの処理の処理要求を要求先装置に送信し、いずれかの処理の処理結果を要求先装置から受け取るのを確認することなく、次の処理の処理要求を要求先装置に送信する。
【００１３】
また、分散処理装置１０１−１は、クライアントＫからのＲＰＣを、分散処理装置１０１−２にＲＰＣとして送信する。このように、ＲＰＣ処理から送信されるＲＰＣを、「子ＲＰＣ」と呼称する場合がある。また、分散処理システム１００は、２段のＲＰＣを行う２層階層の分散処理環境である。
【００１４】
ここで、クライアントＫが分散処理システム１００に対して複数のＲＰＣを実行する際に、複数のＲＰＣに依存関係があり、実行順序が決められている場合がある。依存関係がある例としては、１つ目のＲＰＣが分散処理システム１００内のリソースの更新を行い、２つ目のＲＰＣが分散処理システム１００内のリソースの参照を行う場合である。このように、依存関係がある複数のＲＰＣを実行する際には、クライアントＫは、同期実行により複数のＲＰＣを実行することにより、実行順序が変化しないようにする。
【００１５】
しかしながら、同期実行は、ある処理の処理結果を分散処理システムから受け取った後、ある処理の次の処理の処理要求を送信するため、複数の処理にかかる時間が長くなることになる。一方、非同期実行を用いると、同期実行よりも複数の処理にかかる時間が短くなるが、複数の処理の実行順序を保証できなくなる。
【００１６】
そこで、本実施の形態にかかる分散処理装置１０１−１は、クライアントＫから順次受け付けた各ＲＰＣ処理要求の受付順序を記憶し、各ＲＰＣ処理が完了した際に各ＲＰＣ処理の結果を受付順序に従いクライアントＫに送信する。これにより、分散処理装置１０１−１は、複数のＲＰＣ処理の順序を変わらないことを保証しつつ、複数のＲＰＣ処理にかかる時間を短くすることができる。
【００１７】
具体的に、クライアントＫと、分散処理システム１００との処理経過を、図１の（ｂ）を用いて説明する。クライアントＫは、複数の処理として、処理１と処理２とを分散処理装置１０１に実行させる。そして、分散処理装置１０１−２が処理１を実行し、分散処理装置１０１−１が処理２を実行するものとする。ここで、分散処理システム１００内のどの装置がどの処理を実行するかは、クライアントＫが決定してもよいし、クライアントＫのＲＰＣを受けた装置が決定してもよい。
【００１８】
時刻ｔ０において、クライアントＫは、非同期実行によるＲＰＣにより、処理１の処理要求を分散処理装置１０１−１に送信する。次に、時刻ｔ１において、分散処理装置１０１−１は、処理１の処理要求を受け付けると、順序情報１１１に、処理１を最初に受け付けたことを記憶するとともに、分散処理装置１０１−２に、非同期実行による子ＲＰＣにより、処理１を実行させる。また、時刻ｔ１において、クライアントＫは、非同期実行によるＲＰＣにより、処理２の処理要求を分散処理装置１０１−１に送信する。
【００１９】
時刻ｔ２において、分散処理装置１０１−１は、処理２の処理要求を受け付けると、順序情報１１１に、処理１の次に処理２を受け付けたことを記憶し、処理２を実行する。また、時刻ｔ２において、分散処理装置１０１−２は、処理１の処理要求を受け付けると、処理１を実行する。
【００２０】
時刻ｔ３において、分散処理装置１０１−２は、処理１を完了すると、処理結果をＲＰＣの応答として、分散処理装置１０１−１に送信する。また、時刻ｔ３において、分散処理装置１０１−１は、処理２を完了すると、処理２の処理結果をクライアントＫに送信するか判断する。時刻ｔ３の時点では、順序情報１１１が示す処理２の前の処理１の処理結果を送信していないため、分散処理装置１０１−１は、処理２の処理結果を送信せずに待機する。
【００２１】
時刻ｔ４において、分散処理装置１０１−１は、処理１の処理結果を受け付けると、処理１の処理結果をクライアントＫに送信し、続けて、時刻ｔ５において、処理２の処理結果をクライアントＫに送信する。また、時刻ｔ５において、クライアントＫは、処理１の処理結果を受け取り、続けて、時刻ｔ６において、処理２の処理結果を受け取る。このように、分散処理システム１００は、非同期実行によるＲＰＣを用いて、処理１、処理２の順序を変えず、さらに、同期実行を行う場合よりも処理１、処理２にかかる時間を短縮することができる。
【００２２】
（実施の形態２）
次に、図２を用いて、３層以上の階層の分散処理環境で分散処理するシステムについて説明する。
【００２３】
図２は、分散処理システム２００の接続例を示す説明図である。図２に示す分散処理システム２００は、ノードＡ、Ｂ、Ｃ、…、を有する。ノードＡ、Ｂ、Ｃ、…、は、図１に示す分散処理装置１０１に相当する。分散処理システム２００は、ノードＡ、Ｂ、Ｃ、…により３層以上の階層で形成されたコンピュータ群で分散処理するシステムである。ノードＡ、Ｂ、Ｃ、…、は、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）により接続される。また、分散処理システム２００は、ネットワーク２０１を経由してクライアントコンピュータＫと接続する。ノードＡ、Ｂ、Ｃ、は図１に示した分散処理装置１０１に相当する。ノードＡ、Ｂ、Ｃ、…、は、分散処理を実行するコンピュータである。クライアントＫは、分散処理システム２００を利用するコンピュータである。
【００２４】
クライアントＫからＲＰＣ呼び出しを受けたノードＡは、ノードＢに対し子ＲＰＣを送信し、ノードＢは子ＲＰＣを実行中に、ノードＣに対してさらに別のＲＰＣを実行することがある。このように、分散処理システム２００は、子ＲＰＣを拡張した、孫ＲＰＣや、一般化した多段のＲＰＣを行う。すなわち、分散処理システム２００は、３段以上のＲＰＣを行う３層以上の階層の分散処理環境である。
【００２５】
多段のＲＰＣでは、ＲＰＣの送信側、受信側で実行順序を保証することだけでは、安全性を確保できない場合がある。例えば、複数のノードにまたがる分散処理では、グローバルな待ち合わせ機構を用意しないため、２つの処理の実行順序を保証することができなくなる。ここで、グローバルな待ち合わせ機構を用意しても、２つの処理を実行する装置が、グローバルな待ち合わせ機構に対して問い合わせを行うことになり、さまざまな処理が逐次的に処理されてしまい、分散処理の利点が失われることになる。
【００２６】
本実施の形態における分散処理システム２００では、分散処理の利点を失うことなく実行順序を保証するために、下記３つのことを行う。１つ目は、複数のＲＰＣ呼び出しの呼び出し先が、同一である場合に、データが送信された順序に従ってデータを受け付けることを保証する通信プロトコルを用いて、呼び出しの順序を保証することである。同一宛先におけるＲＰＣ呼び出しの送信例については、図５で説明する。２つ目は、多段のＲＰＣを、一連のＲＰＣとして扱うことである。多段のＲＰＣの送信例については、図６で説明する。３つ目は、複数のＲＰＣを実行するノードがある場合に、メッセージ管理表を用いて待ち合わせ制御を行うことである。メッセージ管理表の具体的な記憶内容については、図１１で説明する。
【００２７】
図３は、ノードＡのハードウェア構成例を示すブロック図である。図３において、ノードＡは、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）３０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３０３と、を含む。また、ノードＡは、ディスクドライブ３０４およびディスク３０５と、通信インターフェース３０６と、を含む。また、ＣＰＵ３０１〜通信インターフェース３０６はバス３０７によってそれぞれ接続される。
【００２８】
ＣＰＵ３０１は、ノードＡの全体の制御を司る演算処理装置である。ＲＯＭ３０２は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。ＲＡＭ３０３は、ＣＰＵ３０１のワークエリアとして使用される揮発性メモリである。
【００２９】
ディスクドライブ３０４は、ＣＰＵ３０１の制御に従ってディスク３０５に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ３０４には、例えば、磁気ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク３０５は、ディスクドライブ３０４の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ３０４が磁気ディスクドライブである場合、ディスク３０５には、磁気ディスクを採用することができる。また、ディスクドライブ３０４がソリッドステートドライブである場合、ディスク３０５には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
【００３０】
通信インターフェース３０６は、ネットワークと内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的に、通信インターフェース３０６は、通信回線を通じてネットワークを介して他の装置に接続される。通信インターフェース３０６には、例えば、モデムやＬＡＮアダプタなどを採用することができる。
【００３１】
また、分散処理システム１００の管理者が、ノードＡを直接操作する場合、ノードＡは、ディスプレイ、キーボード、マウスといったハードウェアを有してもよい。また、ノードＢ、Ｃ、…も、ノードＡと同様のハードウェアを有する。クライアントＫは、ノードＡが有するハードウェアに加え、ディスプレイ、キーボード、マウスといったハードウェアを有する。
【００３２】
（ノードＡの機能構成例）
図４は、ノードＡの機能構成例を示すブロック図である。ノードＡは、制御部４００を有する。制御部４００は、記憶部４０１と、送信部４０２とを含む。制御部４００は、記憶装置に記憶されたプログラムをＣＰＵ３０１が実行することにより、制御部４００の機能を実現する。記憶装置とは、具体的には、例えば、図３に示したＲＯＭ３０２、ＲＡＭ３０３、ディスク３０５などである。また、各部の処理結果は、ＣＰＵ３０１が有するレジスタや、ＲＡＭ３０３等に記憶される。
【００３３】
記憶部４０１は、クライアントＫから複数の処理の各々の処理の処理要求を順次受け付けて自装置となるノードＡまたは他装置となるノードＢ、Ｃ、…のいずれかに各々の処理を実行させる際に、順序情報１１１を記憶する。順序情報１１１は、各々の処理の処理要求をクライアントＫから受け付けた順序を示す情報である。
【００３４】
送信部４０２は、ノードＡまたはノードＢ、Ｃ、…のいずれかが各々の処理を完了したことに応じて、各々の処理の処理結果を順序情報１１１が示す順序に従ってクライアントＫに送信する。具体的には、送信部４０２は、順序情報により特定される各々の処理の前の処理が完了していれば、各々の処理の処理結果をクライアントＫに送信する。一方、送信部４０２は、前の処理が完了していなければ、前の処理が完了して前の処理の処理結果をクライアントＫに送信した後に、各々の処理の処理結果をクライアントＫに送信する。
【００３５】
また、送信部４０２は、各々の処理の処理要求を受け付けた場合、順序情報１１１により特定される各々の処理の前の処理を実行させているノードと、各々の処理を実行させるノードとが同一であれば、前述のノードに各々の処理の処理要求を送信してもよい。処理を実行させているノードと、処理を実行させるノードとの詳細については、図１１で示す。
【００３６】
また、ノードＡが各々の処理の処理要求を受け付けたとする。この場合、送信部４０２は、順序情報１１１により特定される各々の処理の前の処理を分散した部分処理を実行させている１つのノードと、各々の処理を分散して実行させるノード群のうちの先頭に実行させるノードとが同一かを判断する。同一であれば、送信部４０２は、前述のノードに各々の処理を分散した部分処理の処理要求を送信してもよい。
【００３７】
また、ノードＡが各々の処理の処理要求を受け付けたとする。この場合、送信部４０２は、順序情報１１１により特定される各々の処理の前の処理を分散して実行させている、または実行させる第１のノード群と、各々の処理を分散して実行させる第２のノード群との両方に含まれる装置がないかを判断する。第１のノード群と第２のノード群との両方に含まれるノードがなければ、第２のノード群に各々の処理を分散した部分処理の処理要求を送信してもよい。第１のノード群と第２のノード群との具体例については、図４６で示す。
【００３８】
また、送信部４０２は、データが送信された順序に従ってデータを受け付けることを保証する通信プロトコルを用いて各々の処理の処理要求をノードＢ、Ｃ、…のいずれかに送信することにより、各々の処理をノードＢ、Ｃ、…のいずれかに実行させる。また、制御部４０１は、クライアントＫから複数の処理の各々の処理の処理要求を順次受け付ける際や、各々の処理の処理結果を順序情報１１１が示す順序に従ってクライアントＫに送信する際にも前述の通信プロトコルを用いてもよい。通信プロトコルの具体例は、図５で説明する。
【００３９】
図５は、同一宛先におけるＲＰＣ呼び出しの送信例を示す説明図である。図５では、クライアントＫがＲＰＣの送信側であり、ノードＡがＲＰＣの受信側である場合を例として説明を行う。分散処理システム２００は、同一宛先におけるＲＰＣ呼び出しには、同一である場合に、データが送信された順序に従ってデータを受け付けることを保証する通信プロトコルを用いてＲＰＣ呼び出し、およびＲＰＣレスポンスを行う。以下の説明では、説明の簡略化のため、ＲＰＣ呼び出しを、「メッセージ」と呼称し、ＲＰＣレスポンスは、「レスポンス」と呼称する場合がある。
【００４０】
データが送信された順序に従ってデータを受け付けることを保証する通信プロトコルは、例えば、ＴＣＰ（Ｔｒａｎｓｍｉｓｓｉｏｎ  Ｃｏｎｔｒｏｌ  Ｐｒｏｔｏｃｏｌ）／ＩＰ（Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌ）である。例えば、ＴＣＰには、送信されたデータに付与されたシーケンス番号により、データの順序制御を行うことが定義される。
【００４１】
具体的には、分散処理システム２００の各装置は、前述の通信プロトコルによるセションにより、ＲＰＣ呼び出し、およびＲＰＣレスポンスを送信する。ここで、セションとは、双方向であり、送受信の順序保証のある通信路である。例えば、セションは、ＴＣＰ／ＩＰストリームである。
【００４２】
図５では、ＲＰＣ＿１と、ＲＰＣ＿２という２つのメッセージを送信する例を示す。クライアントＫは、ＲＰＣ＿１と、ＲＰＣ＿２との宛先が同一であるため、一つのセション５０１を用いてＲＰＣ＿１と、ＲＰＣ＿２の送信を行う。具体的には、クライアントＫは、ＲＰＣ＿１のメッセージと、ＲＰＣ＿２のメッセージとを、セション５０１内の送信用ストリーム５０２を用いてノードＡに順次送信する。送信用ストリーム５０２内では順序が保証されるため、ノードＡは、ＲＰＣ＿１のメッセージと、ＲＰＣ＿２のメッセージとを順次受け付けることができる。
【００４３】
また、ノードＡは、ＲＰＣ＿１、ＲＰＣ＿２の本体処理を実行し、ＲＰＣ＿１、ＲＰＣ＿２の本体処理を完了した際に、ＲＰＣ＿１のレスポンスと、ＲＰＣ＿２のレスポンスとを、セション５０１内の受信用ストリーム５０３を用いてクライアントＫに順次送信する。受信用ストリーム５０３内では順序が保証されるため、クライアントＫは、ＲＰＣ＿１のレスポンスと、ＲＰＣ＿２のレスポンスとを順次受け付けることができる。
【００４４】
図６は、多段のＲＰＣの送信例を示す説明図である。分散処理システム２００は、安全な実行順序を保証するために、多段のＲＰＣを１連のＲＰＣとして扱う。図６の例では、クライアントＫから送信されたＲＰＣ（１）から、ＲＰＣ（２）〜（６）が派生する例である。以下の説明では、クライアントＫから送信されたＲＰＣから派生されたＲＰＣ群を、「コマンド」と称する。ここで、ＲＰＣ（１）には、ＲＰＣ（２）〜（６）を処理する対象となるノードＢ〜Ｆを特定する経路情報が含まれる。経路情報については、図７で説明する。また、ＲＰＣ（２）には、ＲＰＣ（３）、（４）を処理する対象となるノードＤ、Ｅを特定する経路情報が含まれる。同様に、ＲＰＣ（５）には、ＲＰＣ（６）を処理する対象となるノードＦを特定する経路情報が含まれる。
【００４５】
図７は、経路情報の一例を示す説明図である。図７の（ａ）が示すように、経路情報は、開始点となるＲＰＣ呼び出し先のノード番号とボディ部とを有する情報である。開始点には、１つのノードが指定される。ボディ部は、ＲＰＣ呼び出し先のノード番号に登録されたノードから、ＲＰＣ呼び出しを行う分の情報を記憶する。ＲＰＣ呼び出し先のノード番号に登録されたノードから呼び出される１つのＲＰＣを、「ステップ」と称する。各ステップには、経路情報が格納される。このように、経路情報は、再帰的定義となる。また、経路情報が示す経路は、木構造となる。
【００４６】
図７の（ｂ）と図７の（ｃ）とには、経路情報の具体例を示す。図７の（ｂ）に示す経路情報７０１［Ａ，［Ｂ］，［Ｃ］］は、ＲＰＣの開始点がノードＡであり、ステップ０、１という２つのステップを有する。ステップ０となる経路情報７０２は、開始点がノードＢであり、ステップを有さない。ステップ１となる経路情報７０３は、開始点がノードＣであり、ステップを有さない。
【００４７】
図７の（ｃ）に示す経路情報７１１［Ａ，［Ｂ，［Ｃ］，［Ｄ，［Ｇ，［Ｅ］，［Ｆ］］］］］は、ＲＰＣの開始点がノードＡであり、ステップ０という１つのステップを有する。開始点がノードＡのステップ０となる経路情報７１２は、開始点がノードＢであり、ステップ０、ステップ１という２つのステップを有する。開始点がノードＢのステップ０となる経路情報７１３は、開始点がノードＣであり、ステップを有さない。開始点がノードＢのステップ１となる経路情報７１４は、開始点がノードＤであり、ステップ０という１つのステップを有する。開始点がノードＤのステップ０となる経路情報７１５は、開始点がノードＧであり、ステップ０、ステップ１という２つのステップを有する。開始点がノードＧのステップ０となる経路情報７１６は、開始点がノードＥであり、ステップを有さない。開始点がノードＧのステップ１となる経路情報７１７は、開始点がノードＦであり、ステップを有さない。
【００４８】
また、経路情報は、図９で説明するメッセージのＲＰＣ処理識別番号とメッセージ固有パラメータの内容により決められる。具体的な決め方は、図９で説明する。
【００４９】
図８は、セション実行ユニットの処理内容の一例を示す説明図である。セション実行ユニット８００は、入力セションごとに生成されるプロセスである。セション実行ユニット８００は、ＲＰＣデコーダ８０１と、ＲＰＣディスパッチャ８０２と、実行スレッド８０３とを有する。各ノードには、複数のセション実行ユニット８００が生成される。ＲＰＣデコーダ８０１は、入力セションで受信されたバイト列を、デコードしてＲＰＣとする。ＲＰＣディスパッチャ８０２は、デコードしたＲＰＣを、実行スレッド８０３に割り付ける。実行スレッド８０３は、ＲＰＣを実行する。実行スレッド８０３は複数存在し、ＲＰＣを並列に実行する。実行スレッド８０３は、ＲＰＣの実行の途中で、出力セションから、ＲＰＣを送信するときがある。
【００５０】
図９は、メッセージのフォーマットの一例を示す説明図である。図９では、メッセージのフォーマットｆｍを示す。フォーマットｆｍは、ヘッダと、ＸＩＤと、経路情報と、ＲＰＣ処理識別番号と、メッセージ固有パラメータと、というフィールドを含む。ヘッダフィールドには、メッセージのデータサイズが格納される。メッセージのデータサイズは、具体的には、メッセージ全体のデータサイズや各フィールドのデータサイズが格納される。また、ヘッダフィールドには、メッセージのデータサイズ以外の付加情報も格納される。
【００５１】
ＸＩＤフィールドには、メッセージごとに付与される識別番号であるＸＩＤが格納される。ＸＩＤは、セション単位でユニークであればどのような値でもよい。経路情報フィールドには、図７で示した経路情報が格納される。経路情報の記憶内容の一例は、図７で示した内容である。ＲＰＣ処理識別番号フィールドには、ＷＲＩＴＥ、ＲＥＡＤ等のＲＰＣ操作に関連付けられたＲＰＣ処理識別番号が格納される。
【００５２】
メッセージ固有パラメータフィールドには、ＲＰＣ処理識別番号ごとに定義されたメッセージ用のパラメータの値の一覧が格納される。一例として、メッセージ固有パラメータフィールドには、キーとバリューのペアが格納される。ここで、経路情報は、メッセージ固有パラメータフィールドのキーと、ＲＰＣ処理識別番号とにより決めることができる。また、経路情報を決定する実行主体は、クライアントＫでもよいし、クライアントＫからＲＰＣを受けたノードでもよい。例えば、ＲＰＣ処理識別番号が、ＷＲＩＴＥであり、メッセージ固有パラメータが、キーがファイル名であり、バリューが書き込み対象のデータであるとする。例えば、クライアントＫからＲＰＣを受けたノードは、ＲＰＣ処理識別番号が、ＷＲＩＴＥであることを確認し、ファイル名をハッシュ関数に入力して得られた値から、書き込み先のノードを決定する。書き込み先のノードが経路情報に含まれることになる。
【００５３】
図１０は、レスポンスのフォーマットの一例を示す説明図である。図１０では、メッセージに対する応答であるレスポンスのフォーマットｆｒを示す。フォーマットｆｒは、ヘッダと、ＸＩＤと、ＲＰＣ処理識別番号と、レスポンス固有パラメータというフィールドを含む。ヘッダフィールドには、レスポンスのデータサイズが格納される。レスポンスのデータサイズは、具体的には、レスポンス全体のデータサイズや各フィールドのデータサイズが格納される。また、ヘッダフィールドには、レスポンスのデータサイズ以外の付加情報も格納される。
【００５４】
ＸＩＤフィールドには、レスポンスに対応するメッセージに設定されたＸＩＤが格納される。ＲＰＣ処理識別番号フィールドには、ＷＲＩＴＥ、ＲＥＡＤ等のＲＰＣ操作に関連付けられたＲＰＣ処理識別番号が格納される。レスポンス固有パラメータフィールドには、ＲＰＣ処理識別番号ごとに定義されたレスポンス用のパラメータの値の一覧が格納される。
【００５５】
図１１は、メッセージ管理表の記憶内容の一例を示す説明図である。図１１では、メッセージ管理表ｍの記憶内容の一例を示す。メッセージ管理表ｍは、入力セションごとに用意される。ＲＰＣデコーダは、デコード済のメッセージに基づいて、メッセージ管理表ｍにエントリをメッセージの受信順に登録する。メッセージ管理表のエントリは、該当のＲＰＣの処理終了後に削除されることができる。なお、以後において、エントリをＲＰＣ終了後も削除せずに「無効」なエントリとしてそのまま残すことは、説明を簡単にするためである。
【００５６】
メッセージ管理表ｍは、エントリ番号と、活性と、ＸＩＤと、レスポンス状態と、総ステップ数と、実行ステップ番号と、実行ステップ状態と、送信ＸＩＤと、ステップ経路と、というフィールドを含む。
【００５７】
エントリ番号フィールドには、該当のエントリの番号が格納される。エントリの順番が、図１に示した順序情報１１１に相当する。活性フィールドには、該当のエントリが有効か否かを示す識別子が格納される。具体的には、該当のエントリが有効である際、活性フィールドには、「有効」識別子が格納される。一方、該当のエントリが無効である際、活性フィールドには、「無効」識別子が格納される。また、登録時点において、活性フィールドには、「無効」識別子が格納される。
【００５８】
ＸＩＤフィールドには、メッセージのＸＩＤが格納される。レスポンス状態フィールドには、レスポンスの状態を示す識別子が格納される。具体的には、登録時点において、レスポンス状態フィールドには、「待機」識別子が格納される。一方、レスポンス状態を送信することが可能な状態となった際に、レスポンス状態フィールドには、「送信可」識別子が格納される。
【００５９】
総ステップ数フィールドには、メッセージ内の経路情報のステップ数が格納される。実行ステップ番号フィールドには、メッセージ内の経路情報のうち、実行中のステップ番号が格納される。また、登録時点において、実行ステップ番号フィールドには、０が格納される。
【００６０】
実行ステップ状態フィールドには、実行中のステップ番号の状態を示す識別子が格納される。具体的には、登録時点において、実行ステップ状態フィールドには、「待機」識別子が格納される。一方、実行ステップ番号フィールドに格納された値に対応する経路にメッセージを送信中の状態では、「送信中」識別子が格納される。そして、メッセージに対するレスポンスを受信した場合に、実行ステップ番号フィールドの値が１増えたときに不可分に、実行ステップ状態フィールドには、「待機」識別子が格納される。すなわち、実行ステップ状態フィールドには、「待機」識別子と「送信中」識別子とが交互に格納される。
【００６１】
送信ＸＩＤフィールドには、送信したメッセージのＸＩＤが格納される。送信ＸＩＤフィールドは、実行ステップ状態が「送信中」である際に意味を有するフィールドである。ステップ経路フィールドには、メッセージの経路情報をステップごとに分解した情報が格納される。具体的には、ステップ経路フィールドの各サブフィールドには、メッセージの経路情報のインデックス０から、総ステップ数−１までの分解した経路情報が格納される。
【００６２】
例えば、図１１に示す０番目のエントリは、クライアントＫが受信した、経路情報が［Ｋ、［Ａ］，［Ｂ］，［Ｃ］］であり、ＸＩＤが１２３となるメッセージを登録したものである。以下では、説明の簡略化のために、メッセージ管理表ｍのｘ番目のエントリを、「ＥＮＴ（ｘ）」と表記することがある。また、ｘ番目のエントリの各フィールドを、「ＥＮＴ（ｘ）．フィールド名」と表記することがある。例えば、図１１に示す０番目のエントリのＸＩＤを、ＥＮＴ（０）．ＸＩＤ＝１２３と表記する。
【００６３】
また、総ステップ数フィールド、実行ステップ番号フィールド、実行ステップ状態フィールドにより、ステップ経路フィールドの各ステップがコマンドを実行しているのか、またはこれから実行するのかが判断できる。実行ステップ状態が「送信中」である場合、実行ステップ番号に対応するステップに含まれるノード群は、コマンドを実行しているノードとなる。また、実行ステップ番号より大きいステップに含まれるノード群は、コマンドをこれから実行するノードとなる。
【００６４】
図１２は、送信待機表の記憶内容の一例を示す説明図である。送信待機表ｓは、メッセージ管理表ｍに登録されたエントリのうち、送信可となったエントリ番号を記憶するテーブルである。送信待機表ｓは、各ノードが有する。例えば、図１２に示す送信待機表ｓの０番目のレコード１２０１−１は、メッセージ管理表ｍに登録されたエントリ番号８８に対応するレスポンスが送信可であることを示す。
【００６５】
（２層階層の例）
図１３は、２層階層におけるクライアントとサーバとの関係の一例を示す説明図である。図１３〜図２２では、第１の実施例として、クライアントＫから、コマンドＲＰＣ＿ａと、コマンドＲＰＣ＿ｂとを、サーバとなるノードＡが受け付けて、ノードＡが各コマンドを実行する例を示す。ノードＡは、コマンドＲＰＣ＿ａを受け付けた後に、コマンドＲＰＣ＿ｂを受け付ける。図１３〜図２２におけるコマンドＲＰＣ＿ａ、ＲＰＣ＿ｂの経路情報は、［Ｋ，［Ａ］］である。また、図１３〜図２２の例では、ノード間のＲＰＣの送信時間を１単位時間とし、ノードＡがコマンドＲＰＣ＿ａの処理を完了するのにかかる時間を２単位時間とし、ノードＡがコマンドＲＰＣ＿ｂの処理を完了するのにかかる時間を１単位時間とする。
【００６６】
図１３が示すように、サーバとなるノードＡと、クライアントとなるクライアントＫとは、それぞれ、メッセージ管理表ｍ＿Ａ、メッセージ管理表ｍ＿Ｋを有する。このように、クライアントがメッセージ管理表ｍを有してもよい。そして、クライアントが異なるサーバにＲＰＣを実行する場合にも、メッセージ管理表ｍを利用して、クライアント内で待ち合わせることができる。クライアントがレスポンスを送信することはないため、クライアントが有するメッセージ管理表ｍのＸＩＤフィールドと、レスポンス状態フィールドとは使用されない。
【００６７】
図１４は、２層階層におけるコマンド実行前の初期状態を示す説明図である。図１４では、コマンドＲＰＣ＿ａ、ＲＰＣ＿ｂを実行する前を初期状態として示す。図１４で示すように、初期状態におけるメッセージ管理表ｍ＿Ｋ、ｍ＿Ａの内容は空である。
【００６８】
図１５は、２層階層におけるコマンド実行開始後の時刻０の状態を示す説明図である。図１５では、時刻０として、クライアントＫが、コマンドＲＰＣ＿ａの処理要求として、ＸＩＤ＝９９のメッセージをノードＡに送信した状態を示す。
【００６９】
時刻０におけるメッセージ管理表ｍ＿Ａについては、図１４に示したままである。時刻０におけるメッセージ管理表ｍ＿Ｋについて、クライアントＫは、ＸＩＤ＝９９のメッセージを０番目のエントリとしてメッセージ管理表ｍ＿Ｋに登録する。具体的には、クライアントＫは、ＥＮＴ（０）．活性＝「有効」、ＥＮＴ（０）．総ステップ数＝１、ＥＮＴ（０）．実行ステップ番号＝０、ＥＮＴ（０）．実行ステップ状態＝「送信中」、ＥＮＴ（０）．送信ＸＩＤ＝９９とする。また、クライアントＫは、ＥＮＴ（０）．ステップ経路［０］に、コマンドＲＰＣ＿ａの経路情報のインデックス０となる［Ａ］を設定する。
【００７０】
図１６は、２層階層におけるコマンド実行開始後の時刻１の状態を示す説明図である。図１６では、時刻０から１単位時間経過した時刻１として、クライアントＫが、コマンドＲＰＣ＿ｂの実行として、ＸＩＤ＝１０１のメッセージをノードＡに送信するとともに、ノードＡが、ＸＩＤ＝９９のメッセージを受信した状態を示す。ＸＩＤ＝９９のメッセージと、ＸＩＤ＝１０１のメッセージとは、宛先が同一であるため、クライアントＫは、ＸＩＤ＝９９のメッセージを送信したセションと同一のセションから、ＸＩＤ＝１０１のメッセージを送信する。
【００７１】
時刻１におけるメッセージ管理表ｍ＿Ｋについて、クライアントＫは、ＸＩＤ＝１０１のメッセージを１番目のエントリとしてメッセージ管理表ｍ＿Ｋに登録する。具体的には、クライアントＫは、ＥＮＴ（１）．活性＝「有効」、ＥＮＴ（１）．総ステップ数＝１、ＥＮＴ（１）．実行ステップ番号＝０、ＥＮＴ（１）．実行ステップ状態＝「送信中」、ＥＮＴ（１）．送信ＸＩＤ＝１０１とする。また、クライアントＫは、ＥＮＴ（１）．ステップ経路［０］に、コマンドＲＰＣ＿ｂの経路情報のインデックス０となる［Ａ］を設定する。
【００７２】
また、時刻１におけるメッセージ管理表ｍ＿Ａについて、ノードＡは、ＸＩＤ＝９９のメッセージを０番目のエントリとしてメッセージ管理表ｍ＿Ａに登録する。具体的には、ノードＡは、ＥＮＴ（０）．活性＝「有効」、ＥＮＴ（０）．ＸＩＤ＝９９、ＥＮＴ（０）．レスポンス状態＝「待機」、ＥＮＴ（０）．総ステップ数＝０、ＥＮＴ（０）．実行ステップ番号＝０、ＥＮＴ（０）．実行ステップ状態＝「待機」とする。また、時刻１において、ノードＡは、コマンドＲＰＣ＿ａの処理を開始する。
【００７３】
図１７は、２層階層におけるコマンド実行開始後の時刻２の状態を示す説明図である。図１７では、時刻１から１単位時間経過した時刻２として、ノードＡが、ＸＩＤ＝１０１のメッセージを受信した状態を示す。
【００７４】
時刻２におけるメッセージ管理表ｍ＿Ｋについては、図１６に示したままである。時刻２におけるメッセージ管理表ｍ＿Ａについて、ノードＡは、ＸＩＤ＝１０１のメッセージを１番目のエントリとしてメッセージ管理表ｍ＿Ａに登録する。具体的には、ノードＡは、ＥＮＴ（１）．活性＝「有効」、ＥＮＴ（１）．ＸＩＤ＝１０１、ＥＮＴ（１）．レスポンス状態＝「待機」、ＥＮＴ（１）．総ステップ数＝０、ＥＮＴ（１）．実行ステップ番号＝０、ＥＮＴ（１）．実行ステップ状態＝「待機」とする。また、時刻２において、ノードＡは、コマンドＲＰＣ＿ｂの処理を開始する。
【００７５】
ここで、ノードＡは、コマンドＲＰＣ＿ａの処理とコマンドＲＰＣ＿ｂの処理とを行うことになる。コマンドＲＰＣ＿ａの処理とコマンドＲＰＣ＿ｂの処理との間のリソース競合について、ノードＡは、ノードＡのＯＳなどが有する排他制御機構を用いてリソース競合を回避する。具体的には、ノードＡは、排他制御機構によって、先に受け付けたコマンドＲＰＣ＿ａの処理によるリソースの更新を、コマンドＲＰＣ＿ｂの処理によるリソース参照より先に行われるように制御する。
【００７６】
図１８は、２層階層におけるコマンド実行開始後の時刻３の状態を示す説明図である。図１８では、時刻２から１単位時間経過した時刻３として、ノードＡが、コマンドＲＰＣ＿ｂの処理を完了した状態を示す。
【００７７】
時刻３におけるメッセージ管理表ｍ＿Ｋについては、図１６に示したままである。時刻３におけるメッセージ管理表ｍ＿Ａについて、コマンドＲＰＣ＿ｂの処理を完了すると、ノードＡは、ＥＮＴ（１）．レスポンス状態＝「送信可」に設定し、ＸＩＤ＝１０１のメッセージに対するレスポンスを送信するか否かを判断する。この場合、ノードＡは、ＸＩＤ＝１０１のメッセージに先行するＸＩＤ＝９９のメッセージに対応するＥＮＴ（０）．レスポンス状態が「待機」であるから、ＸＩＤ＝１０１のメッセージに対するレスポンスを送信しないと判断する。
【００７８】
図１９は、２層階層におけるコマンド実行開始後の時刻４の状態を示す説明図である。図１９では、時刻３から１単位時間経過した時刻４として、ノードＡが、コマンドＲＰＣ＿ａの処理を完了した状態を示す。
【００７９】
時刻４におけるメッセージ管理表ｍ＿Ｋについては、図１６に示したままである。時刻４におけるメッセージ管理表ｍ＿Ａについて、コマンドＲＰＣ＿ａの処理を完了すると、ノードＡは、ＥＮＴ（０）．レスポンス状態＝「送信可」に設定する。
【００８０】
図２０は、２層階層におけるコマンド実行開始後の時刻５の状態を示す説明図である。図２０では、時刻４から、ノードＡがＥＮＴ（０）．レスポンス状態＝「送信可」に設定した直後の時刻５の状態を示す。
【００８１】
時刻５におけるメッセージ管理表ｍ＿Ｋについては、図１６に示したままである。時刻５におけるメッセージ管理表ｍ＿Ａについて、ノードＡは、ＸＩＤ＝９９のメッセージに対するレスポンスをクライアントＫに送信する。そして、ノードＡは、ＥＮＴ（０）．活性＝「無効」にする。
【００８２】
図２１は、２層階層におけるコマンド実行開始後の時刻６の状態を示す説明図である。図２１では、時刻５から１単位時間経過した時刻６として、クライアントＫが、ＸＩＤ＝９９のメッセージに対するレスポンスを受信した状態を示す。
【００８３】
時刻６におけるメッセージ管理表ｍ＿Ｋについて、ＸＩＤ＝９９のメッセージに対するレスポンスを受信すると、クライアントＫは、ＥＮＴ（０）．実行ステップ状態＝「待機」、ＥＮＴ（０）．実行ステップ番号＝１とし、ＥＮＴ（０）．活性＝「無効」とする。
【００８４】
また、時刻６におけるメッセージ管理表ｍ＿Ａについて、ノードＡは、ＸＩＤ＝１０１のメッセージに対するレスポンスをクライアントＫに送信する。そして、ノードＡは、ＥＮＴ（１）．活性＝「無効」にする。ここで、ノードＡは、ＸＩＤ＝１０１のメッセージに対するレスポンスを、ＸＩＤ＝９９のメッセージに対するレスポンスをクライアントＫに送信した直後に送信してもよい。
【００８５】
図２２は、２層階層におけるコマンド実行開始後の時刻７の状態を示す説明図である。図２２では、時刻６から１単位時間経過した時刻７として、クライアントＫが、ＸＩＤ＝１０１のメッセージに対するレスポンスを受信した状態を示す。
【００８６】
時刻７におけるメッセージ管理表ｍ＿Ａについては、図２１に示したままである。時刻７におけるメッセージ管理表ｍ＿Ｋについて、ＸＩＤ＝１０１のメッセージに対するレスポンスを受信すると、クライアントＫは、ＥＮＴ（１）．実行ステップ状態＝「待機」、ＥＮＴ（１）．実行ステップ番号＝１とし、ＥＮＴ（１）．活性＝「無効」とする。
【００８７】
（３層階層の例）
図２３は、３層階層におけるクライアントとサーバとの関係の一例を示す説明図である。図２３〜図４５では、第２の実施例として、クライアントとなるクライアントＫから、コマンドＲＰＣ＿ａと、コマンドＲＰＣ＿ｂとを、サーバとなるノードＡが受け付けて、ノードＡ、Ｂ、Ｃが各コマンドを実行する例を示す。ノードＡは、コマンドＲＰＣ＿ａを受け付けた後に、コマンドＲＰＣ＿ｂを受け付ける。図２３〜図４５におけるコマンドＲＰＣ＿ａの経路情報は、［Ｋ，［Ａ，［Ｂ，［Ｃ］］］］である。また、図２３〜図４５におけるコマンドＲＰＣ＿ｂの経路情報は、［Ｋ，［Ａ，［Ｃ］］］である。
【００８８】
処理にかかる時間として、図２３〜図４５の例では、ノード間のＲＰＣの送信時間を１単位時間とする。また、ノードＡがコマンドＲＰＣ＿ａの処理を開始してから、ノードＢに対するＲＰＣ呼び出しが発生するまでの時間を２単位時間とする。また、ノードＡがコマンドＲＰＣ＿ｂの処理を開始してから、ノードＣに対するＲＰＣ呼び出しが発生するまでの時間を１単位時間とする。また、ノードＢがコマンドＲＰＣ＿ａの処理を完了するのにかかる時間を０単位時間とする。また、ノードＣがコマンドＲＰＣ＿ａの処理を完了するのにかかる時間を０単位時間とし、ノードＣがコマンドＲＰＣ＿ｂの処理を完了するのにかかる時間を１単位時間とする。
【００８９】
図２３に示すように、サーバとなるノードＡ、Ｂと、クライアントとなるクライアントＫとは、それぞれ、メッセージ管理表ｍ＿Ａ、メッセージ管理表ｍ＿Ｂ、メッセージ管理表ｍ＿Ｋ、を有する。また、メッセージ管理表ｍは、入力セションごとに存在するため、サーバとなるノードＣは、ノードＡからの入力セション用のメッセージ管理表ｍ＿Ｃ＿Ａと、ノードＢからの入力セション用のメッセージ管理表ｍ＿Ｃ＿Ｂとを有する。
【００９０】
図２４は、３層階層におけるコマンド実行前の初期状態を示す説明図である。図２４では、コマンドＲＰＣ＿ａ、ＲＰＣ＿ｂを実行する前を初期状態として示す。図２４で示すように、初期状態におけるメッセージ管理表ｍ＿Ｋ、ｍ＿Ａ、ｍ＿Ｂ、ｍ＿Ｃ＿Ａ、ｍ＿Ｃ＿Ｂの内容は空である。
【００９１】
図２５は、３層階層におけるコマンド実行開始後の時刻０の状態を示す説明図である。図２５では、時刻０として、クライアントＫが、コマンドＲＰＣ＿ａの処理要求として、ＸＩＤ＝９９のメッセージをノードＡに送信した状態を示す。
【００９２】
時刻０におけるメッセージ管理表ｍ＿Ａ、ｍ＿Ｂ、ｍ＿Ｃ＿Ａ、ｍ＿Ｃ＿Ｂについては、図２４に示したままである。時刻０におけるメッセージ管理表ｍ＿Ｋについて、クライアントＫは、ＸＩＤ＝９９のメッセージを０番目のエントリとしてメッセージ管理表ｍ＿Ｋに登録する。具体的には、クライアントＫは、ＥＮＴ（０）．活性＝「有効」、ＥＮＴ（０）．総ステップ数＝１、ＥＮＴ（０）．実行ステップ番号＝０、ＥＮＴ（０）．実行ステップ状態＝「送信中」、ＥＮＴ（０）．送信ＸＩＤ＝９９とする。また、クライアントＫは、ＥＮＴ（０）．ステップ経路［０］に、コマンドＲＰＣ＿ａの経路情報のインデックス０となる［Ａ，［Ｂ，［Ｃ］］］を設定する。
【００９３】
図２６は、３層階層におけるコマンド実行開始後の時刻１の状態を示す説明図である。図２６では、時刻０から１単位時間経過した時刻１として、クライアントＫが、コマンドＲＰＣ＿ｂの実行として、ＸＩＤ＝１０１のメッセージをノードＡに送信するとともに、ノードＡが、ＸＩＤ＝９９のメッセージを受信した状態を示す。ＸＩＤ＝９９のメッセージと、ＸＩＤ＝１０１のメッセージとは、宛先が同一であるため、クライアントＫは、ＸＩＤ＝９９のメッセージを送信したセションと同一のセションから、ＸＩＤ＝１０１のメッセージを送信する。
【００９４】
時刻１におけるメッセージ管理表ｍ＿Ｂ、ｍ＿Ｃ＿Ａ、ｍ＿Ｃ＿Ｂについては、図２４に示したままである。時刻１におけるメッセージ管理表ｍ＿Ｋについて、クライアントＫは、ＸＩＤ＝１０１のメッセージを１番目のエントリとしてメッセージ管理表ｍ＿Ｋに登録する。具体的には、クライアントＫは、ＥＮＴ（１）．活性＝「有効」、ＥＮＴ（１）．総ステップ数＝１、ＥＮＴ（１）．実行ステップ番号＝０、ＥＮＴ（１）．実行ステップ状態＝「送信中」、ＥＮＴ（１）．送信ＸＩＤ＝１０１とする。また、クライアントＫは、ＥＮＴ（１）．ステップ経路［０］に、ＸＩＤ＝１０１のメッセージの経路情報のインデックス０となる［Ａ，［Ｃ］］を設定する。
【００９５】
また、時刻１におけるメッセージ管理表ｍ＿Ａについて、ノードＡは、ＸＩＤ＝９９のメッセージを０番目のエントリとしてメッセージ管理表ｍ＿Ａに登録する。具体的には、ノードＡは、ＥＮＴ（０）．活性＝「有効」、ＥＮＴ（０）．ＸＩＤ＝９９、ＥＮＴ（０）．レスポンス状態＝「待機」、ＥＮＴ（０）．総ステップ数＝１、ＥＮＴ（０）．実行ステップ番号＝０、ＥＮＴ（０）．実行ステップ状態＝「待機」とする。また、ノードＡは、ＥＮＴ（０）．ステップ経路［０］に、ＸＩＤ＝９９のメッセージの経路情報のインデックス０となる［Ｂ，［Ｃ］］を設定する。また、時刻１において、ノードＡは、コマンドＲＰＣ＿ａの処理を開始する。
【００９６】
図２７は、３層階層におけるコマンド実行開始後の時刻２の状態を示す説明図である。図２７では、時刻１から１単位時間経過した時刻２として、ノードＡが、ＸＩＤ＝１０１のメッセージを受信した状態を示す。
【００９７】
時刻２におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻２におけるメッセージ管理表ｍ＿Ｂ、ｍ＿Ｃ＿Ａ、ｍ＿Ｃ＿Ｂについては、図２４に示したままである。
【００９８】
時刻２におけるメッセージ管理表ｍ＿Ａについて、ノードＡは、ＸＩＤ＝１０１のメッセージを１番目のエントリとしてメッセージ管理表ｍ＿Ａに登録する。具体的には、ノードＡは、ＥＮＴ（１）．活性＝「有効」、ＥＮＴ（１）．ＸＩＤ＝１０１、ＥＮＴ（１）．レスポンス状態＝「待機」、ＥＮＴ（１）．総ステップ数＝１、ＥＮＴ（１）．実行ステップ番号＝０、ＥＮＴ（１）．実行ステップ状態＝「待機」とする。また、ノードＡは、ＥＮＴ（１）．ステップ経路［０］に、ＸＩＤ＝１０１のメッセージの経路情報のインデックス０となる［Ｃ］を設定する。また、時刻２において、ノードＡは、コマンドＲＰＣ＿ｂの処理を開始する。ここで、ノードＡは、コマンドＲＰＣ＿ａの処理とコマンドＲＰＣ＿ｂの処理とを行うことになる。リソース競合の回避については、図１７と同様であるため、説明を省略する。
【００９９】
図２８は、３層階層におけるコマンド実行開始後の時刻３の状態を示す説明図である。図２８では、時刻２から１単位時間経過した時刻３として、ノードＡが、コマンドＲＰＣ＿ｂの処理の実行中に、ノードＣに対するＲＰＣ呼び出しが発生した状態を示す。
【０１００】
時刻３におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻３におけるメッセージ管理表ｍ＿Ｂ、ｍ＿Ｃ＿Ａ、ｍ＿Ｃ＿Ｂについては、図２４に示したままである。
【０１０１】
時刻３におけるメッセージ管理表ｍ＿Ａについて、ノードＣに対するＲＰＣ呼び出しが発生すると、ノードＡは、ＸＩＤ＝１０１のメッセージのステップ経路［０］に対してメッセージを送信するか否かを判断する。まず、ノードＡは、ＸＩＤ＝１０１のメッセージのステップ経路［０］＝［Ｃ］を取得する。次に、ノードＡは、ＸＩＤ＝１０１のメッセージより先行して受け付けたＸＩＤ＝９９のメッセージのステップ経路のうち、レスポンスを受信していないステップ経路［０］＝［Ｂ，［Ｃ］］を取得する。そして、ノードＡは、取得した２つのステップ経路に、同一のノードが含まれているか否かを判断する。図２８の例では、ノードＣが２つのステップ経路に含まれるため、ノードＡは、ＸＩＤ＝１０１のメッセージのステップ経路［０］に対してメッセージを送信しないと判断する。従って、ノードＡは、ＸＩＤ＝１０１のメッセージのステップ経路［０］に対してのメッセージの送信をペンディングする。
【０１０２】
ペンディングしたＸＩＤ＝１０１のメッセージのステップ経路［０］に対してのメッセージについて、ノードＡは、送信待機表ｓ＿Ａに、ペンディングしたＸＩＤ＝１０１のエントリ番号である１を登録する。
【０１０３】
図２９は、３層階層におけるコマンド実行開始後の時刻４の状態を示す説明図である。図２９では、時刻３から１単位時間経過した時刻４として、ノードＡが、コマンドＲＰＣ＿ａの処理の実行中に、ノードＢに対するＲＰＣ呼び出しが発生した状態を示す。
【０１０４】
時刻４におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻４におけるメッセージ管理表ｍ＿Ｂ、ｍ＿Ｃ＿Ａ、ｍ＿Ｃ＿Ｂについては、図２４に示したままである。
【０１０５】
時刻４におけるメッセージ管理表ｍ＿Ａについて、ノードＢに対するＲＰＣ呼び出しが発生すると、ノードＡは、ＸＩＤ＝９９のメッセージのステップ経路［０］に対してメッセージを送信するか否かを判断する。この場合、ＸＩＤ＝９９のメッセージに先行するメッセージがないため、ノードＡは、ＸＩＤ＝９９のメッセージのステップ経路［０］に対してメッセージを送信する。具体的には、ノードＡは、ＸＩＤ＝９９のメッセージのステップ経路［０］に対するメッセージとして、ＸＩＤ＝２９９のメッセージをノードＢに送信し、ＥＮＴ（０）．送信ＸＩＤ＝２９９にし、ＥＮＴ（０）．実行ステップ状態＝「送信中」にする。
【０１０６】
図３０は、３層階層におけるコマンド実行開始後の時刻５の状態を示す説明図である。図３０では、時刻４から１単位時間経過した時刻５として、ノードＢが、ＸＩＤ＝２９９のメッセージを受信した状態を示す。
【０１０７】
時刻５におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻５におけるメッセージ管理表ｍ＿Ａについては、図２９に示したままである。また、時刻５におけるメッセージ管理表ｍ＿Ｃ＿Ａ、ｍ＿Ｃ＿Ｂについては、図２４に示したままである。
【０１０８】
時刻５におけるメッセージ管理表ｍ＿Ｂについて、ノードＢは、ＸＩＤ＝２９９のメッセージを０番目のエントリとしてメッセージ管理表ｍ＿Ｂに登録する。具体的には、ノードＢは、ＥＮＴ（０）．活性＝「有効」、ＥＮＴ（０）．ＸＩＤ＝２９９、ＥＮＴ（０）．レスポンス状態＝「待機」、ＥＮＴ（０）．総ステップ数＝１、ＥＮＴ（０）．実行ステップ番号＝０、ＥＮＴ（０）．実行ステップ状態＝「待機」とする。また、ノードＢは、ＥＮＴ（０）．ステップ経路［０］に、ＸＩＤ＝２９９のメッセージの経路情報のインデックス０となる［Ｃ］を設定する。
【０１０９】
図３１は、３層階層におけるコマンド実行開始後の時刻６の状態を示す説明図である。図３１では、時刻５から、ノードＢがＥＮＴ（０）．実行ステップ状態＝「待機」に設定した直後の時刻６の状態を示す。
【０１１０】
時刻６におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻６におけるメッセージ管理表ｍ＿Ａについては、図２９に示したままである。また、時刻６におけるメッセージ管理表ｍ＿Ｃ＿Ａ、ｍ＿Ｃ＿Ｂについては、図２４に示したままである。
【０１１１】
時刻６におけるメッセージ管理表ｍ＿Ｂについて、ノードＢは、ＸＩＤ＝２９９のメッセージのステップ経路［０］に対してメッセージを送信する。具体的には、ノードＡは、ＸＩＤ＝２９９のメッセージのステップ経路［０］に対するメッセージとして、ＸＩＤ＝７７７のメッセージをノードＣに送信し、ＥＮＴ（０）．送信ＸＩＤ＝７７７に設定する。
【０１１２】
図３２は、３層階層におけるコマンド実行開始後の時刻７の状態を示す説明図である。図３２では、時刻６から１単位時間経過した時刻７として、ノードＢが、ＸＩＤ＝７７７のメッセージを受信した状態を示す。
【０１１３】
時刻７におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻７におけるメッセージ管理表ｍ＿Ａについては、図２９に示したままである。また、時刻７におけるメッセージ管理表ｍ＿Ｂについては、図３１に示したままである。また、時刻７におけるメッセージ管理表ｍ＿Ｃ＿Ａについては、図２４に示したままである。
【０１１４】
時刻７におけるメッセージ管理表ｍ＿Ｃ＿Ｂについて、ノードＣは、ＸＩＤ＝７７７のメッセージを０番目のエントリとしてメッセージ管理表ｍ＿Ｃ＿Ｂに登録する。具体的には、ノードＣは、ＥＮＴ（０）．活性＝「有効」、ＥＮＴ（０）．ＸＩＤ＝７７７、ＥＮＴ（０）．レスポンス状態＝「待機」、ＥＮＴ（０）．総ステップ数＝０、ＥＮＴ（０）．実行ステップ番号＝０、ＥＮＴ（０）．実行ステップ状態＝「待機」とする。また、ノードＣは、ＲＰＣ＿ａの処理を開始する。
【０１１５】
図３３は、３層階層におけるコマンド実行開始後の時刻８の状態を示す説明図である。図３３では、時刻７から、ノードＣがＥＮＴ（０）．実行ステップ状態＝「待機」に設定して、ＲＰＣ＿ａの処理を完了した時刻である時刻８の状態を示す。
【０１１６】
時刻８におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻８におけるメッセージ管理表ｍ＿Ａについては、図２９に示したままである。また、時刻８におけるメッセージ管理表ｍ＿Ｂについては、図３１に示したままである。また、時刻８におけるメッセージ管理表ｍ＿Ｃ＿Ａについては、図２４に示したままである。
【０１１７】
時刻８におけるメッセージ管理表ｍ＿Ｃ＿Ｂについて、コマンドＲＰＣ＿ｂの処理を完了すると、ノードＣは、ＥＮＴ（０）．レスポンス状態＝「送信可」に設定し、ＸＩＤ＝７７７のメッセージに対するレスポンスを送信するか否かを判断する。この場合、ノードＣは、ＸＩＤ＝７７７のメッセージに先行するメッセージがないことから、ＸＩＤ＝７７７のメッセージに対するレスポンスを送信すると判断する。
【０１１８】
図３４は、３層階層におけるコマンド実行開始後の時刻９の状態を示す説明図である。図３３では、時刻８から、ノードＣがＸＩＤ＝７７７のメッセージに対するレスポンスを送信すると判断した時刻である時刻９の状態を示す。
【０１１９】
時刻９におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻９におけるメッセージ管理表ｍ＿Ａについては、図２９に示したままである。また、時刻９におけるメッセージ管理表ｍ＿Ｂについては、図３１に示したままである。また、時刻９におけるメッセージ管理表ｍ＿Ｃ＿Ａについては、図２４に示したままである。
【０１２０】
時刻９におけるメッセージ管理表ｍ＿Ｃ＿Ｂについて、ノードＣは、ＸＩＤ＝７７７のメッセージに対するレスポンスをノードＢに送信し、ＥＮＴ（０）．活性＝「無効」に設定する。
【０１２１】
図３５は、３層階層におけるコマンド実行開始後の時刻１０の状態を示す説明図である。図３５では、時刻９から１単位時間経過した時刻１０として、ノードＢが、ノードＣからのレスポンスを受信した状態を示す。
【０１２２】
時刻１０におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻１０におけるメッセージ管理表ｍ＿Ａについては、図２９に示したままである。また、時刻１０におけるメッセージ管理表ｍ＿Ｃ＿Ａについては、図２４に示したままである。また、時刻１０におけるメッセージ管理表ｍ＿Ｃ＿Ｂについては、図３４に示したままである。時刻１０以降の時刻において、メッセージ管理表ｍ＿Ｃ＿Ｂの内容が変化することはないので、時刻１０以降の時刻におけるメッセージ管理表ｍ＿Ｃ＿Ｂの記載を省略する。
【０１２３】
時刻１０におけるメッセージ管理表ｍ＿Ｂについて、ノードＢは、メッセージ管理表ｍ＿Ｂの送信ＸＩＤを参照して、ノードＣから受信したレスポンスが、ＥＮＴ（０）．ＸＩＤ＝７７７のメッセージに対するレスポンスであることを特定する。そして、ノードＢは、ＥＮＴ（０）．実行ステップ番号＝１にする。引き続き、ノードＢは、ＲＰＣ＿ｂの処理を実行する。
【０１２４】
図３６は、３層階層におけるコマンド実行開始後の時刻１１の状態を示す説明図である。図３６では、時刻１０から、ノードＢがコマンドＲＰＣ＿ａの処理を完了した時刻である時刻１１の状態を示す。
【０１２５】
時刻１１におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻１１におけるメッセージ管理表ｍ＿Ａについては、図２９に示したままである。また、時刻１１におけるメッセージ管理表ｍ＿Ｃ＿Ａについては、図２４に示したままである。
【０１２６】
時刻１１におけるメッセージ管理表ｍ＿Ｂについて、コマンドＲＰＣ＿ａの処理を完了すると、ノードＢは、ＥＮＴ（０）．レスポンス状態＝「送信可」に設定する。
【０１２７】
図３７は、３層階層におけるコマンド実行開始後の時刻１２の状態を示す説明図である。図３７では、時刻１１から、ノードＢがＥＮＴ（０）．レスポンス状態＝「送信可」に設定した直後の時刻１２の状態を示す。
【０１２８】
時刻１２におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻１２におけるメッセージ管理表ｍ＿Ａについては、図２９に示したままである。また、時刻１２におけるメッセージ管理表ｍ＿Ｃ＿Ａについては、図２４に示したままである。
【０１２９】
時刻１２におけるメッセージ管理表ｍ＿Ｂについて、ノードＢは、ＸＩＤ＝２９９のメッセージに対するレスポンスをノードＡに送信する。そして、ノードＢは、ＥＮＴ（０）．活性＝「無効」にする。
【０１３０】
図３８は、３層階層におけるコマンド実行開始後の時刻１３の状態を示す説明図である。図３８では、時刻１２から１単位時間経過した時刻１３として、ノードＡが、ノードＢからのレスポンスを受信した状態を示す。
【０１３１】
時刻１３におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻１３におけるメッセージ管理表ｍ＿Ｃ＿Ａについては、図２４に示したままである。また、時刻１３におけるメッセージ管理表ｍ＿Ｂについては、図３７に示したままである。時刻１３以降の時刻において、メッセージ管理表ｍ＿Ｂの内容が変化することはないので、時刻１３以降の時刻におけるメッセージ管理表ｍ＿Ｂの記載を省略する。
【０１３２】
時刻１３におけるメッセージ管理表ｍ＿Ａについて、ノードＡは、メッセージ管理表ｍ＿Ａの送信ＸＩＤを参照して、ノードＢから受信したレスポンスが、ＥＮＴ（０）．ＸＩＤ＝２９９のメッセージに対するレスポンスであることを特定する。ノードＡは、ＥＮＴ（０）．実行ステップ番号＝１、ＥＮＴ（０）．実行ステップ状態＝「待機」にする。
【０１３３】
図３９は、３層階層におけるコマンド実行開始後の時刻１４の状態を示す説明図である。図３９では、時刻１３から、ノードＡが、ＥＮＴ（０）．実行ステップ番号＝１に設定した直後となる時刻１４の状態を示す。
【０１３４】
時刻１４におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻１４におけるメッセージ管理表ｍ＿Ｃ＿Ａについては、図２４に示したままである。
【０１３５】
時刻１４におけるメッセージ管理表ｍ＿Ａについて、ノードＡは、レスポンスの受信を契機としてメッセージが送信可能となったものが存在するかを判断する。具体的には、ノードＡは、送信待機表ｓ＿Ａを参照して、送信をペンディングしたメッセージがあるか否かを判断する。図２８で説明したように、送信待機表ｓ＿Ａには、１番目のエントリが登録されている。従って、ノードＡは、１番目のエントリに対するメッセージが送信可能となったか否かを判断する。
【０１３６】
まず、ノードＡは、１番目のエントリとして、ＸＩＤ＝１０１のメッセージのステップ経路［０］＝［Ｃ］を取得する。次に、ノードＡは、ＸＩＤ＝１０１のメッセージより先行して受け付けたＸＩＤ＝９９のメッセージのステップ経路のうち、レスポンスを受信していないステップ経路があるかを判断する。図３９の例では、レスポンスを受信していないステップ経路がなく、空集合のステップ経路を取得する。そして、ノードＡは、取得した２つのステップ経路に、同一のノードが含まれているか否かを判断する。図３９の例では、２つのステップ経路に含まれるノードはないため、ノードＡは、ＸＩＤ＝１０１のメッセージのステップ経路［０］に対してメッセージを送信すると判断する。
【０１３７】
そして、ノードＡは、ＸＩＤ＝１０１のメッセージのステップ経路［０］に対するメッセージとして、ＸＩＤ＝５５０１のメッセージをノードＣに送信し、ＥＮＴ（１）．送信ＸＩＤ＝５５０１にし、ＥＮＴ（１）．実行ステップ状態＝「送信中」にする。
【０１３８】
また、時刻１４において、ノードＡは、ＲＰＣ＿ａの処理を完了する。そして、ＲＰＣ＿ａの処理の完了を契機として、ノードＡは、ＥＮＴ（０）．レスポンス状態＝「送信可」にする。
【０１３９】
図４０は、３層階層におけるコマンド実行開始後の時刻１５の状態を示す説明図である。図４０では、時刻１４から、ノードＡが、ＲＰＣ＿ａの処理を完了した直後となる時刻１５の状態を示す。
【０１４０】
時刻１５におけるメッセージ管理表ｍ＿Ｋについては、図２６に示したままである。また、時刻１５におけるメッセージ管理表ｍ＿Ｃ＿Ａについては、図２４に示したままである。
【０１４１】
時刻１５におけるメッセージ管理表ｍ＿Ａについて、ノードＡは、ＸＩＤ＝９９のメッセージに対するレスポンスをクライアントＫに送信する。そして、ノードＡは、ＥＮＴ（０）．活性＝「無効」にする。
【０１４２】
図４１は、３層階層におけるコマンド実行開始後の時刻１６の状態を示す説明図である。図４１では、時刻１５から１単位時間経過した時刻１６として、クライアントＫが、ノードＡからレスポンスを受信するとともに、ノードＣが、ＸＩＤ＝５５０１のメッセージを受信した状態を示す。
【０１４３】
時刻１６におけるメッセージ管理表ｍ＿Ａについては、図４０に示したままである。時刻１６におけるメッセージ管理表ｍ＿Ｋについて、クライアントＫは、メッセージ管理表ｍ＿Ｋの送信ＸＩＤを参照して、ノードＣから受信したレスポンスが、０番目のエントリとなるメッセージに対するレスポンスであることを特定する。そして、クライアントＫは、ＥＮＴ（０）．活性＝「無効」にする。
【０１４４】
また、時刻１６におけるメッセージ管理表ｍ＿Ｃ＿Ａについて、ノードＣは、ＸＩＤ＝５５０１のメッセージを０番目のエントリとしてメッセージ管理表ｍ＿Ｃ＿Ａに登録する。ノードＣは、ＥＮＴ（０）．活性＝「有効」、ＥＮＴ（０）．ＸＩＤ＝５５０１、ＥＮＴ（０）．レスポンス状態＝「待機」、ＥＮＴ（０）．総ステップ数＝０、ＥＮＴ（０）．実行ステップ番号＝０、ＥＮＴ（０）．実行ステップ状態＝「待機」とする。
【０１４５】
図４２は、３層階層におけるコマンド実行開始後の時刻１７の状態を示す説明図である。図４２では、時刻１６から、ノードＣがコマンドＲＰＣ＿ｂの処理を完了した時刻となる時刻１７の状態を示す。
【０１４６】
時刻１７におけるメッセージ管理表ｍ＿Ｋについては、図４１に示したままである。時刻１７におけるメッセージ管理表ｍ＿Ａについては、図４０に示したままである。時刻１７におけるメッセージ管理表ｍ＿Ｃ＿Ａについて、コマンドＲＰＣ＿ｂの処理を完了すると、ノードＣは、ＥＮＴ（０）．レスポンス状態＝「送信可」に設定する。
【０１４７】
図４３は、３層階層におけるコマンド実行開始後の時刻１８の状態を示す説明図である。図４３では、時刻１７から、ノードＣがＥＮＴ（０）．レスポンス状態＝「送信可」に設定した直後の時刻１８の状態を示す。
【０１４８】
時刻１８におけるメッセージ管理表ｍ＿Ｋについては、図４１に示したままである。時刻１８におけるメッセージ管理表ｍ＿Ａについては、図４０に示したままである。時刻１８におけるメッセージ管理表ｍ＿Ｃ＿Ａについて、ノードＣは、ＸＩＤ＝５５０１のメッセージに対するレスポンスをノードＡに送信する。そして、ノードＡは、ＥＮＴ（０）．活性＝「無効」にする。
【０１４９】
図４４は、３層階層におけるコマンド実行開始後の時刻１９の状態を示す説明図である。図４４では、時刻１８から１単位時間経過した時刻１９として、ノードＡが、ＸＩＤ＝５５０１のメッセージに対するレスポンスを受信した状態を示す。
【０１５０】
時刻１９におけるメッセージ管理表ｍ＿Ｋについては、図４１に示したままである。時刻１９におけるメッセージ管理表ｍ＿Ｃ＿Ａについては、図４３に示したままである。時刻１９以降の時刻において、メッセージ管理表ｍ＿Ｃ＿Ａの内容が変化することはないので、時刻１９以降の時刻におけるメッセージ管理表ｍ＿Ｃ＿Ａの記載を省略する。
【０１５１】
時刻１９におけるメッセージ管理表ｍ＿Ａについて、ノードＡは、メッセージ管理表ｍ＿Ａの送信ＸＩＤを参照して、ノードＣから受信したレスポンスが、ＥＮＴ（１）．ＸＩＤ＝５５０１のメッセージに対するレスポンスであることを特定する。ノードＡは、ＥＮＴ（１）．実行ステップ番号＝１、ＥＮＴ（１）．実行ステップ状態＝「待機」にする。そして、ノードＡは、コマンドＲＰＣ＿ｂの処理を完了すると、ＥＮＴ（１）．レスポンス状態＝「送信可」にする。
【０１５２】
そして、ノードＡは、ＸＩＤ＝１０１のメッセージに対するレスポンスをクライアントＫに送信する。そして、ノードＡは、ＥＮＴ（１）．活性＝「無効」にする。
【０１５３】
図４５は、３層階層におけるコマンド実行開始後の時刻２０の状態を示す説明図である。図４５では、時刻１９から１単位時間経過した時刻２０として、クライアントＫが、ＸＩＤ＝１０１のメッセージに対するレスポンスを受信した状態を示す。
【０１５４】
時刻２０におけるメッセージ管理表ｍ＿Ａについては、図４４で示したままである。時刻２０におけるメッセージ管理表ｍ＿Ｋについて、クライアントＫは、メッセージ管理表ｍ＿Ａの送信ＸＩＤを参照して、ノードＡから受信したレスポンスが、ＥＮＴ（１）．ＸＩＤ＝１０１のメッセージに対するレスポンスであることを特定する。クライアントＫは、ＥＮＴ（１）．実行ステップ番号＝１、ＥＮＴ（１）．実行ステップ状態＝「待機」にする。そして、クライアントＫは、ＥＮＴ（１）．活性＝「無効」にする。
【０１５５】
図４６は、メッセージ送信時における経路情報の判断対象の順序の一例を示す説明図である。図４６では、ノードが、メッセージが送信可能か否かを判断する際に、メッセージ管理表ｍのステップ経路の判断対象の順序について説明する。ノードは、送信対象のメッセージに先行するメッセージのステップ経路を、エントリ番号の大きい順から判断対象にする。さらに、ノードは、送信対象のメッセージに先行するメッセージのステップ経路において、総ステップ番号−１のステップから判断対象にする。
【０１５６】
図４６では、送信対象のメッセージのエントリ番号がｉである場合の例を示す。ノードは、まず、エントリ番号がｉ−１のステップ経路のうち、総ステップ番号−１のステップから順に判断対象にする。ここで、判断対象のステップ経路に含まれるノード群が、図４における第１のノード群に相当する。また、送信対象のメッセージのステップ経路に含まれるノード群が、図４における第２のノード群に相当する。判断対象としたステップ経路が、送信対象のメッセージのステップ経路と全く干渉しなければ、総ステップ番号−２のステップを判断対象にする。このように、ノードは、判断対象にするステップをデクリメントする。
【０１５７】
また、判断対象が実行ステップ番号のステップになる場合がある。このとき、ノードは、判断対象としたステップ経路が送信対象のメッセージのステップ経路と全く干渉しない、または、送信対象のメッセージのステップ経路の先頭のノードに対してメッセージを送信中かを判断する。判断対象としたステップ経路が送信対象のメッセージのステップ経路と全く干渉しない、または、送信対象のメッセージのステップ経路の先頭のノードに対してメッセージを送信中であれば、ノードは、判断対象にするエントリをデクリメントする。
【０１５８】
図４７は、コマンド実行開始から完了までにかかる時間の比較の一例を示す説明図である。図４７の（ａ）は、同期実行を行った場合のコマンド実行開始から終了までにかかる時間を示し、図４７の（ｂ）は、本実施の形態における分散処理方法を行った場合のコマンド実行開始から終了までにかかる時間を示す。図４７の（ａ）と図４７の（ｂ）で共通する設定として、ノードＡ、Ｂ、Ｃが、２つのコマンドとして、ＲＰＣ＿ａとＲＰＣ＿ｂとを順に実行する。図４７の（ａ）と図４７の（ｂ）とでは、一点鎖線の矢印が、ＲＰＣ＿ａを示し、点線の矢印が、ＲＰＣ＿ｂを示す。また、図４７の（ａ）と図４７の（ｂ）における黒丸が、各ノードでのＲＰＣの処理を示す。そして、メッセージとレスポンスとの送信にかかる時間を１単位時間とする。また、ノードＡでの処理時間を１単位時間とし、ノードＢ、Ｃの処理時間を０単位時間とする。
【０１５９】
図４７の（ａ）では、ＲＰＣ＿ａを開始してからＲＰＣ＿ｂが終了するまで６単位時間となる。具体的には、時刻ｔ０において、ノードＡは、ＲＰＣ＿ａのメッセージをノードＢに送信する。次に、時刻ｔ０から１単位時間後の時刻ｔ１において、ノードＢは、ＲＰＣ＿ａのメッセージをノードＣに送信する。そして、時刻ｔ１から１単位時間後の時刻ｔ２において、ノードＣは、ＲＰＣ＿ａのレスポンスをノードＢに送信する。次に、時刻ｔ２から１単位時間後の時刻ｔ３において、ノードＢは、ＲＰＣ＿ａのレスポンスをノードＡに送信する。そして、時刻ｔ３から１単位時間後の時刻ｔ４において、ノードＡは、ＲＰＣ＿ａの処理を完了する。
【０１６０】
また、時刻ｔ４において、ノードＡは、ＲＰＣ＿ｂのメッセージをノードＢに送信する。次に、時刻ｔ４から１単位時間後の時刻ｔ５において、ノードＢは、ＲＰＣ＿ｂのレスポンスをノードＡに送信する。そして、時刻ｔ５から１単位時間後の時刻ｔ６において、ノードＡは、ＲＰＣ＿ｂの処理を完了する。
【０１６１】
図４７の（ｂ）では、ＲＰＣ＿ａを開始してからＲＰＣ＿ｂが終了するまで５単位時間となる。具体的には、時刻ｔ０において、ノードＡは、ＲＰＣ＿ａのメッセージをノードＢに送信する。次に、時刻ｔ０から１単位時間後の時刻ｔ１において、ノードＢは、ＲＰＣ＿ａのメッセージをノードＣに送信する。また、時刻ｔ１において、ノードＡは、ＲＰＣ＿ｂのメッセージをノードＢに送信する。そして、時刻ｔ１から１単位時間後の時刻ｔ２において、ノードＣは、ＲＰＣ＿ａのレスポンスをノードＢに送信する。また、時刻ｔ２において、ノードＢは、ＲＰＣ＿ａのレスポンスを送信していないため、ＲＰＣ＿ｂのレスポンスの送信をペンディングする。次に、時刻ｔ３において、ノードＢは、ＲＰＣ＿ａのレスポンスをノードＡに送信する。また、時刻ｔ３において、ノードＢは、ＲＰＣ＿ａのレスポンスを送信中であり送信が完了していないため、ＲＰＣ＿ｂのレスポンスの送信をペンディングする。
【０１６２】
そして、時刻ｔ３から１単位時間後の時刻ｔ４において、ノードＡは、ＲＰＣ＿ａの処理を完了する。また、時刻ｔ４において、ノードＢは、ＲＰＣ＿ｂのレスポンスをノードＡに送信する。そして、時刻ｔ４から１単位時間後の時刻ｔ５において、ノードＡは、ＲＰＣ＿ｂの処理を完了する。
【０１６３】
このように、本実施の形態における分散処理方法は、コマンド実行開始から完了までにかかる時間を、同期実行による方法に比べて１単位時間短縮することができる。また、同期実行による方法では、待ち合わせポイントが、ノードＡであるのに対し、本実施の形態における分散処理方法では、待ち合わせポイントが、ノードＢとなる。
【０１６４】
次に、図４８〜図５３を用いて、ノードＡ、Ｂ、Ｃ、…が実行する、メッセージ受信処理、メッセージ送信処理、レスポンス送信処理、レスポンス受信処理のフローチャートを説明する。また、メッセージ受信処理、メッセージ送信処理、レスポンス送信処理、レスポンス受信処理は、各ノードが行うが、以下では、ノードＡが実行する例を用いて説明を行う。また、クライアントＫは、メッセージ送信処理と、レスポンス受信処理とを行う。クライアントＫが行うメッセージ送信処理と、レスポンス受信処理とは、ノードが行うメッセージ送信処理と、レスポンス受信処理と同一である。
【０１６５】
図４８は、メッセージ受信処理手順の一例を示すフローチャートである。メッセージ受信処理は、メッセージを受信した際に行う処理である。ノードＡは、受け付けたデコード済のメッセージを基にして、メッセージ管理表ｍに、エントリを登録する（ステップＳ４８０１）。次に、ノードＡは、実行スレッドに、登録したエントリ番号を記憶する（ステップＳ４８０２）。そして、ノードＡは、実行スレッドを開始する（ステップＳ４８０３）。ステップＳ４８０３の処理終了後、ノードＡは、メッセージ受信処理を終了する。
【０１６６】
図４９は、メッセージ送信処理手順の一例を示すフローチャート（その１）である。また、図５０は、メッセージ送信処理手順の一例を示すフローチャート（その２）である。また、図５１は、メッセージ送信処理手順の一例を示すフローチャート（その３）である。メッセージ送信処理は、メッセージを送信する際に行う処理である。
【０１６７】
ノードＡは、記憶しておいた実行スレッドのエントリ番号ｋを取得する（ステップＳ４９０１）。ステップＳ４９０１において、実行主体がクライアントＫであれば、クライアントＫは、メッセージを送信する際にメッセージ管理表ｍにエントリを登録し、登録したエントリ番号ｋを取得する。
【０１６８】
次に、ノードＡは、メッセージ管理表ｍから、ｋ番目のエントリを取得する（ステップＳ４９０２）。そして、ノードＡは、ＥＮＴ（ｋ）．実行ステップ番号を取得する（ステップＳ４９０３）。以下、説明の省略のため、ＥＮＴ（ｋ）．実行ステップ番号＝ｉとする。次に、ノードＡは、ＥＮＴ（ｋ）．ステップ経路（ｉ）を取得する（ステップＳ４９０４）。そして、ノードＡは、ＥＮＴ（ｋ）．ステップ経路（ｉ）の先頭ノードをノードＤとして選択する（ステップＳ４９０５）。
【０１６９】
次に、ノードＡは、ｊをｋ−１に設定する（ステップＳ５００１）。そして、ノードＡは、ＥＮＴ（ｊ）．活性が「有効」であるか否かを判断する（ステップＳ５００２）。ＥＮＴ（ｊ）．活性が「有効」である場合（ステップＳ５００２：Ｙｅｓ）、ノードＡは、ｈをＥＮＴ（ｊ）．総ステップ数−１に設定する（ステップＳ５００３）。次に、ノードＡは、ＥＮＴ（ｊ）．ステップ経路（ｈ）のノード群と、ＥＮＴ（ｋ）．ステップ経路（ｉ）のノード群との両方に含まれるノードがあるか否かを判断する（ステップＳ５００４）。
【０１７０】
２つのノード群に含まれるノードがある場合（ステップＳ５００４：Ｙｅｓ）、ノードＡは、続けて、次の条件が満たされるか否かを判断する（ステップＳ５００５）。次の条件とは、ＥＮＴ（ｊ）．実行ステップ番号がｈであり、かつ、ＥＮＴ（ｊ）．実行ステップ状態が「送信中」であり、ＥＮＴ（ｊ）．ステップ経路（ｈ）の先頭ノードがノードＤであるかである。前述の条件が満たされない場合（ステップＳ５００５：Ｎｏ）、ノードＡは、送信待機表ｓにｋを登録する（ステップＳ５００６）。ステップＳ５００６の終了後、ノードＡは、メッセージ送信処理を終了する。
【０１７１】
一方、前述の条件が満たされる場合（ステップＳ５００５：Ｙｅｓ）、または、２つのノード群に含まれるノードがない場合（ステップＳ５００４：Ｎｏ）、ノードＡは、ｈをデクリメントする（ステップＳ５００７）。そして、ノードＡは、ｈがＥＮＴ（ｊ）．実行ステップ番号以上か否かを判断する（ステップＳ５００８）。ｈがＥＮＴ（ｊ）．実行ステップ番号以上である場合（ステップＳ５００８：Ｙｅｓ）、ノードＡは、ステップＳ５００４の処理に移行する。
【０１７２】
一方、ｈがＥＮＴ（ｊ）．実行ステップ番号未満である場合（ステップＳ５００８：Ｎｏ）、ノードＡは、ｊをデクリメントする（ステップＳ５００９）。そして、ノードＡは、ｊが０以上か否かを判断する（ステップＳ５０１０）。ｊが０以上である場合（ステップＳ５０１０：Ｙｅｓ）、ノードＡは、ステップＳ５００２の処理に移行する。
【０１７３】
一方、ｊが０未満である場合（ステップＳ５０１０：Ｎｏ）、または、ＥＮＴ（ｊ）．活性が「有効」でない場合（ステップＳ５００２：Ｎｏ）、ノードＡは、ＧＥＴ＿ＳＥＳＳＩＯＮ（Ｄ）によりノードＤ向けのセションＳＥＳＳを獲得する（ステップＳ５１０１）。ここで、ステップＳ５００２で、Ｎｏとなる場合に、０からｊ−１を確認しなくてよい理由は、あるｊでＥＮＴ（ｊ）．活性＝＝「無効」である場合、０〜ｊ−１の活性も「無効」となっているためである。また、ＧＥＴ＿ＳＥＳＳＩＯＮ（）は、セションを獲得する関数である。また、ステップＳ５１０１を実行する時点で、送信対象のメッセージに先行するメッセージは、全く干渉しない経路であるか、または、同一の宛先となるノードＤへの送信中であるか、のどちらかに該当する。このときは、ノードＡは、先行するメッセージのレスポンスを待たずにメッセージを送信する。
【０１７４】
次に、ノードＡは、ＧＥＴ＿ＸＩＤ（）により得られた値をＥＮＴ（ｋ）．送信ＸＩＤに設定する（ステップＳ５１０２）。ＧＥＴ＿ＸＩＤ（）は、メッセージのＸＩＤを獲得する関数である。そして、ノードＡは、ＥＮＴ（ｋ）．実行ステップ状態を「送信中」に設定する（ステップＳ５１０３）。次に、ノードＡは、送信対象のメッセージのＸＩＤをＥＮＴ（ｋ）．送信ＸＩＤに設定する（ステップＳ５１０４）。次に、ノードＡは、送信対象のメッセージの経路情報をＥＮＴ（ｋ）．ステップ経路（ｉ）に設定する（ステップＳ５１０５）。そして、ノードＡは、送信対象のメッセージをシリアライズする（ステップＳ５１０６）。次に、ノードＡは、ＳＥＳＳから、シリアライズした送信対象のメッセージを送信する（ステップＳ５１０７）。ステップＳ５１０７の処理終了後、ノードＡは、メッセージ送信処理を終了する。ステップＳ５１０７の処理終了後、実行スレッドは、レスポンス受信待ちで待機する。
【０１７５】
図５２は、レスポンス送信処理手順の一例を示すフローチャートである。レスポンス送信処理は、レスポンスを送信する際に行う処理である。レスポンスの送信は、実行スレッドのＲＰＣ処理の最後に行われる。レスポンス送信処理では、レスポンス送信対象のスレッドの直前の実行スレッドの処理終了と直前の実行スレッドの終了によるレスポンス送信終了を待ち合わせることになる。
【０１７６】
ノードＡは、実行スレッドのエントリ番号ｋを取得する（ステップＳ５２０１）。次に、ノードＡは、ＥＮＴ（ｋ）．レスポンス状態を「送信可」に設定する（ステップＳ５２０２）。そして、ノードＡは、ｊを０に設定する（ステップＳ５２０３）。次に、ノードＡは、ＥＮＴ（ｊ）．活性が「有効」か否かを判断する（ステップＳ５２０４）。ＥＮＴ（ｊ）．活性が「有効」である場合（ステップＳ５２０４：Ｙｅｓ）、ノードＡは、続けて、ＥＮＴ（ｊ）．レスポンス状態が「送信可」であるか否かを判断する（ステップＳ５２０５）。ＥＮＴ（ｊ）．レスポンス状態が「送信可」である場合（ステップＳ５２０５：Ｙｅｓ）、ノードＡは、送信対象のレスポンスのＸＩＤをＥＮＴ（ｊ）．ＸＩＤに設定する（ステップＳ５２０６）。また、ノードＡは、送信対象のレスポンスの各フィールドに値を設定する。具体的には、ノードＡは、ノード送信対象のレスポンスのレスポンス固有パラメータに、実行スレッドの処理結果を格納する。
【０１７７】
そして、ノードＡは、送信対象のレスポンスをシリアライズする（ステップＳ５２０７）。次に、ノードＡは、入力ＳＥＳＳから、シリアライズした送信対象のレスポンスを送信する（ステップＳ５２０８）。そして、ノードＡは、ＥＮＴ（ｊ）．活性を「無効」に設定する（ステップＳ５２０９）。
【０１７８】
ステップＳ５２０９の処理終了後、または、ＥＮＴ（ｊ）．活性が「無効」である場合（ステップＳ５２０４：Ｎｏ）、ノードＡは、ｊをインクリメントする（ステップＳ５２１０）。そして、ノードＡは、ｊがメッセージ管理表ｍの最大エントリ数−１以下か否かを判断する（ステップＳ５２１１）。ｊがメッセージ管理表ｍの最大エントリ数−１以下である場合（ステップＳ５２１１：Ｙｅｓ）、ノードＡは、ステップＳ５２０４の処理に移行する。
【０１７９】
一方、ｊがメッセージ管理表ｍの最大エントリ数−１より大きい場合（ステップＳ５２１１：Ｎｏ）、または、ＥＮＴ（ｊ）．レスポンス状態が「送信可」でない場合（ステップＳ５２０５：Ｎｏ）、ノードＡは、レスポンス送信処理を終了する。
【０１８０】
図５３は、レスポンス受信処理手順の一例を示すフローチャートである。レスポンス受信処理は、レスポンスを受信する際に行う処理である。ノードＡは、ＲＸＩＤをレスポンスのＸＩＤに設定する（ステップＳ５３０１）。次に、ノードＡは、ＦＩＮＤ（メッセージ管理表．送信ＸＩＤ，ＲＸＩＤ）により得られたエントリ番号をｋに設定する（ステップＳ５３０２）。ここで、ＦＩＮＤ（メッセージ管理表．送信ＸＩＤ，ＲＸＩＤ）は、メッセージ管理表ｍの各エントリの送信ＸＩＤとＲＸＩＤとを比較し、一致したエントリ番号を出力する関数である。
【０１８１】
そして、ノードＡは、ＥＮＴ（ｋ）．実行ステップ状態を「待機」に設定する（ステップＳ５３０３）。次に、ＥＮＴ（ｋ）．実行ステップ番号をインクリメントする（ステップＳ５３０４）。そして、ノードＡは、ｊを０に設定する（ステップＳ５３０５）。次に、ノードＡは、ｋを送信待機表ｓのｊ番目のレコードが示すエントリ番号に設定する（ステップＳ５３０６）。そして、ノードＡは、送信待機表ｓのｊ番目のレコードを削除する（ステップＳ５３０７）。次に、ノードＡは、エントリ番号ｋに対するメッセージ送信処理を実行する（ステップＳ５３０８）。メッセージ送信処理は、図４９〜５１で示したメッセージ送信処理である。ここで、ノードＡは、メッセージ送信処理内において、ステップＳ４９０１の代わりに、引数として与えたエントリ番号ｋを用いて処理を続行する。
【０１８２】
ステップＳ５３０８の処理終了後、ノードＡは、ｊをインクリメントする（ステップＳ５３０９）。次に、ノードＡは、ｊが送信待機表ｓの最大エントリ数−１以下か否かを判断する（ステップＳ５３１０）。ｊが送信待機表ｓの最大エントリ数−１以下である場合（ステップＳ５３１０：Ｙｅｓ）、ノードＡは、ステップＳ５３０６の処理に移行する。一方、ｊが送信待機表ｓの最大エントリ数−１より大きい場合（ステップＳ５３１０：Ｎｏ）、ノードＡは、レスポンス受信処理を終了する。
【０１８３】
以上説明したように、本実施の形態によるノードＡによれば、クライアントＫから順次受け付けた各ＲＰＣ処理要求の受付順序を記憶し、各ＲＰＣ処理が完了した際に各ＲＰＣ処理の結果を受付順序に従いクライアントＫに送信する。これにより、ノードＡは、複数のＲＰＣ処理の順序を変わらないことを保証しつつ、複数のＲＰＣ処理にかかる時間を短くすることができる。
【０１８４】
また、ノードＡによれば、あるＲＰＣを実行するノードが前のＲＰＣを実行している装置と同じであれば、受け付けた順序で実行させることになり実行順序は実行するノード内部の排他制御により保つことができるので、あるＲＰＣをすぐ実行させてもよい。これにより、前のＲＰＣとあるＲＰＣとの処理を安全に重ね合わせることにより、ノードＡは、前のＲＰＣと、あるＲＰＣとの順序を保ちつつ、前のＲＰＣのレスポンスを待たなくてよいため、あるＲＰＣのレスポンスを早く受け付けることができる。
【０１８５】
また、ノードＡによれば、あるＲＰＣを実行するノード群の先頭に実行させるノードが前の処理を実行しているノードと同じであれば、あるＲＰＣをすぐ実行させてもよい。これは、受け付けた順序で実行させることになり実行順序は実行するノード内部の排他制御により保てるためである。これにより、前のＲＰＣと、あるＲＰＣとの順序を保ちつつ、前のＲＰＣのレスポンスを待たなくてよいため、あるＲＰＣのレスポンスを早く受け付けることができる。
【０１８６】
また、ノードＡによれば、前の処理を実行しているノード、またはこれから実行する第１のノード群と、あるＲＰＣを実行する第２のノード群と、の両方に含まれるノードがなければ、第２のノード群にあるＲＰＣをすぐに実行させてもよい。この場合、第１のノード群と第２のノード群が干渉していないため、あるＲＰＣをすぐ実行させることができ、あるＲＰＣのレスポンスを早く受け付けることができる。
【０１８７】
また、ノードＡによれば、データが送信された順序に従ってデータを受け付けることを保証する通信プロトコルを用いてＲＰＣをノードＢ、Ｃ、…のいずれかに送信してもよい。これにより、同一の宛先においてＲＰＣの到着順序が変わらないため、複数のＲＰＣの順序を保証することができる。同様に、ノードＡによれば、クライアントＫから複数のＲＰＣを順次受け付ける際や、ＲＰＣのレスポンスをクライアントＫに送信する際にも通信プロトコルを用いてもよい。これにより、クライアントＫから複数のＲＰＣの到着順序、また、ＲＰＣのレスポンスの到着順序を変えることがない。
【０１８８】
また、分散処理システム２００によれば、待ち合わせが発生する装置が、分散処理システム２００内のノードとなる。これに対し、同期実行を行う場合、待ち合わせが発生する装置は、同期実行を行うクライアントとなる。また、分散処理システム２００によれば、コマンド処理の重ね合わせが最大限行われるため、レイテンシを短縮させることができる。
【０１８９】
なお、本実施の形態で説明した分散処理方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本分散処理プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本分散処理プログラムは、インターネット等のネットワークを介して配布してもよい。
【０１９０】
上述した実施の形態１、２に関し、さらに以下の付記を開示する。
【０１９１】
（付記１）要求元装置から複数の処理の各々の処理の処理要求を順次受け付けて自装置または他装置のいずれかに前記各々の処理を実行させる際に、前記各々の処理の処理要求を前記要求元装置から受け付けた順序を示す順序情報を記憶し、
前記自装置または前記他装置のいずれかが前記各々の処理を完了したことに応じて、前記各々の処理の処理結果を前記順序情報が示す順序に従って前記要求元装置に送信する、
制御部を有することを特徴とする分散処理装置。
【０１９２】
（付記２）前記制御部は、
前記各々の処理の処理要求を受け付けた場合、前記順序情報により特定される前記各々の処理の前の処理を実行させている装置と、前記各々の処理を実行させる装置とが同一であれば、当該装置に前記各々の処理の処理要求を送信することを特徴とする付記１に記載の分散処理装置。
【０１９３】
（付記３）前記制御部は、
前記各々の処理の処理要求を受け付けた場合、前記順序情報により特定される前記各々の処理の前の処理を分散した部分処理を実行させている１つの装置と、前記各々の処理を分散して実行させる装置群のうちの先頭に実行させる装置とが同一であれば、前記１つの装置に前記各々の処理を分散した部分処理の処理要求を送信することを特徴とする付記１または２に記載の分散処理装置。
【０１９４】
（付記４）前記制御部は、
前記各々の処理の処理要求を受け付けた場合、前記順序情報により特定される前記各々の処理の前の処理を分散して実行させている、または実行させる第１の装置群と、前記各々の処理を分散して実行させる第２の装置群との両方に含まれる装置がなければ、前記第２の装置群に前記各々の処理を分散した部分処理の処理要求を送信することを特徴とする付記１〜３のいずれか一つに記載の分散処理装置。
【０１９５】
（付記５）前記制御部は、
データが送信された順序に従って前記データを受け付けることを保証する通信プロトコルを用いて前記各々の処理の処理要求を前記他装置に送信することにより、前記各々の処理を前記他装置に実行させることを特徴とする付記１〜４のいずれか一つに記載の分散処理装置。
【０１９６】
（付記６）前記制御部は、
データが送信された順序に従って前記データを受け付けることを保証する通信プロトコルを用いて前記要求元装置から複数の処理の各々の処理の処理要求を順次受け付けることを特徴とする付記１〜５のいずれか一つに記載の分散処理装置。
【０１９７】
（付記７）前記制御部は、
前記自装置または前記他装置のいずれかが前記各々の処理を完了したことに応じて、データが送信された順序に従って前記データを受け付けることを保証する通信プロトコルを用いて前記各々の処理の処理結果を前記順序情報が示す順序に従って前記要求元装置に送信することを特徴とする付記１〜６のいずれか一つに記載の分散処理装置。
【０１９８】
（付記８）前記制御部は、
前記自装置または前記他装置のいずれかが前記各々の処理を完了したことに応じて、前記順序情報により特定される前記各々の処理の前の処理が完了していれば、前記各々の処理の処理結果を前記要求元装置に送信し、前記前の処理が完了していなければ、前記前の処理が完了して前記前の処理の処理結果を前記要求元装置に送信した後に、前記各々の処理の処理結果を前記要求元装置に送信することを特徴とする付記１〜７のいずれか一つに記載の分散処理装置。
【０１９９】
（付記９）複数の装置を含む分散処理システムであって、
前記複数の装置のうちのいずれかの装置は、
要求元装置から複数の処理の各々の処理の処理要求を順次受け付けて前記複数の装置のうちのいずれかに前記各々の処理を実行させる際に、前記各々の処理の処理要求を前記要求元装置から受け付けた順序を示す順序情報を記憶し、
前記複数の装置のうちのいずれかが前記各々の処理を完了したことに応じて、前記各々の処理の処理結果を前記順序情報が示す順序に従って前記要求元装置に送信する、
ことを特徴とする分散処理システム。
【０２００】
（付記１０）コンピュータに、
要求元装置から複数の処理の各々の処理の処理要求を順次受け付けて前記コンピュータまたは他装置のいずれかに前記各々の処理を実行させる際に、前記各々の処理の処理要求を前記要求元装置から受け付けた順序を示す順序情報を記憶し、
前記コンピュータまたは前記他装置のいずれかが前記各々の処理を完了したことに応じて、前記各々の処理の処理結果を前記順序情報が示す順序に従って前記要求元装置に送信する、
処理を実行させることを特徴とする分散処理プログラム。
【符号の説明】
【０２０１】
Ａ、Ｂ、Ｃ…  ノード
Ｋ  クライアント
１００、２００  分散処理システム
１０１−１、１０１−２  分散処理装置
４００  制御部
４０１  記憶部
４０２  送信部
【図１】
2015210791.tif 000003
【図２】
2015210791.tif 000004
【図３】
2015210791.tif 000005
【図４】
2015210791.tif 000006
【図５】
2015210791.tif 000007
【図６】
2015210791.tif 000008
【図７】
2015210791.tif 000009
【図８】
2015210791.tif 000010
【図９】
2015210791.tif 000011
【図１０】
2015210791.tif 000012
【図１１】
2015210791.tif 000013
【図１２】
2015210791.tif 000014
【図１３】
2015210791.tif 000015
【図１４】
2015210791.tif 000016
【図１５】
2015210791.tif 000017
【図１６】
2015210791.tif 000018
【図１７】
2015210791.tif 000019
【図１８】
2015210791.tif 000020
【図１９】
2015210791.tif 000021
【図２０】
2015210791.tif 000022
【図２１】
2015210791.tif 000023
【図２２】
2015210791.tif 000024
【図２３】
2015210791.tif 000025
【図２４】
2015210791.tif 000026
【図２５】
2015210791.tif 000027
【図２６】
2015210791.tif 000028
【図２７】
2015210791.tif 000029
【図２８】
2015210791.tif 000030
【図２９】
2015210791.tif 000031
【図３０】
2015210791.tif 000032
【図３１】
2015210791.tif 000033
【図３２】
2015210791.tif 000034
【図３３】
2015210791.tif 000035
【図３４】
2015210791.tif 000036
【図３５】
2015210791.tif 000037
【図３６】
2015210791.tif 000038
【図３７】
2015210791.tif 000039
【図３８】
2015210791.tif 000040
【図３９】
2015210791.tif 000041
【図４０】
2015210791.tif 000042
【図４１】
2015210791.tif 000043
【図４２】
2015210791.tif 000044
【図４３】
2015210791.tif 000045
【図４４】
2015210791.tif 000046
【図４５】
2015210791.tif 000047
【図４６】
2015210791.tif 000048
【図４７】
2015210791.tif 000049
【図４８】
2015210791.tif 000050
【図４９】
2015210791.tif 000051
【図５０】
2015210791.tif 000052
【図５１】
2015210791.tif 000053
【図５２】
2015210791.tif 000054
【図５３】
2015210791.tif 000055