【国等の委託研究の成果に係る記載事項】(出願人による申告)国等の委託研究の成果に係る特許出願(平成21年度 独立行政法人新エネルギー・産業技術総合開発機構「グリーンネットワーク・システム技術研究開発プロジェクト(グリーンITプロジェクト)/エネルギー利用最適化データセンタ基盤技術の研究開発/サーバの最適構成とクラウド・コンピューティング環境における進化するアーキテクチャーの開発/クラウド・コンピューティング技術」委託研究、産業技術力強化法第19条の適用を受ける特許出願)
【文献】
鵜川始陽 他,継続の生成におけるスタックコピーの遅延,情報処理学会論文誌,社団法人情報処理学会,2003年10月15日,第44巻、No.SIG13(PRO 18),pp.72-83,ISSN 0387-5806
【文献】
スチュアート・マドニック、、ジョン・ドノバン(Stuart E. Madnick & John J. Donovan)著、池田克夫 訳,オペレーティング・システム(Operating Systems),日本コンピュータ協会,1983年 6月15日,5版,pp.291−295
(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0017】
以下、本発明の実施の形態について図面を用いて説明する。尚、すべての図面において、同様な構成要素には同様の符号を付し、適宜説明を省略する。また、以下に挙げた各実施形態はそれぞれ例示であり、本発明は以下の各実施形態の構成に限定されない。
【0018】
[第1実施形態]
〔装置構成例〕
図1は、第1実施形態における分散処理装置1の構成例を示す概念図である。
分散処理装置1は、
図1に示すように、ハードウェア構成として、CPU(Central Processing Unit)10、メモリ(RAM(Random Access Memory)12、ROM(Read Only Memory、図示せず)、ハードディスク(HDD)14等)、入出力インタフェース16等を有する。これら各ハードウェア要素は例えばバス18により接続される。なお、本実施形態は、分散処理装置1のハードウェア構成を限定しない。
【0019】
分散処理装置1は、ワーカプロセス200(以降、単にワーカと表記する場合もある)を有する。ワーカ200は、オブジェクト格納部201、処理部202、保存処理部250を有する。分散処理装置1は、例えば、メモリに記憶されるプログラムがCPU10により実行されることにより、このような各処理部を実現する。
【0020】
ワーカ200は、処理対象であるタスク(ジョブ)を受けると、そのタスクを処理する。タスクは、MapReduceのMapタスクやReduceタスクであってもよいし、MapReduce以外のプロジェクトで生成されたタスク(処理対象)であってもよい。このように、ワーカ200は、タスクを処理するためのフレームワークを実現する。
【0021】
オブジェクト格納部201は、タスクを構成する複数の処理単位のうちの少なくとも1つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納する。処理部202は、オブジェクト格納部201から継続オブジェクトを取り出し、その取り出された継続オブジェクトを実行する。保存処理部250は、オブジェクト格納部201に格納されるデータを実行状態ファイルに保存する。
【0022】
このように、ワーカ200では、オブジェクト格納部201に格納される継続オブジェクトが処理部202で実行されることにより、タスクが処理される。ここで、継続オブジェクトに含まれる少なくとも1つの処理単位とは、言い換えれば、タスク(プログラム)の実行においてある時点から後に行われる処理を表す概念である。例えば、継続オブジェクトは、C++におけるメンバ変数及びrun()のようなメンバ関数が定義されたクラスオブジェクトとして実現される。
【0023】
〔動作例〕
次に、第1実施形態における分散処理装置1の動作例について説明する。
図2Aは、一般的なタスクプログラムの例を示し、
図2Bは、第1実施形態における分散処理装置1で処理されるタスクプログラムの例を示す。
図3は、継続オブジェクトの生成を実現するプログラムの例である。
図2A、
図2B及び
図3のプログラム例は、C++言語で記述された例であるが、本実施形態はこのような記述言語を限定するものではない。
【0024】
図2A及び
図2Bは、共に、引数に与えられた変数aに1を加算した値に2を掛ける処理(=(a+1)×2)を行うプログラムである。
図2Aで示される一般的なプログラムでは、inc関数でa+1が実行され、その結果を引数にdbl関数が呼び出され、dbl関数で引数が2倍され、その結果が出力される。この場合、例えば、inc関数終了時点でのプログラムの実行状態は、C++のフレームワークが管理するスタック上に置かれている。よって、この時点での実行状態を保存し、かつ、その保存されたデータでリカバリを行うことは難しい。
【0025】
図2Bで示されるタスクが処理される場合には、第1実施形態における分散処理装置1は、2つの継続オブジェクトを生成し、それらをオブジェクト格納部201に格納し、処理部202がそれらを順次実行する。例えば、変数aに1が与えられて関数sampleが実行される場合、inc関数及び引数a(=1)を引数としてmake_cont関数が呼び出されることで継続オブジェクトが生成される。この継続オブジェクトは、inc関数を処理単位とし、変数aの値(=1)及びretポインタをタスクの処理途中のデータとして保持する。そして、この生成された継続オブジェクトを引数にput_ctrlpool関数が呼び出されることで、その継続オブジェクトがオブジェクト格納部201に格納される。
【0026】
処理部202は、オブジェクト格納部201からその継続オブジェクトを取り出し、引数で与えられたinc関数を引数a(=1)を用いて実行する。
図2Bの例ではinc関数内においてもmake_cont関数が呼び出されるため、処理部202は、dbl関数及び引数x(=2)(=1+1)を用いて次の継続オブジェクトを生成する。生成された次の継続オブジェクトは、dbl関数を処理単位とし、inc関数で計算された変数xの値(=2)及びretポインタをタスクの処理途中データとして保持する。
【0027】
処理部202は、この生成された次の継続オブジェクトを引数にput_ctrlpool関数を呼び出すことで、その継続オブジェクトをオブジェクト格納部201に格納する。その後、処理部202は、その継続オブジェクトをオブジェクト格納部201から取り出し、実行する。これにより、引数x(=2)を用いてdbl関数が実行され、変数retの値が4に設定されることで処理が完了する。
【0028】
このような例によれば、inc関数の処理が終了した時点でのタスクの実行状態は、オブジェクト格納部201に格納されている継続オブジェクトが保持している。すなわち、その継続オブジェクトにより、inc関数で計算された変数xの値(=2)が保持されている。よって、保存処理部250がこの継続オブジェクトを実行状態ファイルに保存することで、その後、処理部202にこの継続オブジェクトを処理させることが可能となる。
【0029】
このように、第1実施形態によれば、タスクの実行途中の状態を反映する継続オブジェクトを実行状態ファイルに保存することができるため、ワーカ200におけるタスク実行途中の状態を容易に保存することができる。このような効果は、処理対象のタスクを限定することなく、ワーカ200で実現されるため、様々なタスクを処理対象とすることができ、ひいては、柔軟なシステム構築が可能となる。
【0030】
上述したmake_cont関数は、
図3の例のように実現することができる。
図3(a)の例では、make_cont関数は、テンプレート関数として実現されている。make_cont関数中では、テンプレートクラスであるRealCont2クラスのオブジェクトが生成され、このオブジェクトが返される。ここで、
図3(a)の例は、継続オブジェクト(RealCont2クラスのオブジェクト)が2つの引数を持つ関数に対応しているが、本実施形態は、このような継続オブジェクトに限定しない。例えば、様々な数の引数を持つ関数に対応するようなクラスライブラリを用意するようにすればよい。
【0031】
図3(b)には、Contクラスの定義が示される。Contクラスには、run()メンバ関数及びset_arg1()メンバ関数が定義される。set_arg1()メンバ関数は、後述する同期変数及びキューを扱う際に利用される。
【0032】
図3(c)には、RealCont2クラスの定義が示される。コンストラクタでは、与えられた引数がメンバ変数に保存される。また、run()メンバ関数が定義され、このrun()メンバ関数により、関数ポインタと引数を使ってその関数ポインタで示される関数が実行される。
【0033】
このような継続オブジェクトの生成関数及び継続オブジェクトをオブジェクト格納部201へ投入する関数は、ライブラリとして実現されてもよい。このライブラリは、予めワーカ200に含まれていてもよいし、他のプロセスから送られるようにしてもよい。
【0034】
上述の動作例で示されたように、処理部202は、継続オブジェクトを実行することにより次の継続オブジェクトを生成し、この生成された次の継続オブジェクトをオブジェクト格納部201に格納した後、上記継続オブジェクトの実行を終了するようにしてもよい。このようにすれば、継続オブジェクトの実行が次の継続オブジェクトのオブジェクト格納部201への格納後に終了するため、その終了時点で処理部202の処理を一時停止させることができ、結果としてタスクの実行途中の状態を確実に保存することができる。
【0035】
各継続オブジェクトは、その処理時間が十分短くなるように区分けされたものであることが望ましい。例えば、繰り返し数の多いループやブロック処理など、実行時間が長くなる処理がタスクに含まれる場合には、残りの処理を継続オブジェクトにし、オブジェクト格納部201に投入するようタスクのプログラムが記述されることが望ましい。このようにすれば、従来手法では、タスクの処理を一旦開始するとその処理が終了するまで、タスクオブジェクトの実行が継続されるのに対して、本実施形態によれば、途中でタスクの処理を停止させることができる。具体的には、処理部202が1つの継続オブジェクトの処理を終了し、次の継続オブジェクトを取り出す前の時点でその処理部202を一時停止させることができる。結果、オブジェクト格納部201内のデータを保存することで、その時点での実行状態が確実に保存されることになる。
【0036】
[第2実施形態]
図4は、第2実施形態における分散処理システム2の処理構成例を示す概念図である。
第2実施形態における分散処理システム2は、複数のワーカ200、各ワーカ200を制御するマスタプロセス(以降、単にマスタと表記する場合もある)100、スペアワーカプロセス(以降、単にスペアワーカと表記する場合もある)300等を有する。なお、第2実施形態における分散処理システム2のハードウェア構成については後述する。
【0037】
〔ワーカプロセス〕
第2実施形態では、各ワーカ200は、制御用継続プール211、制御処理スレッド212、計算用継続プール213、計算処理スレッド214、ディスク用継続プール215、ディスク処理スレッド216、ネットワーク用継続プール217、ネットワーク処理スレッド218、同期変数220、同期変数テーブル225、キュー230、キューテーブル235、保存処理部250、要求応答部260、ワーカテーブル270等を有する。
【0038】
制御用継続プール211、計算用継続プール213、ディスク用継続プール215及びネットワーク用継続プール217は、第1実施形態におけるオブジェクト格納部201に相当する。つまり、第2実施形態における各ワーカ200は、複数のオブジェクト格納部201をそれぞれ有する。
図4の例に示されるように、各オブジェクト格納部201がそれぞれ異なる計算資源を利用する継続オブジェクトを格納するように構成されるのが好ましい。以降、制御用継続プール211、計算用継続プール213、ディスク用継続プール215及びネットワーク用継続プール217を単に継続プールと表記する場合もある。
【0039】
計算用継続プール213は、タスクの中で計算のみを行う部分を処理単位とする継続オブジェクトを格納する。ディスク用継続プール215は、タスクの中でハードディスク14に対する入出力処理のみを処理単位とする継続オブジェクトを格納する。ネットワーク用継続プール217は、入出力インタフェース16に含まれるネットワークインタフェースに対する入出力処理のみを処理単位とする継続オブジェクトを格納する。制御用継続プール211は、上記以外の処理を処理単位とする継続オブジェクトを格納する。
図2B及び
図3の例におけるput_ctrlpool関数が制御用継続プール211に継続オブジェクトを格納する関数であるとすれば、例えば、各継続プールに格納するための各関数(put_networkpoolなど)がそれぞれ用意されることで実現可能である。
【0040】
制御用継続プール211、計算用継続プール213、ディスク用継続プール215及びネットワーク用継続プール217は、このように複数の継続オブジェクトをそれぞれ格納可能である。各継続プールは、キューやスタックのようなデータの集合を扱う任意のデータ構造でそれぞれ実現される。
【0041】
制御処理スレッド212、計算処理スレッド214、ディスク処理スレッド216及びネットワーク処理スレッド218は、第1実施形態における処理部202に相当する。つまり、第2実施形態における各ワーカ200は、複数の処理部202をそれぞれ有する。
図4の例では、各処理部202がそれぞれ異なる計算資源を利用する継続オブジェクトを実行するように設けられる。計算資源とは、例えば、ハードディスクのメモリ資源であり、ネットワークを利用するためのプロトコルスタックの資源であり、ディスプレイに表示させるための画像処理資源である。もちろん、異なる処理部202が同じ計算資源を利用する各継続オブジェクトを処理するようにしてもよい。このように各処理部202は、それぞれ実行すべき継続オブジェクトを格納する各オブジェクト格納部201にそれぞれ対応付けられており、予め決まったオブジェクト格納部201から取得した継続オブジェクトをそれぞれ実行する。
【0042】
制御処理スレッド212は、制御用継続プール211から取り出される継続オブジェクトを実行する。計算処理スレッド214は、計算用継続プール213から取り出される継続オブジェクトを実行する。ディスク処理スレッド216は、ディスク用継続プール215から取り出される継続オブジェクトを実行する。ネットワーク処理スレッド218は、ネットワーク用継続プール217から取り出される継続オブジェクトを実行する。このような構成によれば、各継続オブジェクトを並列に実行することができる。以降、制御処理スレッド212、計算処理スレッド214、ディスク処理スレッド216及びネットワーク処理スレッド218を単に処理スレッドと表記する場合もある。
【0043】
各処理スレッドは、継続オブジェクトの処理を完了させる度に、スレッド停止要求の有無を確認する。このスレッド停止要求の有無は、要求応答部260から各処理スレッドに通知される。この通知は、要求応答部260と各処理スレッドとの間で共有されるメモリにスレッド停止要求の有無を示すデータを書き込むことで実現されてもよい。各処理スレッドは、スレッド停止要求が有ると判断すると、処理を停止する、即ち、対応する継続プールからの継続オブジェクトの取り出しを保留する。
【0044】
各ワーカ200は、各継続オブジェクトを並列に実行することができるようにするために、各継続オブジェクト間でデータの同期を取るための機構をそれぞれ有する。この同期機構は、同期変数220、同期変数テーブル225、キュー230、キューテーブル235により実現される。
【0045】
同期変数220は、未定義の変数値が読み出し処理されるとその処理がブロックされ、その変数値が定義されるとブロックされていた処理が再開されて変数値が読み出される、そのようなデータ構造である。但し、本実施形態における変数同期機構は、処理をブロックすることなく変数同期を可能とすることで、継続オブジェクトの実行時間を短くする。同期変数220は、例えば同期変数オブジェクトとして実現される。
【0046】
本実施形態における変数同期機構は、以下のように動作する。変数同期機構は、同期変数220の読み出し時に継続オブジェクトの指定を受け、同期変数220が定義状態となるまでその継続オブジェクトを保持し、同期変数220が定義状態となればその継続オブジェクトをその同期変数220を引数として、対応する処理スレッドに実行させる。これにより、その処理スレッドは、実行中の継続オブジェクトにより未定義状態の同期変数220の読み出しが行われる場合には、次の継続オブジェクトをその同期変数220に登録した後、その継続オブジェクトの実行を終了する。
【0047】
変数同期機構は、同期変数220が利用される場合には、同期変数テーブル225に、その同期変数220に関する情報を格納する。つまり、同期変数テーブル225には、利用されている各同期変数220についての情報がそれぞれ格納される。同期変数220に関する情報としては、その同期変数220を識別するための識別情報(以降、同期変数IDと表記する)、その同期変数220のオブジェクトが格納される。
【0048】
同期変数220は、他のワーカ200からも定義され得る。ここで、リカバリが行われた場合、同期変数220のアドレスが変化する。よって、他のワーカ200から同期変数220を指定する際、そのアドレスを用いることはできないため、同期変数220は上述のように同期変数IDで管理される。他のワーカ200は、この同期変数IDを用いて、同期変数220を指定する。
【0049】
キュー230は、有限又は無限のデータサイズを持つ。本実施形態では、説明の便宜のためにキューの例を示したが、一般的にデータ保持部と呼ぶことができる。すなわち、本実施形態は、このデータ保持機構をキューに限定するものではなく、データ保持機構はスタック等のようなデータ構造であってもよい。
【0050】
キュー230は、有限サイズで定義されている場合、そのサイズ以上にデータを投入しようとする処理がブロックされ、保持されていないデータを取り出そうとする処理がブロックされる、そのようなデータ構造である。但し、本実施形態におけるデータ同期機構は、処理をブロックすることなくデータ保持を可能とすることで、継続オブジェクトの実行時間を短くする。キュー230は、例えばキューオブジェクトとして実現される。
【0051】
キュー230は、投入待ちリスト及びデータ待ちリストを持ち、次のように動作する。キュー230は、キュー230へのデータ投入時、キュー230からのデータ取出し操作時に継続オブジェクトの指定を受ける。キュー230は、データ投入時であって投入されるデータのサイズ分キュー230に空きがない場合には、その投入されるデータ及びその指定された継続オブジェクトを関連付けて投入待ちリストに保持する。
【0052】
キュー230は、空きが生じると、投入待ちリストに保持されていたデータをキュー230に投入した後、そのデータに関連付けられた継続オブジェクトを対応する処理スタックに実行させる。また、キュー230は、データ取出し時であって取り出すべきデータがキュー230にない場合には、その指定された継続オブジェクトをデータ待ちリストに保持する。キュー230は、データがキュー230に投入されると、そのデータを取り出し、データ待ちリストに保持されていた継続オブジェクトをその取り出されたデータを引数として、対応する処理スタックに実行させる。これにより、処理スタックは、実行中の継続オブジェクトにより空のキュー230からのデータ取り出し処理又はキュー230への制限を超えるデータ投入処理が行われる場合には、次の継続オブジェクトをそのキュー230と関連付けて保持した後、その継続オブジェクトの実行を終了する。
【0053】
キュー230が利用される場合には、キューテーブル235に、そのキュー230に関する情報が格納される。つまり、キューテーブル235には、利用される各キュー230についての情報がそれぞれ格納される。キュー230に関する情報としては、そのキュー230を識別するための識別情報(以降、キューIDと表記する)、そのキュー230のオブジェクトが格納される。
【0054】
キュー230は、他のワーカ200からも利用され得る。ここで、リカバリが行われた場合、キュー230のアドレスが変化する。よって、他のワーカ200からキュー230を指定する際、そのアドレスを用いることはできないため、キュー230は上述のようにキューIDで管理される。他のワーカ200は、このキューIDを用いて、キュー230を指定する。
【0055】
このような変数同期機構及びデータ保持機構は、例えば、ライブラリとして実現される。このライブラリは、予めワーカ200に含まれていてもよいし、他のプロセスから送られるようにしてもよい。
【0056】
上述したように、継続プール211、213、215及び217、同期変数220及びキュー230は、ワーカ200内の処理スレッドのみでなく、他のワーカ200から利用されることも可能である。即ち、第2実施形態は、或るワーカ200が、他のワーカ200の継続プールに継続オブジェクトを投入すること、他のワーカ200の同期変数220を定義及び参照すること、他のワーカ200のキュー230にデータを投入すること、他のワーカ200のキュー230からデータを取り出すことを可能とする。これを可能とするために、ワーカ200間通信が行われる。
【0057】
ワーカテーブル270は、ワーカ200間通信のために利用される。ワーカテーブル270は、各ワーカ200についてそのワーカ200を識別するためのワーカID及びアドレス情報をそれぞれ格納する。アドレス情報とは、そのワーカ200が存在する装置のIPアドレスやポート番号等である。他のワーカ200の継続プール、同期変数、キュー等にアクセスしたい処理スレッドは、このワーカテーブル270から他のワーカ200のアドレスを取得し、このアドレスを指定してアクセスする。ワーカ200間の通信手法自体は、RPC(Remote Procedure Call)で利用されているような周知の通信手法が利用されればよいため、ここでは説明を省略する。
【0058】
保存処理部250は、要求応答部260からの指示に応じて、継続プール211、213、215及び217に格納されるデータに加えて、上述の同期変数220に関するデータ、キュー230に関するデータ及びワーカテーブル270を実行状態ファイルに保存する。同期変数220に関するデータとしては、同期変数テーブル225に格納される各同期変数220に関する同期変数ID及び同期変数オブジェクト、並びに、各同期変数220に登録される継続オブジェクトが保存される。キュー230に関するデータとしては、キューテーブル235に格納される各キュー230に関するキューID及びキューオブジェクト、並びに、各キュー230に登録される継続オブジェクトが保存される。なお、保存処理部250による実行状態ファイルの保存には、保存時とリカバリ時との整合性(ポインタ操作等)が取られるように、例えば、シリアライズ機構が利用される。
【0059】
更に、保存処理部250は、要求応答部260からリカバリの指示を受けた場合には、最近保存された実行状態ファイル内のデータで自ワーカ200の動作状態をリカバリする。つまり、当該実行状態ファイル内のデータが各継続プール、各同期変数220、各キュー230、同期変数テーブル225、キューテーブル235にそれぞれ反映される。
【0060】
要求応答部260は、マスタ100からの要求を受け付け、その要求に応じた処理を行う。要求応答部260の具体的処理については、動作例の項において説明する。
【0061】
〔マスタプロセス〕
マスタ100は、ワーカ制御部101を有する。マスタ100は、ワーカ制御部101を介して、処理対象となるタスクのエントリ処理、各ワーカ200の実行状態ファイルの保存、各ワーカ200の障害発生のチェック、ワーカ200に障害が生じた場合のリカバリ等を行う。タスクのエントリ処理では、ワーカ制御部101は、例えば、そのタスクで指定されたワーカ200の制御用継続プール211にそのタスクの継続オブジェクトを投入する。
【0062】
ここで、ワーカ200に障害が生じた場合のリカバリとは、障害が検知された際に保存されている実行状態ファイルが示す実行状態に、全ワーカ200を戻すことを意味する。その他、ワーカ制御部101の具体的処理については、動作例の項において説明する。
【0063】
〔スペアワーカプロセス〕
スペアワーカ300は、障害が発生したワーカ200の代替として動作するプロセスである。よって、スペアワーカ300は、代替対象となるワーカ200と同じ処理部を有していればよい。スペアワーカ300は、ワーカ200に障害が発生した際に生成されてもよいし、予め、ワーカ200と同時期に生成されるようにしてもよい。スペアワーカ300の具体的処理についても、動作例の項において説明する。
【0064】
〔動作例〕
以下、第2実施形態における分散処理システム2の動作例について説明する。
まず、各ワーカ200の動作例について
図5及び
図6を用いて説明する。
図5は、第2実施形態におけるワーカ200の動作例を示すフローチャートである。
図6は、タスクの処理内容例及び処理タイミング例を示す図である。
【0065】
ワーカ200において、制御処理スレッド212は、制御用継続プール211から継続オブジェクトを取り出す前に、スレッド停止要求の有無を確認する(S501)。制御処理スレッド212は、スレッド停止要求が有ると判断すると(S501;YES)、処理を停止する(S505)。処理停止以降、制御処理スレッド212は、任意のタイミングでスレッド実行要求の有無を確認し、スレッド実行要求があれば再度処理を開始するようにしてもよいし、要求応答部260からスレッド実行要求を受けた際に処理を開始するようにしてもよい。
【0066】
一方、制御処理スレッド212は、スレッド停止要求が無いと判断すると(S501;NO)、自スレッドに対応する制御用継続プール211に継続オブジェクトが格納されているか否かを判定する(S502)。制御処理スレッド212は、制御用継続プール211に継続オブジェクトが格納されていない場合には(S502;NO)、制御用継続プール211に継続オブジェクトが投入されるか、又は、スレッド停止要求がくるまで待機する(S506)。
【0067】
制御処理スレッド212は、制御用継続プール211に継続オブジェクトが格納されている場合には(S502;YES)、制御用継続プール211から継続オブジェクトを取り出す(S503)。制御処理スレッド212は、その取り出した継続オブジェクトを実行する(S504)。継続オブジェクトに次の継続オブジェクトの生成処理が含まれている場合には、制御処理スレッド212は、次の継続オブジェクトを生成し、対応する継続プールにその生成された継続オブジェクトを投入する。制御処理スレッド212は、継続オブジェクトの実行が完了すると、次の継続オブジェクトを取り出す前に、再度、スレッド停止要求の有無を確認する(S501)。このような動作は、計算処理スレッド214、ディスク処理スレッド216、ネットワーク処理スレッド218においても同様である。
【0068】
第2実施形態では、ワーカ200内に複数の処理スレッドが存在するため、上述のような処理が並列に実行され得る。例えば、
図6(a)に示すようなタスクがワーカ200に投入されたと仮定する。この例のタスクは処理A及び処理Bを含み、処理Aには、計算A、ディスクアクセス処理A(
図6(a)に示すディスクI/O A)及びネットワーク処理A(
図6(a)に示すネットワークI/O A)が含まれ、処理Bには、計算B、ディスクアクセス処理B及びネットワーク処理Bが含まれる。
【0069】
この場合、計算Aを含む継続オブジェクト及び計算Bを含む継続オブジェクトが計算用継続プール213に投入され、ディスクアクセス処理Aを含む継続オブジェクト及びディスクアクセス処理Bを含む継続オブジェクトがディスク用継続プール215に投入され、ネットワーク処理Aを含む継続オブジェクト及びネットワーク処理Bを含む継続オブジェクトがネットワーク用継続プール217に順次投入される。
【0070】
計算処理スレッド214、ディスク処理スレッド216及びネットワーク処理スレッド218は、対応する各継続プールから継続オブジェクトをそれぞれ取り出し、取り出された各継続オブジェクトをそれぞれ実行する。結果、
図6(b)に示されるように、処理A内の各処理単位及び処理B内の各処理単位はそれぞれシーケンシャルに処理されつつ、計算Bとディスクアクセス処理A、及び、ディスクアクセス処理Bとネットワーク処理Aとがそれぞれ並列に処理される。
【0071】
このように第2実施形態によれば、第1実施形態と同様の効果、即ち、タスク実行途中の状態を容易に保存することができること、柔軟なシステム構築を可能とすることという効果を奏しつつ、更に、高速処理を可能とする。
【0072】
次に、各ワーカ200における同期変数220の読み出し時及び同期変数220への書き込み時の動作について
図7及び
図8を用いて説明する。
図7は、同期変数220の読み出し時の動作例を示すフローチャートであり、
図8は、同期変数220への書き込み時の動作例を示すフローチャートである。
図7及び8に示される動作は、例えば、上述の
図5に示す動作例における継続オブジェクトの実行(S504)に含まれる。
【0073】
同期変数220の読み出し時には、処理スレッドは、継続オブジェクトを引数として与え、同期変数220に対して読み出し要求を行う(S701)。処理スレッドは、この同期変数220が定義済みか否かを確認する(S702)。処理スレッドは、この同期変数220が定義済みでなければ(S702;NO)、引数として与えられた継続オブジェクトを同期変数220に登録し(S704)、処理を終了させる。
【0074】
処理スレッドは、同期変数220が定義済みであれば(S702;YES)、引数として与えられた継続オブジェクトに対応する関数の第1引数として同期変数220の値を設定し、その継続オブジェクトを実行する(S703)。なお、この動作例では、同期変数220の値を継続オブジェクトに対応する関数の第1引数に設定しているが、本実施形態はこのような形態に限定するものではない。例えば、同期変数220の値は第2引数に設定されてもよい。
【0075】
同期変数220への書き込み時には、処理スレッドは、値を引数として与えることにより同期変数220の定義要求を行う(S801)。処理スレッドは、その同期変数220に登録されていた継続オブジェクトが存在すれば(S802;YES)、その登録されている継続オブジェクトに対応する関数の第1引数として同期変数220の値を設定し、その継続オブジェクトを実行する(S803)。一方、処理スレッドは、その同期変数220に登録されていた継続オブジェクトが存在しない場合には(S802;NO)、処理を終了する。
【0076】
図9は、同期変数220を利用したタスクプログラム例を示す図である。
図9のタスクプログラム例は、
図2Bの例を同期変数220を用いるように変更したものである。
【0077】
図9の例では、Sync<int>がint型の変数を保持する同期変数220である。sample関数では、同期変数aの値を読み出すために、make_cont_noarg1関数により継続オブジェクトが作成され、この継続オブジェクトを引数として与えて同期変数aのreadメンバ関数が呼ばれる。ここで、make_cont_noarg1関数は、inc関数のポインタと変数retとを引数として、継続オブジェクトを生成する。
【0078】
readメンバ関数に指定された継続オブジェクトは、同期変数aの値が定義されると、第1引数に同期変数aの値を指定して実行される。このために、例えば、
図3の例の場合、継続オブジェクトに対し、set_arg1()メンバ関数が呼び出される。
【0079】
一方、dbl関数では、writeメンバ関数を用いて同期変数retの値が定義されている。これにより、同期変数retの値を待っていた継続オブジェクト、即ち、同期変数retが未定義のため登録されていた継続オブジェクトが存在すれば、その継続オブジェクトが実行される。同期変数220は上述のように同期変数IDで管理される。そこで、
図9の例では、例えば、Sync型の変数が、内部に同期変数IDを持ち、readメンバ関数やwriteメンバ関数において同期変数テーブル225からその同期変数IDに対応するその同期変数220のアドレスが取得されるようにしてもよい。
【0080】
次に、各ワーカ200におけるキュー230からデータを取り出す際及びキュー230にデータを投入する際の動作について
図10及び
図11を用いて説明する。
図10は、キュー230からデータを取り出す際の動作例を示すフローチャートであり、
図11は、キュー230にデータを投入する際の動作例を示すフローチャートである。
図10及び
図11に示される動作は、例えば、上述の
図5に示す動作例における継続オブジェクトの実行(S504)に含まれる。
【0081】
キュー230からデータを取り出す際には、処理スレッドは、継続オブジェクトを引数として与え、キュー230からのデータの取り出し要求を行う(S1001)。処理スレッドは、キュー230が空の場合には(S1002;YES)、引数として与えられた継続オブジェクトをそのキュー230のデータ待ちリストに登録する(S1003)。
【0082】
一方、処理スレッドは、キュー230が空でない場合(S1002;NO)、キュー230からデータを取り出す(S1004)。続いて、処理スレッドは、引数として与えられた継続オブジェクトに対応する関数の第1引数としその取り出されたデータを設定し、その継続オブジェクトを実行する(S1005)。
【0083】
その後、処理スレッドは、キュー230の投入待ちリストが空か否かを確認する(S1006)。処理スレッドは、投入待ちリストが空であれば(S1006;YES)、処理を終了し、投入待ちリストが空でなければ(S1006;NO)、その投入待ちリストからデータと継続オブジェクトとのペアを取り出す(S1007)。処理スレッドは、取り出されたデータをそのキュー230に投入し(S1008)、同様に取り出された継続オブジェクトを実行する(S1009)。
【0084】
キュー230にデータを投入する際には、処理スレッドは、継続オブジェクトを引数として与え、キュー230へのデータの投入を要求する(S1101)。続いて、処理スレッドは、その投入すべきデータのサイズ分、キュー230に空きがあるか否かを判定する(S1102)。処理スレッドは、キュー230に空きがない場合(S1102;NO)、その投入すべきデータと継続オブジェクトとのペアをそのキュー230の投入待ちリストに登録する(S1103)。
【0085】
一方、処理スレッドは、キュー230に空きがある場合(S1102;YES)、そのキュー230にそのデータを投入し(S1104)、更に、引数として与えられた継続オブジェクトを実行する(S1105)。
【0086】
その後、処理スレッドは、そのキュー230のデータ待ちリストが空か否かを判定する(S1106)。処理スレッドは、データ待ちリストが空である場合には(S1106;YES)、処理を終了する。一方、処理スレッドは、データ待ちリストが空でない場合(S1106;NO)、そのデータ待ちリストから継続オブジェクトを取り出す(S1107)。
【0087】
続いて、処理スレッドは、キュー230からデータを取り出し(S1108)、上記取り出された継続オブジェクトに対応する関数の第1引数としてその取り出されたデータを設定し、その継続オブジェクトを実行する(S1109)。これにより、キュー230からデータを取り出す際にキュー230が空だった場合の処理が継続される。
【0088】
次に、各ワーカ200の実行状態を保存する際の動作例について
図12を用いて説明する。
図12は、マスタ100が各ワーカ200の実行状態を保存する際の動作例を示すフローチャートである。マスタ100は、所定の周期で、以下のような各ワーカ200の実行状態を保存する処理を実行する。なお、この処理は、所定の周期に限らず、任意のタイミングで実行されるようにしてもよい。
【0089】
実行状態の保存処理を開始すると、マスタ100のワーカ制御部101は、全ワーカ200に対して、スレッド停止要求を送る(S1201)。これにより、上述したように、各ワーカ200の各処理スレッドはそれぞれ、スレッド停止要求の有無を確認することにより(
図5のS501)、処理を停止する(
図5のS505)。このとき、例えば、各ワーカ200の要求応答部260は、自ワーカ200内の全処理スレッドの停止を確認し、その旨をマスタ100に通知する。
【0090】
ワーカ制御部101は、全ワーカ200の全処理スレッドの停止を確認すると(S1202)、続いて、全ワーカに実行状態の保存要求を送る(S1203)。この要求により、各ワーカ200の保存処理部250がその時点での保存対象データをシリアライズし、実行状態ファイルに保存する。保存対象データには、制御用継続プール211、計算用継続プール213、ディスク用継続プール215及びネットワーク用継続プール217に格納されているデータ、同期変数220に関するデータ、キュー230に関するデータ、ワーカテーブル270のデータが含まれる。
【0091】
更に、ワーカ制御部101は、全ワーカ200に対して、保存された実行状態ファイルを指定された他のワーカに送信するように要求する(S1204)。例えば、他のワーカとして、そのワーカが実行される装置(ノード)とは異なる装置上で実行されるワーカが指定される。これは、ノード障害時にはその障害ノードに保存された実行状態ファイルにアクセスできなくなるからである。これにより、各ワーカ200の保存処理部250は、保存された実行状態ファイルのコピーを指定された他のワーカに送信する。結果、各ワーカ200の実行状態ファイルは、少なくとも2つの装置(ノード)にそれぞれ保存される。ワーカ制御部101は、各ワーカ200の実行状態ファイルが保存されるワーカの情報を保持する。
【0092】
ワーカ制御部101は、全ワーカが実行状態の保存と、他のワーカへの実行状態ファイルの送信とを完了したことを確認すると(S1205)、全ワーカ200に対して、全処理スレッドの再開を要求する(S1206)。これにより、全ワーカ200の全処理スレッドにおける或る時点の実行状態が保存される。
【0093】
なお、上記手順では、マスタ100のワーカ制御部101が各ワーカ200を制御する例が示されたが、ワーカ制御部101は、全ワーカ200に実行状態保存要求のみを送るようにし、各ワーカ200がスレッドの停止、実行状態ファイルの保存及び他のワーカへの送信、スレッドの再開を制御するようにしてもよい。
【0094】
最後に、第2実施形態の分散処理システム2におけるワーカに障害が発生した場合のリカバリ動作の例について
図13を用いて説明する。
図13は、第2実施形態の分散処理システム2におけるワーカに障害が発生した場合のリカバリ動作の例を示すフローチャートである。
【0095】
マスタ100は、ワーカ制御部101を介して、所定の周期で各ワーカ200の障害発生状況を確認する(S1301、S1302、S1302;NO)。なお、この処理は、所定の周期に限らず、任意のタイミングで実行されるようにしてもよい。
【0096】
マスタ100のワーカ制御部101は、障害の発生したワーカ(以降、障害ワーカと表記する)が存在すると判断すると(S1302;YES)、障害ワーカ以外の正常ワーカに対してリカバリ要求を送る(S1303)。この要求を受けた各正常ワーカでは、保存処理部250が、最近保存された実行状態ファイル内のデータで自ワーカ200の動作状態をリカバリする。具体的には、保存処理部250は、各処理スレッドを停止させた後、実行状態ファイル内のデータを各継続プール、同期変数220、同期変数テーブル225、キュー230、キューテーブル235、ワーカテーブル270に反映させる。
【0097】
続いて、ワーカ制御部101は、スペアワーカ300に対してリカバリ要求を送る(S1304)。このリカバリ要求には、例えば、障害ワーカの実行状態ファイルを持つワーカのワーカIDが含まれる。これにより、スペアワーカ300では、保存処理部250が、そのワーカIDで特定される他のワーカから実行状態ファイルを取得し、その実行状態ファイルに含まれるデータを用いて動作状態をリカバリする。これにより、スペアワーカ300では、障害ワーカの実行状態が回復されることになる。
【0098】
ワーカ制御部101は、障害ワーカを除く全ワーカ(スペアワーカ300を含む)のリカバリが完了したことを確認すると(S1305)、その各ワーカにワーカテーブル270の更新を要求する(S1306)。これにより、スペアワーカ300を含む各ワーカでは、障害ワーカの情報とその代替として利用されたスペアワーカ300の情報がワーカテーブル270に反映される。
【0099】
ワーカ制御部101は、全ワーカのワーカテーブル270が更新されたことを確認すると(S1307)、全ワーカに全処理スレッドの再開を要求する(S1308)。正常ワーカ及びスペアワーカ300は、この要求を受け付け、各処理スレッドを再開させる。これにより、ワーカの障害発生が検知された時点から直近に保存された実行状態により、分散処理システム2の動作状態が復旧する。
【0100】
このように第2実施形態では、同期変数220及びキュー230というデータ同期の機構が設けられているため、タスクの並列処理が可能となり、処理の高速化を実現することができる。更に、第2実施形態は、実行状態保存時には、同期変数220及びキュー230に関するデータも保存対象としているため、完全なる実行状態の保存を可能としている。
【0101】
更に、第2実施形態では、マスタ100が各ワーカ200の実行状態の保存を制御しつつ、各ワーカ200の障害発生状況を確認する。そして、障害発生時には、実行状態ファイル及びスペアワーカが用いられることにより、障害発生前の実行状態に回復して実行が再開されるため、高信頼な処理を可能としている。
【0102】
〔ハードウェア構成]
図14は、第2実施形態における分散処理システム2のハードウェア構成例を示す概念図である。第2実施形態における分散処理システム2は、複数のコンピュータ5により構成される。ここで、コンピュータ5とは、CPU10、メモリ(RAM12、ROM(図示せず)、ハードディスク(HDD)14等)、入出力インタフェース16等を含み、メモリに格納されたプログラムを実行するためのハードウェア要素群を示す概念である。よって、コンピュータ5は、パーソナルコンピュータのような1台の装置として実現されたものであってもよいし、CPUボードといった1台の装置に複数装着可能な単位であってもよい。上述の説明ではノードとも表記している。
【0103】
図14に示すように、マスタ100、各ワーカ200、スペアワーカ300はそれぞれ異なるコンピュータ(ノード)5上で実現されることが望ましい。これにより、コンピュータ5の故障に起因してワーカ200に異常が生じた場合には、他のコンピュータ上で実現されるスペアワーカ300でリカバリされるからである。分散処理システム2に含まれるマスタ100、各ワーカ200及びスペアワーカ300は、各コンピュータ5内のメモリに記憶されるプログラムがCPU10により実行されることで、実現される。マスタ100、各ワーカ200及びスペアワーカ300を構成する各処理部についても同様である。
【0104】
また、第2実施形態では、1つの処理スレッドに1つの継続プールを対応付けたが、複数の処理スレッドで1つの継続プールが共有されるようにしてもよいし、1つの処理スレッドが複数の継続プールに対応づけられていてもよい。
【0105】
上記の各実施形態及び各変形例の一部又は全部は、以下の付記のようにも特定され得る。但し、各実施形態及び各変形例が以下の記載に限定されるものではない。
【0106】
(付記1)タスクを構成する複数の処理のうちの少なくとも1つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、
前記オブジェクト格納部から取り出された前記継続オブジェクトを実行する処理手段と、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段と、
を備えることを特徴とする分散処理装置。
【0107】
(付記2)前記処理手段は、前記継続オブジェクトを実行することにより次の継続オブジェクトを生成し、この生成された次の継続オブジェクトを前記オブジェクト格納部に格納した後、前記継続オブジェクトの実行を終了する、
ことを特徴とする付記1に記載の分散処理装置。
【0108】
(付記3)前記オブジェクト格納部及び前記処理手段を複数備え、
前記各オブジェクト格納部は、それぞれ異なる計算資源を利用する継続オブジェクトを格納し、
前記各処理手段は、各オブジェクト格納部からそれぞれ取り出される継続オブジェクトを並列に実行する、
ことを特徴とする付記1又は2に記載の分散処理装置。
【0109】
(付記4)同期変数を更に備え、
前記複数の処理手段の少なくとも1つは、実行中の第1の継続オブジェクトにより未定義状態の同期変数の読み出しが行われる場合には、第2の継続オブジェクトをその同期変数に登録した後、第1の継続オブジェクトの実行を終了し、
前記保存処理手段は、前記同期変数に登録されている前記第2の継続オブジェクトを実行状態ファイルに更に保存する、
ことを特徴とする付記3に記載の分散処理装置。
【0110】
(付記5)データ保持部を更に備え、
前記複数の処理手段の少なくとも1つは、実行中の第1の継続オブジェクトにより空のデータ保持部からのデータ取り出し処理又はデータ保持部への制限を超えるデータ投入処理が行われる場合には、第2の継続オブジェクトをそのデータ保持部に登録した後、第1の継続オブジェクトの実行を終了し、
前記保存処理手段は、前記データ保持部に登録されている前記第2の継続オブジェクトを実行状態ファイルに更に保存する、
ことを特徴とする付記3又は4に記載の分散処理装置。
【0111】
(付記6)複数のコンピュータから構成される分散処理システムにおいて、
タスクを構成する複数の処理のうちの少なくとも1つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、
前記オブジェクト格納部から取り出された前記継続オブジェクトを実行する処理手段と、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段と、
をそれぞれ含む複数のワーカプロセスと、
所定のタイミングで前記各ワーカプロセスに対し前記保存処理手段による保存処理を要求するマスタプロセスと、
を備え、
前記マスタプロセスは、前記保存処理を要求する際には、前記各ワーカプロセスに対し、各実行状態ファイルを保存させる他のワーカプロセスをそれぞれ指定する、
ことを特徴とする分散処理システム。
【0112】
(付記7)前記各ワーカプロセスが有する前記複数のオブジェクト格納部、前記複数の処理手段及び前記保存処理手段を含むスペアワーカプロセスを更に備え、
前記スペアワーカプロセスの保存処理手段は、障害の発生したワーカプロセスが検出された場合に、その障害の発生したワーカプロセスの実行状態ファイルを他のワーカプロセスから取得し、この取得された実行状態ファイルに含まれるデータを前記各オブジェクト格納部にリストアし、
前記障害の発生したワーカプロセス以外のワーカプロセスの保存処理手段は、前記障害の発生したワーカプロセスが検出された場合に、自ワーカプロセスの実行状態ファイルに含まれるデータを前記各オブジェクト格納部にリストアする、
ことを特徴とする付記6に記載の分散処理システム。
【0113】
(付記8)前記複数のワーカプロセス及び前記スペアワーカプロセスはそれぞれ、各ワーカプロセスについての情報をそれぞれ格納するワーカテーブルを更に含み、
前記マスタプロセスは、前記障害の発生したワーカプロセス以外の各ワーカプロセス及び前記スペアワーカプロセスに対して、前記障害の発生したワーカプロセス及び前記スペアワーカプロセスの各情報を用いて前記各ワーカテーブルを更新させる、
ことを特徴とする付記7に記載の分散処理システム。
【0114】
(付記9)少なくとも1つのコンピュータが、
タスクを構成する複数の処理のうちの少なくとも1つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを生成し、
前記生成された継続オブジェクトをオブジェクト格納部に格納し、
前記オブジェクト格納部から前記継続オブジェクトを取り出し、
前記取り出された継続オブジェクトを実行し、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する、
ことを含むことを特徴とする分散処理方法。
【0115】
(付記10)前記少なくとも1つのコンピュータが、
前記継続オブジェクトを実行することにより次の継続オブジェクトを生成し、
前記生成された次の継続オブジェクトを前記オブジェクト格納部に格納した後、前記継続オブジェクトの実行を終了する、
ことを更に含む付記9に記載の分散処理方法。
【0116】
(付記11)タスクを構成する複数の処理のうちの少なくとも1つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、
前記オブジェクト格納部から取り出された前記継続オブジェクトを実行する処理手段と、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段と、
を少なくとも1つのコンピュータに実現させることを特徴とするプログラム。
【0117】
(付記12)前記処理手段は、前記継続オブジェクトを実行することにより次の継続オブジェクトを生成し、この生成された次の継続オブジェクトを前記オブジェクト格納部に格納した後、前記継続オブジェクトの実行を終了する、
ことを特徴とする付記11に記載のプログラム。
【0118】
(付記13)前記少なくとも1つのコンピュータに、前記オブジェクト格納部及び前記処理手段を複数実現させ、
前記各オブジェクト格納部は、それぞれ異なる計算資源を利用する継続オブジェクトを格納し、
前記各処理手段は、各オブジェクト格納部からそれぞれ取り出される継続オブジェクトを並列に実行する、
ことを特徴とする付記11又は12に記載のプログラム。
【0119】
(付記14)同期変数を前記少なくとも1つのコンピュータに更に実現させ、
前記複数の処理手段の少なくとも1つは、実行中の第1の継続オブジェクトにより未定義状態の同期変数の読み出しが行われる場合には、第2の継続オブジェクトをその同期変数に登録した後、第1の継続オブジェクトの実行を終了し、
前記保存処理手段は、前記同期変数に登録されている前記第2の継続オブジェクトを実行状態ファイルに更に保存する、
ことを特徴とする付記13に記載のプログラム。
【0120】
(付記15)データ保持部を前記少なくとも1つのコンピュータに更に実現させ、
前記複数の処理手段の少なくとも1つは、実行中の第1の継続オブジェクトにより空のデータ保持部からのデータ取り出し処理又はデータ保持部への制限を超えるデータ投入処理が行われる場合には、第2の継続オブジェクトをそのデータ保持部に登録した後、第1の継続オブジェクトの実行を終了し、
前記保存処理手段は、前記データ保持部に登録されている前記第2の継続オブジェクトを実行状態ファイルに更に保存する、
ことを特徴とする付記13又は14に記載のプログラム。
【0121】
(付記16)複数のコンピュータから構成される分散処理システムに、
タスクを構成する複数の処理のうちの少なくとも1つを含みそのタスクの処理途中のデータを保持する継続オブジェクトを格納するオブジェクト格納部と、
前記オブジェクト格納部から取り出された前記継続オブジェクトを実行する処理手段と、
前記オブジェクト格納部に格納されるデータを実行状態ファイルに保存する保存処理手段と、
をそれぞれ含む複数のワーカプロセスと、
所定のタイミングで前記各ワーカプロセスに対し前記保存処理手段による保存処理を要求するマスタプロセスと、
を実現させ、
前記マスタプロセスは、前記保存処理を要求する際には、前記各ワーカプロセスに対し、各実行状態ファイルを保存させる他のワーカプロセスをそれぞれ指定する、
ことを特徴とするプログラム。
【0122】
(付記17)前記各ワーカプロセスが有する前記複数のオブジェクト格納部、前記複数の処理手段及び前記保存処理手段を含むスペアワーカプロセスを前記分散処理システムに更に実現させ、
前記スペアワーカプロセスの保存処理手段は、障害の発生したワーカプロセスが検出された場合に、その障害の発生したワーカプロセスの実行状態ファイルを他のワーカプロセスから取得し、この取得された実行状態ファイルに含まれるデータを前記各オブジェクト格納部にリストアし、
前記障害の発生したワーカプロセス以外のワーカプロセスの保存処理手段は、前記障害の発生したワーカプロセスが検出された場合に、自ワーカプロセスの実行状態ファイルに含まれるデータを前記各オブジェクト格納部にリストアする、
ことを特徴とする付記16に記載のプログラム。
【0123】
(付記18)前記複数のワーカプロセス及び前記スペアワーカプロセスはそれぞれ、各ワーカプロセスについての情報をそれぞれ格納するワーカテーブルを更に含み、
前記マスタプロセスは、前記障害の発生したワーカプロセス以外の各ワーカプロセス及び前記スペアワーカプロセスに対して、前記障害の発生したワーカプロセス及び前記スペアワーカプロセスの各情報を用いて前記各ワーカテーブルを更新させる、
ことを特徴とする付記17に記載のプログラム。
【0124】
この出願は、2010年10月14日に出願された日本出願の特願2010−231144号を基礎とする優先権を主張し、その開示の全てをここに取り込む。