(57)【要約】分散処理装置は、タスクを構成する複数の処理のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、このオブジェクト格納部から取り出された継続オブジェクトを実行する処理手段と、当該オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段とを備える。
2012049794.tif 000002
【特許請求の範囲】
【請求項１】
タスクを構成する複数の処理のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、
前記オブジェクト格納部から取り出された前記継続オブジェクトを実行する処理手段と、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段と、
を備えることを特徴とする分散処理装置。
【請求項２】
前記処理手段は、前記継続オブジェクトを実行することにより次の継続オブジェクトを生成し、この生成された次の継続オブジェクトを前記オブジェクト格納部に格納した後、前記継続オブジェクトの実行を終了する、
ことを特徴とする請求項１に記載の分散処理装置。
【請求項３】
前記オブジェクト格納部及び前記処理手段を複数備え、
前記各オブジェクト格納部は、それぞれ異なる計算資源を利用する継続オブジェクトを格納し、
前記各処理手段は、各オブジェクト格納部からそれぞれ取り出される継続オブジェクトを並列に実行する、
ことを特徴とする請求項１又は２に記載の分散処理装置。
【請求項４】
同期変数を更に備え、
前記複数の処理手段の少なくとも１つは、実行中の第１の継続オブジェクトにより未定義状態の同期変数の読み出しが行われる場合には、第２の継続オブジェクトをその同期変数に登録した後、第１の継続オブジェクトの実行を終了し、
前記保存処理手段は、前記同期変数に登録されている前記第２の継続オブジェクトを実行状態ファイルに更に保存する、
ことを特徴とする請求項３に記載の分散処理装置。
【請求項５】
データ保持部を更に備え、
前記複数の処理手段の少なくとも１つは、実行中の第１の継続オブジェクトにより空のデータ保持部からのデータ取り出し処理又はデータ保持部への制限を超えるデータ投入処理が行われる場合には、第２の継続オブジェクトをそのデータ保持部に登録した後、第１の継続オブジェクトの実行を終了し、
前記保存処理手段は、前記データ保持部に登録されている前記第２の継続オブジェクトを実行状態ファイルに更に保存する、
ことを特徴とする請求項３又は４に記載の分散処理装置。
【請求項６】
複数のコンピュータから構成される分散処理システムにおいて、
タスクを構成する複数の処理のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、
前記オブジェクト格納部から取り出された前記継続オブジェクトを実行する処理手段と、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段と、
をそれぞれ含む複数のワーカプロセスと、
所定のタイミングで前記各ワーカプロセスに対し前記保存処理手段による保存処理を要求するマスタプロセスと、
を備え、
前記マスタプロセスは、前記保存処理を要求する際には、前記各ワーカプロセスに対し、各実行状態ファイルを保存させる他のワーカプロセスをそれぞれ指定する、
ことを特徴とする分散処理システム。
【請求項７】
前記各ワーカプロセスが有する前記複数のオブジェクト格納部、前記複数の処理手段及び前記保存処理手段を含むスペアワーカプロセスを更に備え、
前記スペアワーカプロセスの保存処理手段は、障害の発生したワーカプロセスが検出された場合に、その障害の発生したワーカプロセスの実行状態ファイルを他のワーカプロセスから取得し、この取得された実行状態ファイルに含まれるデータを前記各オブジェクト格納部にリストアし、
前記障害の発生したワーカプロセス以外のワーカプロセスの保存処理手段は、前記障害の発生したワーカプロセスが検出された場合に、自ワーカプロセスの実行状態ファイルに含まれるデータを前記各オブジェクト格納部にリストアする、
ことを特徴とする請求項６に記載の分散処理システム。
【請求項８】
前記複数のワーカプロセス及び前記スペアワーカプロセスはそれぞれ、各ワーカプロセスについての情報をそれぞれ格納するワーカテーブルを更に含み、
前記マスタプロセスは、前記障害の発生したワーカプロセス以外の各ワーカプロセス及び前記スペアワーカプロセスに対して、前記障害の発生したワーカプロセス及び前記スペアワーカプロセスの各情報を用いて前記各ワーカテーブルを更新させる、
ことを特徴とする請求項７に記載の分散処理システム。
【請求項９】
少なくとも１つのコンピュータが、
タスクを構成する複数の処理のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを生成し、
前記生成された継続オブジェクトをオブジェクト格納部に格納し、
前記オブジェクト格納部から前記継続オブジェクトを取り出し、
前記取り出された継続オブジェクトを実行し、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する、
ことを特徴とする分散処理方法。
【請求項１０】
タスクを構成する複数の処理のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、
前記オブジェクト格納部から取り出された前記継続オブジェクトを実行する処理手段と、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段と、
を少なくとも１つのコンピュータに実現させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分散処理技術に関する。
【背景技術】
【０００２】
従来の分散処理システムの一例が下記非特許文献１に記載されている。この従来の分散処理システムは、ＭａｐＲｅｄｕｃｅと呼ばれ、分散ファイルシステムと、計算を実行する複数のノードとから構成される。分散ファイルシステム上では、一つのファイルが、いくつかの断片（チャンク）に分割されることにより、複数のノードに跨って置かれる。更に、各チャンクは、そのコピーが複数のノードに置かれることによって、信頼性を確保している。【０００３】
このような構成を有する従来の分散処理システムは以下のように動作する。計算は、ＭａｐフェーズとＲｅｄｕｃｅフェーズという二つのフェーズで行われる。計算を実行する各ノードでは、ワーカ（ｗｏｒｋｅｒ）プロセスが動作する。ワーカプロセスは、Ｍａｐフェーズを実行するタスク（以下、Ｍａｐタスクと表記する）及びＲｅｄｕｃｅフェーズを実行するタスク（以下、Ｒｅｄｕｃｅタスクと表記する）の少なくとも一方を割り当てられる。ワーカプロセスはこのように割り当てられたタスクを実行することにより、計算が進行する。【０００４】
Ｍａｐフェーズでは、各ノードのワーカプロセスで動作する各Ｍａｐタスクがそれぞれローカル又はリモートから少なくとも１つの入力ファイルのチャンクを読み込み、ユーザにより定義されたＭａｐ関数を並列に実行する。ここでは、このＭａｐ関数の出力がキーとバリューのペアと仮定する。続いて、ユーザにより定義した分割関数により、どのキーをどのＲｅｄｕｃｅタスクに渡すかが決定される。この決定に基づき、キーとバリューのペアが分類され、そのペアがローカルディスクに保存される。【０００５】
続いて、Ｒｅｄｕｃｅタスクが自身の担当するキーとバリューのペアを各ノードに要求して受信する。Ｒｅｄｕｃｅタスクは、同じキー毎にバリューをまとめ、このまとめられたデータを入力としてユーザにより定義されたＲｅｄｕｃｅ関数を実行する。各Ｒｅｄｕｃｅタスクは、計算結果をそれぞれ別ファイルとして分散ファイルシステム上に出力する。【０００６】
従来の分散処理システムは、このような動作過程においてノードに障害が発生した場合には、次のように動作する。まず、当該分散処理システムは、障害が発生したノードにおいて実行を完了した全てのＭａｐタスクを別のノードで再実行する。これは、Ｍａｐタスクの出力が障害の生じたノード上のローカルディスクに保存されているためである。このように再実行が行われた場合、データ入力元が変わるため、ワーカプロセスにその旨が伝えられる。なお、Ｒｅｄｕｃｅタスクは再実行されなくてもよい。これは、実行完了後の結果が既に分散ファイルシステム上に保存されているためである。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】Jeffrey Dean, Sanjay Ghemawat, "MapReduce: Simplified Data Processing on Large Clusters", OSDI, pages 137-150, 2004
【発明の概要】
【０００８】
上述したように、従来の分散処理システムとしてのＭａｐＲｅｄｕｃｅにおいてノードに障害が発生した場合には、障害が発生したノードにおいて実行を完了した全てのＭａｐタスクを再実行しなければならない。つまり、従来の分散処理システムでは、タスクの処理途中における実行状態が保存されず、タスクの処理途中における実行状態に回復することができない。よって、システム全体の復帰時間が遅れる恐れがある。
【０００９】
ＭａｐＲｅｄｕｃｅは、入出力結果を高信頼な分散ファイルシステム上に保存することにより、高信頼化が図られている。よって、ユーザは、高信頼化を望む場合には、記述したいアルゴリズムをＭａｐＲｅｄｕｃｅにより提供される枠組みで動作するように変更する必要がある。
【００１０】
本発明の目的は、柔軟性があり信頼性の高い分散処理技術を提供することにある。
【００１１】
本発明の各態様では、上述した課題を解決するために、それぞれ以下の構成を採用する。
【００１２】
本発明の第１の態様は、分散処理装置に関する。第１の態様に係る分散処理装置は、タスクを構成する複数の処理のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、このオブジェクト格納部から取り出された継続オブジェクトを実行する処理手段と、当該オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段とを備える。
【００１３】
本発明の第２の態様は、複数のコンピュータから構成される分散処理システムに関する。第２の態様に係る分散処理システムは、複数のワーカプロセスとマスタプロセスとを備える。各ワーカプロセスは、タスクを構成する複数の処理のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、このオブジェクト格納部から取り出された継続オブジェクトを実行する処理手段と、当該オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段と、をそれぞれ含む。マスタプロセスは、所定のタイミングで各ワーカプロセスに対し上記保存処理手段による保存処理を要求し、この保存処理を要求する際には、各ワーカプロセスに対し、各実行状態ファイルを保存させる他のワーカプロセスをそれぞれ指定する。
【００１４】
また、本発明の別態様は、少なくとも１つのコンピュータが上記各構成の処理をそれぞれ実行する分散処理方法であってもよいし、当該各構成を少なくとも１つのコンピュータに実現させるプログラムであってもよいし、このようなプログラムを格納したコンピュータに読み取り可能な記憶媒体であってもよい。この記憶媒体は、非一時的な有形の媒体を含む。
【００１５】
本発明によれば、柔軟性があり信頼性の高い分散処理技術を提供することができる。
【図面の簡単な説明】
【００１６】
【図１】図１は、第１実施形態における分散処理装置の構成例を示す概念図である。
【図２Ａ】図２Ａは、一般的なタスクプログラムの例を示す図である。
【図２Ｂ】図２Ｂは、第１実施形態における分散処理装置で処理されるタスクプログラムの例を示す図である。
【図３】図３は、継続オブジェクトの生成を実現するプログラムの例を示す図である。
【図４】図４は、第２実施形態における分散処理システムの処理構成例を示す概念図である。
【図５】図５は、第２実施形態におけるワーカの動作例を示すフローチャートである。
【図６】図６は、タスクの処理内容例及び処理タイミング例を示す図である。
【図７】図７は、同期変数の読み出し時の動作例を示すフローチャートである。
【図８】図８は、同期変数への書き込み時の動作例を示すフローチャートである。
【図９】図９は、同期変数を利用したタスクプログラム例を示す図である。
【図１０】図１０は、キューからデータを取り出す際の動作例を示すフローチャートである。
【図１１】図１１は、キューにデータを投入する際の動作例を示すフローチャートである。
【図１２】図１２は、マスタが各ワーカの実行状態を保存する際の動作例を示すフローチャートである。
【図１３】図１３は、第２実施形態の分散処理システムにおけるワーカに障害が発生した場合のリカバリ動作の例を示すフローチャートである。
【図１４】図１４は、第２実施形態における分散処理システムのハードウェア構成例を示す概念図である。
【発明を実施するための形態】
【００１７】
以下、本発明の実施の形態について図面を用いて説明する。尚、すべての図面において、同様な構成要素には同様の符号を付し、適宜説明を省略する。また、以下に挙げた各実施形態はそれぞれ例示であり、本発明は以下の各実施形態の構成に限定されない。
【００１８】
［第１実施形態］
〔装置構成例〕
図１は、第１実施形態における分散処理装置１の構成例を示す概念図である。
分散処理装置１は、図１に示すように、ハードウェア構成として、ＣＰＵ（Central Processing Unit）１０、メモリ（ＲＡＭ（Random Access Memory）１２、ＲＯＭ（Read Only Memory、図示せず）、ハードディスク（ＨＤＤ）１４等）、入出力インタフェース１６等を有する。これら各ハードウェア要素は例えばバス１８により接続される。なお、本実施形態は、分散処理装置１のハードウェア構成を限定しない。
【００１９】
分散処理装置１は、ワーカプロセス２００（以降、単にワーカと表記する場合もある）を有する。ワーカ２００は、オブジェクト格納部２０１、処理部２０２、保存処理部２５０を有する。分散処理装置１は、例えば、メモリに記憶されるプログラムがＣＰＵ１０により実行されることにより、このような各処理部を実現する。
【００２０】
ワーカ２００は、処理対象であるタスク（ジョブ）を受けると、そのタスクを処理する。タスクは、ＭａｐＲｅｄｕｃｅのＭａｐタスクやＲｅｄｕｃｅタスクであってもよいし、ＭａｐＲｅｄｕｃｅ以外のプロジェクトで生成されたタスク（処理対象）であってもよい。このように、ワーカ２００は、タスクを処理するためのフレームワークを実現する。
【００２１】
オブジェクト格納部２０１は、タスクを構成する複数の処理単位のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納する。処理部２０２は、オブジェクト格納部２０１から継続オブジェクトを取り出し、その取り出された継続オブジェクトを実行する。保存処理部２５０は、オブジェクト格納部２０１に格納されるデータを実行状態ファイルに保存する。
【００２２】
このように、ワーカ２００では、オブジェクト格納部２０１に格納される継続オブジェクトが処理部２０２で実行されることにより、タスクが処理される。ここで、継続オブジェクトに含まれる少なくとも１つの処理単位とは、言い換えれば、タスク（プログラム）の実行においてある時点から後に行われる処理を表す概念である。例えば、継続オブジェクトは、Ｃ＋＋におけるメンバ変数及びｒｕｎ（）のようなメンバ関数が定義されたクラスオブジェクトとして実現される。
【００２３】
〔動作例〕
次に、第１実施形態における分散処理装置１の動作例について説明する。
図２Ａは、一般的なタスクプログラムの例を示し、図２Ｂは、第１実施形態における分散処理装置１で処理されるタスクプログラムの例を示す。図３は、継続オブジェクトの生成を実現するプログラムの例である。図２Ａ、図２Ｂ及び図３のプログラム例は、Ｃ＋＋言語で記述された例であるが、本実施形態はこのような記述言語を限定するものではない。
【００２４】
図２Ａ及び図２Ｂは、共に、引数に与えられた変数ａに１を加算した値に２を掛ける処理（＝（ａ＋１）×２）を行うプログラムである。図２Ａで示される一般的なプログラムでは、ｉｎｃ関数でａ＋１が実行され、その結果を引数にｄｂｌ関数が呼び出され、ｄｂｌ関数で引数が２倍され、その結果が出力される。この場合、例えば、ｉｎｃ関数終了時点でのプログラムの実行状態は、Ｃ＋＋のフレームワークが管理するスタック上に置かれている。よって、この時点での実行状態を保存し、かつ、その保存されたデータでリカバリを行うことは難しい。
【００２５】
図２Ｂで示されるタスクが処理される場合には、第１実施形態における分散処理装置１は、２つの継続オブジェクトを生成し、それらをオブジェクト格納部２０１に格納し、処理部２０２がそれらを順次実行する。例えば、変数ａに１が与えられて関数ｓａｍｐｌｅが実行される場合、ｉｎｃ関数及び引数ａ（＝１）を引数としてｍａｋｅ＿ｃｏｎｔ関数が呼び出されることで継続オブジェクトが生成される。この継続オブジェクトは、ｉｎｃ関数を処理単位とし、変数ａの値（＝１）及びｒｅｔポインタをタスクの処理途中のデータとして保持する。そして、この生成された継続オブジェクトを引数にｐｕｔ＿ｃｔｒｌｐｏｏｌ関数が呼び出されることで、その継続オブジェクトがオブジェクト格納部２０１に格納される。
【００２６】
処理部２０２は、オブジェクト格納部２０１からその継続オブジェクトを取り出し、引数で与えられたｉｎｃ関数を引数ａ（＝１）を用いて実行する。図２Ｂの例ではｉｎｃ関数内においてもｍａｋｅ＿ｃｏｎｔ関数が呼び出されるため、処理部２０２は、ｄｂｌ関数及び引数ｘ（＝２）（＝１＋１）を用いて次の継続オブジェクトを生成する。生成された次の継続オブジェクトは、ｄｂｌ関数を処理単位とし、ｉｎｃ関数で計算された変数ｘの値（＝２）及びｒｅｔポインタをタスクの処理途中データとして保持する。
【００２７】
処理部２０２は、この生成された次の継続オブジェクトを引数にｐｕｔ＿ｃｔｒｌｐｏｏｌ関数を呼び出すことで、その継続オブジェクトをオブジェクト格納部２０１に格納する。その後、処理部２０２は、その継続オブジェクトをオブジェクト格納部２０１から取り出し、実行する。これにより、引数ｘ（＝２）を用いてｄｂｌ関数が実行され、変数ｒｅｔの値が４に設定されることで処理が完了する。
【００２８】
このような例によれば、ｉｎｃ関数の処理が終了した時点でのタスクの実行状態は、オブジェクト格納部２０１に格納されている継続オブジェクトが保持している。すなわち、その継続オブジェクトにより、ｉｎｃ関数で計算された変数ｘの値（＝２）が保持されている。よって、保存処理部２５０がこの継続オブジェクトを実行状態ファイルに保存することで、その後、処理部２０２にこの継続オブジェクトを処理させることが可能となる。
【００２９】
このように、第１実施形態によれば、タスクの実行途中の状態を反映する継続オブジェクトを実行状態ファイルに保存することができるため、ワーカ２００におけるタスク実行途中の状態を容易に保存することができる。このような効果は、処理対象のタスクを限定することなく、ワーカ２００で実現されるため、様々なタスクを処理対象とすることができ、ひいては、柔軟なシステム構築が可能となる。
【００３０】
上述したｍａｋｅ＿ｃｏｎｔ関数は、図３の例のように実現することができる。図３（ａ）の例では、ｍａｋｅ＿ｃｏｎｔ関数は、テンプレート関数として実現されている。ｍａｋｅ＿ｃｏｎｔ関数中では、テンプレートクラスであるＲｅａｌＣｏｎｔ２クラスのオブジェクトが生成され、このオブジェクトが返される。ここで、図３（ａ）の例は、継続オブジェクト（ＲｅａｌＣｏｎｔ２クラスのオブジェクト）が２つの引数を持つ関数に対応しているが、本実施形態は、このような継続オブジェクトに限定しない。例えば、様々な数の引数を持つ関数に対応するようなクラスライブラリを用意するようにすればよい。
【００３１】
図３（ｂ）には、Ｃｏｎｔクラスの定義が示される。Ｃｏｎｔクラスには、ｒｕｎ（）メンバ関数及びｓｅｔ＿ａｒｇ１（）メンバ関数が定義される。ｓｅｔ＿ａｒｇ１（）メンバ関数は、後述する同期変数及びキューを扱う際に利用される。
【００３２】
図３（ｃ）には、ＲｅａｌＣｏｎｔ２クラスの定義が示される。コンストラクタでは、与えられた引数がメンバ変数に保存される。また、ｒｕｎ（）メンバ関数が定義され、このｒｕｎ（）メンバ関数により、関数ポインタと引数を使ってその関数ポインタで示される関数が実行される。
【００３３】
このような継続オブジェクトの生成関数及び継続オブジェクトをオブジェクト格納部２０１へ投入する関数は、ライブラリとして実現されてもよい。このライブラリは、予めワーカ２００に含まれていてもよいし、他のプロセスから送られるようにしてもよい。
【００３４】
上述の動作例で示されたように、処理部２０２は、継続オブジェクトを実行することにより次の継続オブジェクトを生成し、この生成された次の継続オブジェクトをオブジェクト格納部２０１に格納した後、上記継続オブジェクトの実行を終了するようにしてもよい。このようにすれば、継続オブジェクトの実行が次の継続オブジェクトのオブジェクト格納部２０１への格納後に終了するため、その終了時点で処理部２０２の処理を一時停止させることができ、結果としてタスクの実行途中の状態を確実に保存することができる。
【００３５】
各継続オブジェクトは、その処理時間が十分短くなるように区分けされたものであることが望ましい。例えば、繰り返し数の多いループやブロック処理など、実行時間が長くなる処理がタスクに含まれる場合には、残りの処理を継続オブジェクトにし、オブジェクト格納部２０１に投入するようタスクのプログラムが記述されることが望ましい。このようにすれば、従来手法では、タスクの処理を一旦開始するとその処理が終了するまで、タスクオブジェクトの実行が継続されるのに対して、本実施形態によれば、途中でタスクの処理を停止させることができる。具体的には、処理部２０２が１つの継続オブジェクトの処理を終了し、次の継続オブジェクトを取り出す前の時点でその処理部２０２を一時停止させることができる。結果、オブジェクト格納部２０１内のデータを保存することで、その時点での実行状態が確実に保存されることになる。
【００３６】
［第２実施形態］
図４は、第２実施形態における分散処理システム２の処理構成例を示す概念図である。
第２実施形態における分散処理システム２は、複数のワーカ２００、各ワーカ２００を制御するマスタプロセス（以降、単にマスタと表記する場合もある）１００、スペアワーカプロセス（以降、単にスペアワーカと表記する場合もある）３００等を有する。なお、第２実施形態における分散処理システム２のハードウェア構成については後述する。
【００３７】
〔ワーカプロセス〕
第２実施形態では、各ワーカ２００は、制御用継続プール２１１、制御処理スレッド２１２、計算用継続プール２１３、計算処理スレッド２１４、ディスク用継続プール２１５、ディスク処理スレッド２１６、ネットワーク用継続プール２１７、ネットワーク処理スレッド２１８、同期変数２２０、同期変数テーブル２２５、キュー２３０、キューテーブル２３５、保存処理部２５０、要求応答部２６０、ワーカテーブル２７０等を有する。
【００３８】
制御用継続プール２１１、計算用継続プール２１３、ディスク用継続プール２１５及びネットワーク用継続プール２１７は、第１実施形態におけるオブジェクト格納部２０１に相当する。つまり、第２実施形態における各ワーカ２００は、複数のオブジェクト格納部２０１をそれぞれ有する。図４の例に示されるように、各オブジェクト格納部２０１がそれぞれ異なる計算資源を利用する継続オブジェクトを格納するように構成されるのが好ましい。以降、制御用継続プール２１１、計算用継続プール２１３、ディスク用継続プール２１５及びネットワーク用継続プール２１７を単に継続プールと表記する場合もある。
【００３９】
計算用継続プール２１３は、タスクの中で計算のみを行う部分を処理単位とする継続オブジェクトを格納する。ディスク用継続プール２１５は、タスクの中でハードディスク１４に対する入出力処理のみを処理単位とする継続オブジェクトを格納する。ネットワーク用継続プール２１７は、入出力インタフェース１６に含まれるネットワークインタフェースに対する入出力処理のみを処理単位とする継続オブジェクトを格納する。制御用継続プール２１１は、上記以外の処理を処理単位とする継続オブジェクトを格納する。図２Ｂ及び図３の例におけるｐｕｔ＿ｃｔｒｌｐｏｏｌ関数が制御用継続プール２１１に継続オブジェクトを格納する関数であるとすれば、例えば、各継続プールに格納するための各関数（ｐｕｔ＿ｎｅｔｗｏｒｋｐｏｏｌなど）がそれぞれ用意されることで実現可能である。
【００４０】
制御用継続プール２１１、計算用継続プール２１３、ディスク用継続プール２１５及びネットワーク用継続プール２１７は、このように複数の継続オブジェクトをそれぞれ格納可能である。各継続プールは、キューやスタックのようなデータの集合を扱う任意のデータ構造でそれぞれ実現される。
【００４１】
制御処理スレッド２１２、計算処理スレッド２１４、ディスク処理スレッド２１６及びネットワーク処理スレッド２１８は、第１実施形態における処理部２０２に相当する。つまり、第２実施形態における各ワーカ２００は、複数の処理部２０２をそれぞれ有する。図４の例では、各処理部２０２がそれぞれ異なる計算資源を利用する継続オブジェクトを実行するように設けられる。計算資源とは、例えば、ハードディスクのメモリ資源であり、ネットワークを利用するためのプロトコルスタックの資源であり、ディスプレイに表示させるための画像処理資源である。もちろん、異なる処理部２０２が同じ計算資源を利用する各継続オブジェクトを処理するようにしてもよい。このように各処理部２０２は、それぞれ実行すべき継続オブジェクトを格納する各オブジェクト格納部２０１にそれぞれ対応付けられており、予め決まったオブジェクト格納部２０１から取得した継続オブジェクトをそれぞれ実行する。
【００４２】
制御処理スレッド２１２は、制御用継続プール２１１から取り出される継続オブジェクトを実行する。計算処理スレッド２１４は、計算用継続プール２１３から取り出される継続オブジェクトを実行する。ディスク処理スレッド２１６は、ディスク用継続プール２１５から取り出される継続オブジェクトを実行する。ネットワーク処理スレッド２１８は、ネットワーク用継続プール２１７から取り出される継続オブジェクトを実行する。このような構成によれば、各継続オブジェクトを並列に実行することができる。以降、制御処理スレッド２１２、計算処理スレッド２１４、ディスク処理スレッド２１６及びネットワーク処理スレッド２１８を単に処理スレッドと表記する場合もある。
【００４３】
各処理スレッドは、継続オブジェクトの処理を完了させる度に、スレッド停止要求の有無を確認する。このスレッド停止要求の有無は、要求応答部２６０から各処理スレッドに通知される。この通知は、要求応答部２６０と各処理スレッドとの間で共有されるメモリにスレッド停止要求の有無を示すデータを書き込むことで実現されてもよい。各処理スレッドは、スレッド停止要求が有ると判断すると、処理を停止する、即ち、対応する継続プールからの継続オブジェクトの取り出しを保留する。
【００４４】
各ワーカ２００は、各継続オブジェクトを並列に実行することができるようにするために、各継続オブジェクト間でデータの同期を取るための機構をそれぞれ有する。この同期機構は、同期変数２２０、同期変数テーブル２２５、キュー２３０、キューテーブル２３５により実現される。
【００４５】
同期変数２２０は、未定義の変数値が読み出し処理されるとその処理がブロックされ、その変数値が定義されるとブロックされていた処理が再開されて変数値が読み出される、そのようなデータ構造である。但し、本実施形態における変数同期機構は、処理をブロックすることなく変数同期を可能とすることで、継続オブジェクトの実行時間を短くする。同期変数２２０は、例えば同期変数オブジェクトとして実現される。
【００４６】
本実施形態における変数同期機構は、以下のように動作する。変数同期機構は、同期変数２２０の読み出し時に継続オブジェクトの指定を受け、同期変数２２０が定義状態となるまでその継続オブジェクトを保持し、同期変数２２０が定義状態となればその継続オブジェクトをその同期変数２２０を引数として、対応する処理スレッドに実行させる。これにより、その処理スレッドは、実行中の継続オブジェクトにより未定義状態の同期変数２２０の読み出しが行われる場合には、次の継続オブジェクトをその同期変数２２０に登録した後、その継続オブジェクトの実行を終了する。
【００４７】
変数同期機構は、同期変数２２０が利用される場合には、同期変数テーブル２２５に、その同期変数２２０に関する情報を格納する。つまり、同期変数テーブル２２５には、利用されている各同期変数２２０についての情報がそれぞれ格納される。同期変数２２０に関する情報としては、その同期変数２２０を識別するための識別情報（以降、同期変数ＩＤと表記する）、その同期変数２２０のオブジェクトが格納される。
【００４８】
同期変数２２０は、他のワーカ２００からも定義され得る。ここで、リカバリが行われた場合、同期変数２２０のアドレスが変化する。よって、他のワーカ２００から同期変数２２０を指定する際、そのアドレスを用いることはできないため、同期変数２２０は上述のように同期変数ＩＤで管理される。他のワーカ２００は、この同期変数ＩＤを用いて、同期変数２２０を指定する。
【００４９】
キュー２３０は、有限又は無限のデータサイズを持つ。本実施形態では、説明の便宜のためにキューの例を示したが、一般的にデータ保持部と呼ぶことができる。すなわち、本実施形態は、このデータ保持機構をキューに限定するものではなく、データ保持機構はスタック等のようなデータ構造であってもよい。
【００５０】
キュー２３０は、有限サイズで定義されている場合、そのサイズ以上にデータを投入しようとする処理がブロックされ、保持されていないデータを取り出そうとする処理がブロックされる、そのようなデータ構造である。但し、本実施形態におけるデータ同期機構は、処理をブロックすることなくデータ保持を可能とすることで、継続オブジェクトの実行時間を短くする。キュー２３０は、例えばキューオブジェクトとして実現される。
【００５１】
キュー２３０は、投入待ちリスト及びデータ待ちリストを持ち、次のように動作する。キュー２３０は、キュー２３０へのデータ投入時、キュー２３０からのデータ取出し操作時に継続オブジェクトの指定を受ける。キュー２３０は、データ投入時であって投入されるデータのサイズ分キュー２３０に空きがない場合には、その投入されるデータ及びその指定された継続オブジェクトを関連付けて投入待ちリストに保持する。
【００５２】
キュー２３０は、空きが生じると、投入待ちリストに保持されていたデータをキュー２３０に投入した後、そのデータに関連付けられた継続オブジェクトを対応する処理スタックに実行させる。また、キュー２３０は、データ取出し時であって取り出すべきデータがキュー２３０にない場合には、その指定された継続オブジェクトをデータ待ちリストに保持する。キュー２３０は、データがキュー２３０に投入されると、そのデータを取り出し、データ待ちリストに保持されていた継続オブジェクトをその取り出されたデータを引数として、対応する処理スタックに実行させる。これにより、処理スタックは、実行中の継続オブジェクトにより空のキュー２３０からのデータ取り出し処理又はキュー２３０への制限を超えるデータ投入処理が行われる場合には、次の継続オブジェクトをそのキュー２３０と関連付けて保持した後、その継続オブジェクトの実行を終了する。
【００５３】
キュー２３０が利用される場合には、キューテーブル２３５に、そのキュー２３０に関する情報が格納される。つまり、キューテーブル２３５には、利用される各キュー２３０についての情報がそれぞれ格納される。キュー２３０に関する情報としては、そのキュー２３０を識別するための識別情報（以降、キューＩＤと表記する）、そのキュー２３０のオブジェクトが格納される。
【００５４】
キュー２３０は、他のワーカ２００からも利用され得る。ここで、リカバリが行われた場合、キュー２３０のアドレスが変化する。よって、他のワーカ２００からキュー２３０を指定する際、そのアドレスを用いることはできないため、キュー２３０は上述のようにキューＩＤで管理される。他のワーカ２００は、このキューＩＤを用いて、キュー２３０を指定する。
【００５５】
このような変数同期機構及びデータ保持機構は、例えば、ライブラリとして実現される。このライブラリは、予めワーカ２００に含まれていてもよいし、他のプロセスから送られるようにしてもよい。
【００５６】
上述したように、継続プール２１１、２１３、２１５及び２１７、同期変数２２０及びキュー２３０は、ワーカ２００内の処理スレッドのみでなく、他のワーカ２００から利用されることも可能である。即ち、第２実施形態は、或るワーカ２００が、他のワーカ２００の継続プールに継続オブジェクトを投入すること、他のワーカ２００の同期変数２２０を定義及び参照すること、他のワーカ２００のキュー２３０にデータを投入すること、他のワーカ２００のキュー２３０からデータを取り出すことを可能とする。これを可能とするために、ワーカ２００間通信が行われる。
【００５７】
ワーカテーブル２７０は、ワーカ２００間通信のために利用される。ワーカテーブル２７０は、各ワーカ２００についてそのワーカ２００を識別するためのワーカＩＤ及びアドレス情報をそれぞれ格納する。アドレス情報とは、そのワーカ２００が存在する装置のＩＰアドレスやポート番号等である。他のワーカ２００の継続プール、同期変数、キュー等にアクセスしたい処理スレッドは、このワーカテーブル２７０から他のワーカ２００のアドレスを取得し、このアドレスを指定してアクセスする。ワーカ２００間の通信手法自体は、ＲＰＣ（Remote Procedure Call）で利用されているような周知の通信手法が利用されればよいため、ここでは説明を省略する。
【００５８】
保存処理部２５０は、要求応答部２６０からの指示に応じて、継続プール２１１、２１３、２１５及び２１７に格納されるデータに加えて、上述の同期変数２２０に関するデータ、キュー２３０に関するデータ及びワーカテーブル２７０を実行状態ファイルに保存する。同期変数２２０に関するデータとしては、同期変数テーブル２２５に格納される各同期変数２２０に関する同期変数ＩＤ及び同期変数オブジェクト、並びに、各同期変数２２０に登録される継続オブジェクトが保存される。キュー２３０に関するデータとしては、キューテーブル２３５に格納される各キュー２３０に関するキューＩＤ及びキューオブジェクト、並びに、各キュー２３０に登録される継続オブジェクトが保存される。なお、保存処理部２５０による実行状態ファイルの保存には、保存時とリカバリ時との整合性（ポインタ操作等）が取られるように、例えば、シリアライズ機構が利用される。
【００５９】
更に、保存処理部２５０は、要求応答部２６０からリカバリの指示を受けた場合には、最近保存された実行状態ファイル内のデータで自ワーカ２００の動作状態をリカバリする。つまり、当該実行状態ファイル内のデータが各継続プール、各同期変数２２０、各キュー２３０、同期変数テーブル２２５、キューテーブル２３５にそれぞれ反映される。
【００６０】
要求応答部２６０は、マスタ１００からの要求を受け付け、その要求に応じた処理を行う。要求応答部２６０の具体的処理については、動作例の項において説明する。
【００６１】
〔マスタプロセス〕
マスタ１００は、ワーカ制御部１０１を有する。マスタ１００は、ワーカ制御部１０１を介して、処理対象となるタスクのエントリ処理、各ワーカ２００の実行状態ファイルの保存、各ワーカ２００の障害発生のチェック、ワーカ２００に障害が生じた場合のリカバリ等を行う。タスクのエントリ処理では、ワーカ制御部１０１は、例えば、そのタスクで指定されたワーカ２００の制御用継続プール２１１にそのタスクの継続オブジェクトを投入する。
【００６２】
ここで、ワーカ２００に障害が生じた場合のリカバリとは、障害が検知された際に保存されている実行状態ファイルが示す実行状態に、全ワーカ２００を戻すことを意味する。その他、ワーカ制御部１０１の具体的処理については、動作例の項において説明する。
【００６３】
〔スペアワーカプロセス〕
スペアワーカ３００は、障害が発生したワーカ２００の代替として動作するプロセスである。よって、スペアワーカ３００は、代替対象となるワーカ２００と同じ処理部を有していればよい。スペアワーカ３００は、ワーカ２００に障害が発生した際に生成されてもよいし、予め、ワーカ２００と同時期に生成されるようにしてもよい。スペアワーカ３００の具体的処理についても、動作例の項において説明する。
【００６４】
〔動作例〕
以下、第２実施形態における分散処理システム２の動作例について説明する。
まず、各ワーカ２００の動作例について図５及び図６を用いて説明する。図５は、第２実施形態におけるワーカ２００の動作例を示すフローチャートである。図６は、タスクの処理内容例及び処理タイミング例を示す図である。
【００６５】
ワーカ２００において、制御処理スレッド２１２は、制御用継続プール２１１から継続オブジェクトを取り出す前に、スレッド停止要求の有無を確認する（Ｓ５０１）。制御処理スレッド２１２は、スレッド停止要求が有ると判断すると（Ｓ５０１；ＹＥＳ）、処理を停止する（Ｓ５０５）。処理停止以降、制御処理スレッド２１２は、任意のタイミングでスレッド実行要求の有無を確認し、スレッド実行要求があれば再度処理を開始するようにしてもよいし、要求応答部２６０からスレッド実行要求を受けた際に処理を開始するようにしてもよい。
【００６６】
一方、制御処理スレッド２１２は、スレッド停止要求が無いと判断すると（Ｓ５０１；ＮＯ）、自スレッドに対応する制御用継続プール２１１に継続オブジェクトが格納されているか否かを判定する（Ｓ５０２）。制御処理スレッド２１２は、制御用継続プール２１１に継続オブジェクトが格納されていない場合には（Ｓ５０２；ＮＯ）、制御用継続プール２１１に継続オブジェクトが投入されるか、又は、スレッド停止要求がくるまで待機する（Ｓ５０６）。
【００６７】
制御処理スレッド２１２は、制御用継続プール２１１に継続オブジェクトが格納されている場合には（Ｓ５０２；ＹＥＳ）、制御用継続プール２１１から継続オブジェクトを取り出す（Ｓ５０３）。制御処理スレッド２１２は、その取り出した継続オブジェクトを実行する（Ｓ５０４）。継続オブジェクトに次の継続オブジェクトの生成処理が含まれている場合には、制御処理スレッド２１２は、次の継続オブジェクトを生成し、対応する継続プールにその生成された継続オブジェクトを投入する。制御処理スレッド２１２は、継続オブジェクトの実行が完了すると、次の継続オブジェクトを取り出す前に、再度、スレッド停止要求の有無を確認する（Ｓ５０１）。このような動作は、計算処理スレッド２１４、ディスク処理スレッド２１６、ネットワーク処理スレッド２１８においても同様である。
【００６８】
第２実施形態では、ワーカ２００内に複数の処理スレッドが存在するため、上述のような処理が並列に実行され得る。例えば、図６（ａ）に示すようなタスクがワーカ２００に投入されたと仮定する。この例のタスクは処理Ａ及び処理Ｂを含み、処理Ａには、計算Ａ、ディスクアクセス処理Ａ（図６（ａ）に示すディスクＩ／Ｏ  Ａ）及びネットワーク処理Ａ（図６（ａ）に示すネットワークＩ／Ｏ  Ａ）が含まれ、処理Ｂには、計算Ｂ、ディスクアクセス処理Ｂ及びネットワーク処理Ｂが含まれる。
【００６９】
この場合、計算Ａを含む継続オブジェクト及び計算Ｂを含む継続オブジェクトが計算用継続プール２１３に投入され、ディスクアクセス処理Ａを含む継続オブジェクト及びディスクアクセス処理Ｂを含む継続オブジェクトがディスク用継続プール２１５に投入され、ネットワーク処理Ａを含む継続オブジェクト及びネットワーク処理Ｂを含む継続オブジェクトがネットワーク用継続プール２１７に順次投入される。
【００７０】
計算処理スレッド２１４、ディスク処理スレッド２１６及びネットワーク処理スレッド２１８は、対応する各継続プールから継続オブジェクトをそれぞれ取り出し、取り出された各継続オブジェクトをそれぞれ実行する。結果、図６（ｂ）に示されるように、処理Ａ内の各処理単位及び処理Ｂ内の各処理単位はそれぞれシーケンシャルに処理されつつ、計算Ｂとディスクアクセス処理Ａ、及び、ディスクアクセス処理Ｂとネットワーク処理Ａとがそれぞれ並列に処理される。
【００７１】
このように第２実施形態によれば、第１実施形態と同様の効果、即ち、タスク実行途中の状態を容易に保存することができること、柔軟なシステム構築を可能とすることという効果を奏しつつ、更に、高速処理を可能とする。
【００７２】
次に、各ワーカ２００における同期変数２２０の読み出し時及び同期変数２２０への書き込み時の動作について図７及び図８を用いて説明する。図７は、同期変数２２０の読み出し時の動作例を示すフローチャートであり、図８は、同期変数２２０への書き込み時の動作例を示すフローチャートである。図７及び８に示される動作は、例えば、上述の図５に示す動作例における継続オブジェクトの実行（Ｓ５０４）に含まれる。
【００７３】
同期変数２２０の読み出し時には、処理スレッドは、継続オブジェクトを引数として与え、同期変数２２０に対して読み出し要求を行う（Ｓ７０１）。処理スレッドは、この同期変数２２０が定義済みか否かを確認する（Ｓ７０２）。処理スレッドは、この同期変数２２０が定義済みでなければ（Ｓ７０２；ＮＯ）、引数として与えられた継続オブジェクトを同期変数２２０に登録し（Ｓ７０４）、処理を終了させる。
【００７４】
処理スレッドは、同期変数２２０が定義済みであれば（Ｓ７０２；ＹＥＳ）、引数として与えられた継続オブジェクトに対応する関数の第１引数として同期変数２２０の値を設定し、その継続オブジェクトを実行する（Ｓ７０３）。なお、この動作例では、同期変数２２０の値を継続オブジェクトに対応する関数の第１引数に設定しているが、本実施形態はこのような形態に限定するものではない。例えば、同期変数２２０の値は第２引数に設定されてもよい。
【００７５】
同期変数２２０への書き込み時には、処理スレッドは、値を引数として与えることにより同期変数２２０の定義要求を行う（Ｓ８０１）。処理スレッドは、その同期変数２２０に登録されていた継続オブジェクトが存在すれば（Ｓ８０２；ＹＥＳ）、その登録されている継続オブジェクトに対応する関数の第１引数として同期変数２２０の値を設定し、その継続オブジェクトを実行する（Ｓ８０３）。一方、処理スレッドは、その同期変数２２０に登録されていた継続オブジェクトが存在しない場合には（Ｓ８０２；ＮＯ）、処理を終了する。
【００７６】
図９は、同期変数２２０を利用したタスクプログラム例を示す図である。図９のタスクプログラム例は、図２Ｂの例を同期変数２２０を用いるように変更したものである。
【００７７】
図９の例では、Ｓｙｎｃ＜ｉｎｔ＞がｉｎｔ型の変数を保持する同期変数２２０である。ｓａｍｐｌｅ関数では、同期変数ａの値を読み出すために、ｍａｋｅ＿ｃｏｎｔ＿ｎｏａｒｇ１関数により継続オブジェクトが作成され、この継続オブジェクトを引数として与えて同期変数ａのｒｅａｄメンバ関数が呼ばれる。ここで、ｍａｋｅ＿ｃｏｎｔ＿ｎｏａｒｇ１関数は、ｉｎｃ関数のポインタと変数ｒｅｔとを引数として、継続オブジェクトを生成する。
【００７８】
ｒｅａｄメンバ関数に指定された継続オブジェクトは、同期変数ａの値が定義されると、第１引数に同期変数ａの値を指定して実行される。このために、例えば、図３の例の場合、継続オブジェクトに対し、ｓｅｔ＿ａｒｇ１（）メンバ関数が呼び出される。
【００７９】
一方、ｄｂｌ関数では、ｗｒｉｔｅメンバ関数を用いて同期変数ｒｅｔの値が定義されている。これにより、同期変数ｒｅｔの値を待っていた継続オブジェクト、即ち、同期変数ｒｅｔが未定義のため登録されていた継続オブジェクトが存在すれば、その継続オブジェクトが実行される。同期変数２２０は上述のように同期変数ＩＤで管理される。そこで、図９の例では、例えば、Ｓｙｎｃ型の変数が、内部に同期変数ＩＤを持ち、ｒｅａｄメンバ関数やｗｒｉｔｅメンバ関数において同期変数テーブル２２５からその同期変数ＩＤに対応するその同期変数２２０のアドレスが取得されるようにしてもよい。
【００８０】
次に、各ワーカ２００におけるキュー２３０からデータを取り出す際及びキュー２３０にデータを投入する際の動作について図１０及び図１１を用いて説明する。図１０は、キュー２３０からデータを取り出す際の動作例を示すフローチャートであり、図１１は、キュー２３０にデータを投入する際の動作例を示すフローチャートである。図１０及び図１１に示される動作は、例えば、上述の図５に示す動作例における継続オブジェクトの実行（Ｓ５０４）に含まれる。
【００８１】
キュー２３０からデータを取り出す際には、処理スレッドは、継続オブジェクトを引数として与え、キュー２３０からのデータの取り出し要求を行う（Ｓ１００１）。処理スレッドは、キュー２３０が空の場合には（Ｓ１００２；ＹＥＳ）、引数として与えられた継続オブジェクトをそのキュー２３０のデータ待ちリストに登録する（Ｓ１００３）。
【００８２】
一方、処理スレッドは、キュー２３０が空でない場合（Ｓ１００２；ＮＯ）、キュー２３０からデータを取り出す（Ｓ１００４）。続いて、処理スレッドは、引数として与えられた継続オブジェクトに対応する関数の第１引数としその取り出されたデータを設定し、その継続オブジェクトを実行する（Ｓ１００５）。
【００８３】
その後、処理スレッドは、キュー２３０の投入待ちリストが空か否かを確認する（Ｓ１００６）。処理スレッドは、投入待ちリストが空であれば（Ｓ１００６；ＹＥＳ）、処理を終了し、投入待ちリストが空でなければ（Ｓ１００６；ＮＯ）、その投入待ちリストからデータと継続オブジェクトとのペアを取り出す（Ｓ１００７）。処理スレッドは、取り出されたデータをそのキュー２３０に投入し（Ｓ１００８）、同様に取り出された継続オブジェクトを実行する（Ｓ１００９）。
【００８４】
キュー２３０にデータを投入する際には、処理スレッドは、継続オブジェクトを引数として与え、キュー２３０へのデータの投入を要求する（Ｓ１１０１）。続いて、処理スレッドは、その投入すべきデータのサイズ分、キュー２３０に空きがあるか否かを判定する（Ｓ１１０２）。処理スレッドは、キュー２３０に空きがない場合（Ｓ１１０２；ＮＯ）、その投入すべきデータと継続オブジェクトとのペアをそのキュー２３０の投入待ちリストに登録する（Ｓ１１０３）。
【００８５】
一方、処理スレッドは、キュー２３０に空きがある場合（Ｓ１１０２；ＹＥＳ）、そのキュー２３０にそのデータを投入し（Ｓ１１０４）、更に、引数として与えられた継続オブジェクトを実行する（Ｓ１１０５）。
【００８６】
その後、処理スレッドは、そのキュー２３０のデータ待ちリストが空か否かを判定する（Ｓ１１０６）。処理スレッドは、データ待ちリストが空である場合には（Ｓ１１０６；ＹＥＳ）、処理を終了する。一方、処理スレッドは、データ待ちリストが空でない場合（Ｓ１１０６；ＮＯ）、そのデータ待ちリストから継続オブジェクトを取り出す（Ｓ１１０７）。
【００８７】
続いて、処理スレッドは、キュー２３０からデータを取り出し（Ｓ１１０８）、上記取り出された継続オブジェクトに対応する関数の第１引数としてその取り出されたデータを設定し、その継続オブジェクトを実行する（Ｓ１１０９）。これにより、キュー２３０からデータを取り出す際にキュー２３０が空だった場合の処理が継続される。
【００８８】
次に、各ワーカ２００の実行状態を保存する際の動作例について図１２を用いて説明する。図１２は、マスタ１００が各ワーカ２００の実行状態を保存する際の動作例を示すフローチャートである。マスタ１００は、所定の周期で、以下のような各ワーカ２００の実行状態を保存する処理を実行する。なお、この処理は、所定の周期に限らず、任意のタイミングで実行されるようにしてもよい。
【００８９】
実行状態の保存処理を開始すると、マスタ１００のワーカ制御部１０１は、全ワーカ２００に対して、スレッド停止要求を送る（Ｓ１２０１）。これにより、上述したように、各ワーカ２００の各処理スレッドはそれぞれ、スレッド停止要求の有無を確認することにより（図５のＳ５０１）、処理を停止する（図５のＳ５０５）。このとき、例えば、各ワーカ２００の要求応答部２６０は、自ワーカ２００内の全処理スレッドの停止を確認し、その旨をマスタ１００に通知する。
【００９０】
ワーカ制御部１０１は、全ワーカ２００の全処理スレッドの停止を確認すると（Ｓ１２０２）、続いて、全ワーカに実行状態の保存要求を送る（Ｓ１２０３）。この要求により、各ワーカ２００の保存処理部２５０がその時点での保存対象データをシリアライズし、実行状態ファイルに保存する。保存対象データには、制御用継続プール２１１、計算用継続プール２１３、ディスク用継続プール２１５及びネットワーク用継続プール２１７に格納されているデータ、同期変数２２０に関するデータ、キュー２３０に関するデータ、ワーカテーブル２７０のデータが含まれる。
【００９１】
更に、ワーカ制御部１０１は、全ワーカ２００に対して、保存された実行状態ファイルを指定された他のワーカに送信するように要求する（Ｓ１２０４）。例えば、他のワーカとして、そのワーカが実行される装置（ノード）とは異なる装置上で実行されるワーカが指定される。これは、ノード障害時にはその障害ノードに保存された実行状態ファイルにアクセスできなくなるからである。これにより、各ワーカ２００の保存処理部２５０は、保存された実行状態ファイルのコピーを指定された他のワーカに送信する。結果、各ワーカ２００の実行状態ファイルは、少なくとも２つの装置（ノード）にそれぞれ保存される。ワーカ制御部１０１は、各ワーカ２００の実行状態ファイルが保存されるワーカの情報を保持する。
【００９２】
ワーカ制御部１０１は、全ワーカが実行状態の保存と、他のワーカへの実行状態ファイルの送信とを完了したことを確認すると（Ｓ１２０５）、全ワーカ２００に対して、全処理スレッドの再開を要求する（Ｓ１２０６）。これにより、全ワーカ２００の全処理スレッドにおける或る時点の実行状態が保存される。
【００９３】
なお、上記手順では、マスタ１００のワーカ制御部１０１が各ワーカ２００を制御する例が示されたが、ワーカ制御部１０１は、全ワーカ２００に実行状態保存要求のみを送るようにし、各ワーカ２００がスレッドの停止、実行状態ファイルの保存及び他のワーカへの送信、スレッドの再開を制御するようにしてもよい。
【００９４】
最後に、第２実施形態の分散処理システム２におけるワーカに障害が発生した場合のリカバリ動作の例について図１３を用いて説明する。図１３は、第２実施形態の分散処理システム２におけるワーカに障害が発生した場合のリカバリ動作の例を示すフローチャートである。
【００９５】
マスタ１００は、ワーカ制御部１０１を介して、所定の周期で各ワーカ２００の障害発生状況を確認する（Ｓ１３０１、Ｓ１３０２、Ｓ１３０２；ＮＯ）。なお、この処理は、所定の周期に限らず、任意のタイミングで実行されるようにしてもよい。
【００９６】
マスタ１００のワーカ制御部１０１は、障害の発生したワーカ（以降、障害ワーカと表記する）が存在すると判断すると（Ｓ１３０２；ＹＥＳ）、障害ワーカ以外の正常ワーカに対してリカバリ要求を送る（Ｓ１３０３）。この要求を受けた各正常ワーカでは、保存処理部２５０が、最近保存された実行状態ファイル内のデータで自ワーカ２００の動作状態をリカバリする。具体的には、保存処理部２５０は、各処理スレッドを停止させた後、実行状態ファイル内のデータを各継続プール、同期変数２２０、同期変数テーブル２２５、キュー２３０、キューテーブル２３５、ワーカテーブル２７０に反映させる。
【００９７】
続いて、ワーカ制御部１０１は、スペアワーカ３００に対してリカバリ要求を送る（Ｓ１３０４）。このリカバリ要求には、例えば、障害ワーカの実行状態ファイルを持つワーカのワーカＩＤが含まれる。これにより、スペアワーカ３００では、保存処理部２５０が、そのワーカＩＤで特定される他のワーカから実行状態ファイルを取得し、その実行状態ファイルに含まれるデータを用いて動作状態をリカバリする。これにより、スペアワーカ３００では、障害ワーカの実行状態が回復されることになる。
【００９８】
ワーカ制御部１０１は、障害ワーカを除く全ワーカ（スペアワーカ３００を含む）のリカバリが完了したことを確認すると（Ｓ１３０５）、その各ワーカにワーカテーブル２７０の更新を要求する（Ｓ１３０６）。これにより、スペアワーカ３００を含む各ワーカでは、障害ワーカの情報とその代替として利用されたスペアワーカ３００の情報がワーカテーブル２７０に反映される。
【００９９】
ワーカ制御部１０１は、全ワーカのワーカテーブル２７０が更新されたことを確認すると（Ｓ１３０７）、全ワーカに全処理スレッドの再開を要求する（Ｓ１３０８）。正常ワーカ及びスペアワーカ３００は、この要求を受け付け、各処理スレッドを再開させる。これにより、ワーカの障害発生が検知された時点から直近に保存された実行状態により、分散処理システム２の動作状態が復旧する。
【０１００】
このように第２実施形態では、同期変数２２０及びキュー２３０というデータ同期の機構が設けられているため、タスクの並列処理が可能となり、処理の高速化を実現することができる。更に、第２実施形態は、実行状態保存時には、同期変数２２０及びキュー２３０に関するデータも保存対象としているため、完全なる実行状態の保存を可能としている。
【０１０１】
更に、第２実施形態では、マスタ１００が各ワーカ２００の実行状態の保存を制御しつつ、各ワーカ２００の障害発生状況を確認する。そして、障害発生時には、実行状態ファイル及びスペアワーカが用いられることにより、障害発生前の実行状態に回復して実行が再開されるため、高信頼な処理を可能としている。
【０１０２】
〔ハードウェア構成］
図１４は、第２実施形態における分散処理システム２のハードウェア構成例を示す概念図である。第２実施形態における分散処理システム２は、複数のコンピュータ５により構成される。ここで、コンピュータ５とは、ＣＰＵ１０、メモリ（ＲＡＭ１２、ＲＯＭ（図示せず）、ハードディスク（ＨＤＤ）１４等）、入出力インタフェース１６等を含み、メモリに格納されたプログラムを実行するためのハードウェア要素群を示す概念である。よって、コンピュータ５は、パーソナルコンピュータのような１台の装置として実現されたものであってもよいし、ＣＰＵボードといった１台の装置に複数装着可能な単位であってもよい。上述の説明ではノードとも表記している。
【０１０３】
図１４に示すように、マスタ１００、各ワーカ２００、スペアワーカ３００はそれぞれ異なるコンピュータ（ノード）５上で実現されることが望ましい。これにより、コンピュータ５の故障に起因してワーカ２００に異常が生じた場合には、他のコンピュータ上で実現されるスペアワーカ３００でリカバリされるからである。分散処理システム２に含まれるマスタ１００、各ワーカ２００及びスペアワーカ３００は、各コンピュータ５内のメモリに記憶されるプログラムがＣＰＵ１０により実行されることで、実現される。マスタ１００、各ワーカ２００及びスペアワーカ３００を構成する各処理部についても同様である。
【０１０４】
また、第２実施形態では、１つの処理スレッドに１つの継続プールを対応付けたが、複数の処理スレッドで１つの継続プールが共有されるようにしてもよいし、１つの処理スレッドが複数の継続プールに対応づけられていてもよい。
【０１０５】
上記の各実施形態及び各変形例の一部又は全部は、以下の付記のようにも特定され得る。但し、各実施形態及び各変形例が以下の記載に限定されるものではない。
【０１０６】
（付記１）タスクを構成する複数の処理のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、
前記オブジェクト格納部から取り出された前記継続オブジェクトを実行する処理手段と、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段と、
を備えることを特徴とする分散処理装置。
【０１０７】
（付記２）前記処理手段は、前記継続オブジェクトを実行することにより次の継続オブジェクトを生成し、この生成された次の継続オブジェクトを前記オブジェクト格納部に格納した後、前記継続オブジェクトの実行を終了する、
ことを特徴とする付記１に記載の分散処理装置。
【０１０８】
（付記３）前記オブジェクト格納部及び前記処理手段を複数備え、
前記各オブジェクト格納部は、それぞれ異なる計算資源を利用する継続オブジェクトを格納し、
前記各処理手段は、各オブジェクト格納部からそれぞれ取り出される継続オブジェクトを並列に実行する、
ことを特徴とする付記１又は２に記載の分散処理装置。
【０１０９】
（付記４）同期変数を更に備え、
前記複数の処理手段の少なくとも１つは、実行中の第１の継続オブジェクトにより未定義状態の同期変数の読み出しが行われる場合には、第２の継続オブジェクトをその同期変数に登録した後、第１の継続オブジェクトの実行を終了し、
前記保存処理手段は、前記同期変数に登録されている前記第２の継続オブジェクトを実行状態ファイルに更に保存する、
ことを特徴とする付記３に記載の分散処理装置。
【０１１０】
（付記５）データ保持部を更に備え、
前記複数の処理手段の少なくとも１つは、実行中の第１の継続オブジェクトにより空のデータ保持部からのデータ取り出し処理又はデータ保持部への制限を超えるデータ投入処理が行われる場合には、第２の継続オブジェクトをそのデータ保持部に登録した後、第１の継続オブジェクトの実行を終了し、
前記保存処理手段は、前記データ保持部に登録されている前記第２の継続オブジェクトを実行状態ファイルに更に保存する、
ことを特徴とする付記３又は４に記載の分散処理装置。
【０１１１】
（付記６）複数のコンピュータから構成される分散処理システムにおいて、
タスクを構成する複数の処理のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、
前記オブジェクト格納部から取り出された前記継続オブジェクトを実行する処理手段と、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段と、
をそれぞれ含む複数のワーカプロセスと、
所定のタイミングで前記各ワーカプロセスに対し前記保存処理手段による保存処理を要求するマスタプロセスと、
を備え、
前記マスタプロセスは、前記保存処理を要求する際には、前記各ワーカプロセスに対し、各実行状態ファイルを保存させる他のワーカプロセスをそれぞれ指定する、
ことを特徴とする分散処理システム。
【０１１２】
（付記７）前記各ワーカプロセスが有する前記複数のオブジェクト格納部、前記複数の処理手段及び前記保存処理手段を含むスペアワーカプロセスを更に備え、
前記スペアワーカプロセスの保存処理手段は、障害の発生したワーカプロセスが検出された場合に、その障害の発生したワーカプロセスの実行状態ファイルを他のワーカプロセスから取得し、この取得された実行状態ファイルに含まれるデータを前記各オブジェクト格納部にリストアし、
前記障害の発生したワーカプロセス以外のワーカプロセスの保存処理手段は、前記障害の発生したワーカプロセスが検出された場合に、自ワーカプロセスの実行状態ファイルに含まれるデータを前記各オブジェクト格納部にリストアする、
ことを特徴とする付記６に記載の分散処理システム。
【０１１３】
（付記８）前記複数のワーカプロセス及び前記スペアワーカプロセスはそれぞれ、各ワーカプロセスについての情報をそれぞれ格納するワーカテーブルを更に含み、
前記マスタプロセスは、前記障害の発生したワーカプロセス以外の各ワーカプロセス及び前記スペアワーカプロセスに対して、前記障害の発生したワーカプロセス及び前記スペアワーカプロセスの各情報を用いて前記各ワーカテーブルを更新させる、
ことを特徴とする付記７に記載の分散処理システム。
【０１１４】
（付記９）少なくとも１つのコンピュータが、
タスクを構成する複数の処理のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを生成し、
前記生成された継続オブジェクトをオブジェクト格納部に格納し、
前記オブジェクト格納部から前記継続オブジェクトを取り出し、
前記取り出された継続オブジェクトを実行し、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する、
ことを含むことを特徴とする分散処理方法。
【０１１５】
（付記１０）前記少なくとも１つのコンピュータが、
前記継続オブジェクトを実行することにより次の継続オブジェクトを生成し、
前記生成された次の継続オブジェクトを前記オブジェクト格納部に格納した後、前記継続オブジェクトの実行を終了する、
ことを更に含む付記９に記載の分散処理方法。
【０１１６】
（付記１１）タスクを構成する複数の処理のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、
前記オブジェクト格納部から取り出された前記継続オブジェクトを実行する処理手段と、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段と、
を少なくとも１つのコンピュータに実現させることを特徴とするプログラム。
【０１１７】
（付記１２）前記処理手段は、前記継続オブジェクトを実行することにより次の継続オブジェクトを生成し、この生成された次の継続オブジェクトを前記オブジェクト格納部に格納した後、前記継続オブジェクトの実行を終了する、
ことを特徴とする付記１１に記載のプログラム。
【０１１８】
（付記１３）前記少なくとも１つのコンピュータに、前記オブジェクト格納部及び前記処理手段を複数実現させ、
前記各オブジェクト格納部は、それぞれ異なる計算資源を利用する継続オブジェクトを格納し、
前記各処理手段は、各オブジェクト格納部からそれぞれ取り出される継続オブジェクトを並列に実行する、
ことを特徴とする付記１１又は１２に記載のプログラム。
【０１１９】
（付記１４）同期変数を前記少なくとも１つのコンピュータに更に実現させ、
前記複数の処理手段の少なくとも１つは、実行中の第１の継続オブジェクトにより未定義状態の同期変数の読み出しが行われる場合には、第２の継続オブジェクトをその同期変数に登録した後、第１の継続オブジェクトの実行を終了し、
前記保存処理手段は、前記同期変数に登録されている前記第２の継続オブジェクトを実行状態ファイルに更に保存する、
ことを特徴とする付記１３に記載のプログラム。
【０１２０】
（付記１５）データ保持部を前記少なくとも１つのコンピュータに更に実現させ、
前記複数の処理手段の少なくとも１つは、実行中の第１の継続オブジェクトにより空のデータ保持部からのデータ取り出し処理又はデータ保持部への制限を超えるデータ投入処理が行われる場合には、第２の継続オブジェクトをそのデータ保持部に登録した後、第１の継続オブジェクトの実行を終了し、
前記保存処理手段は、前記データ保持部に登録されている前記第２の継続オブジェクトを実行状態ファイルに更に保存する、
ことを特徴とする付記１３又は１４に記載のプログラム。
【０１２１】
（付記１６）複数のコンピュータから構成される分散処理システムに、
タスクを構成する複数の処理のうちの少なくとも１つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、
前記オブジェクト格納部から取り出された前記継続オブジェクトを実行する処理手段と、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段と、
をそれぞれ含む複数のワーカプロセスと、
所定のタイミングで前記各ワーカプロセスに対し前記保存処理手段による保存処理を要求するマスタプロセスと、
を実現させ、
前記マスタプロセスは、前記保存処理を要求する際には、前記各ワーカプロセスに対し、各実行状態ファイルを保存させる他のワーカプロセスをそれぞれ指定する、
ことを特徴とするプログラム。
【０１２２】
（付記１７）前記各ワーカプロセスが有する前記複数のオブジェクト格納部、前記複数の処理手段及び前記保存処理手段を含むスペアワーカプロセスを前記分散処理システムに更に実現させ、
前記スペアワーカプロセスの保存処理手段は、障害の発生したワーカプロセスが検出された場合に、その障害の発生したワーカプロセスの実行状態ファイルを他のワーカプロセスから取得し、この取得された実行状態ファイルに含まれるデータを前記各オブジェクト格納部にリストアし、
前記障害の発生したワーカプロセス以外のワーカプロセスの保存処理手段は、前記障害の発生したワーカプロセスが検出された場合に、自ワーカプロセスの実行状態ファイルに含まれるデータを前記各オブジェクト格納部にリストアする、
ことを特徴とする付記１６に記載のプログラム。
【０１２３】
（付記１８）前記複数のワーカプロセス及び前記スペアワーカプロセスはそれぞれ、各ワーカプロセスについての情報をそれぞれ格納するワーカテーブルを更に含み、
前記マスタプロセスは、前記障害の発生したワーカプロセス以外の各ワーカプロセス及び前記スペアワーカプロセスに対して、前記障害の発生したワーカプロセス及び前記スペアワーカプロセスの各情報を用いて前記各ワーカテーブルを更新させる、
ことを特徴とする付記１７に記載のプログラム。
【０１２４】
この出願は、２０１０年１０月１４日に出願された日本出願の特願２０１０−２３１１４４号を基礎とする優先権を主張し、その開示の全てをここに取り込む。
【図１】
2012049794.tif 000003
【図２Ａ】
2012049794.tif 000004
【図２Ｂ】
2012049794.tif 000005
【図３】
2012049794.tif 000006
【図４】
2012049794.tif 000007
【図５】
2012049794.tif 000008
【図６】
2012049794.tif 000009
【図７】
2012049794.tif 000010
【図８】
2012049794.tif 000011
【図９】
2012049794.tif 000012
【図１０】
2012049794.tif 000013
【図１１】
2012049794.tif 000014
【図１２】
2012049794.tif 000015
【図１３】
2012049794.tif 000016
【図１４】
2012049794.tif 000017
【国際調査報告】
2012049794.tif 000018
2012049794.tif 000019
2012049794.tif 000020