(57)【要約】【課題】並列計算ジョブを構成するタスクを、計算機間で効率的に移動する方法を提供する。【解決手段】ネットワークによって接続された複数の計算機を備え、前記各計算機はジョブを構成する複数のタスクをスケジューリングに従って実行する計算機システムであって、前記計算機間でタスクを移動する場合、前記タスクの実行状態を参照して、処理が終了したタスクを優先的に移動すべきタスクに選択する。【選択図】図１
2011197896.tif 000002
【特許請求の範囲】
【請求項１】
ネットワークによって接続された複数の計算機を備え、前記各計算機はジョブを構成する複数のタスクをスケジューリングに従って実行する計算機システムであって、
前記計算機間でタスクを移動する場合、前記タスクの実行状態を参照して、処理が終了したタスクを優先的に移動すべきタスクに選択することを特徴とする計算機システム。
【請求項２】
前記計算機システムは、前記各計算機が、複数のタスクを並列実行する並列実行環境を構成し、
前記各タスクの処理と、前記ジョブを構成する全てのタスクの処理の完了を待つ処理とが一つの処理フェーズに定義され、
前記計算機間でタスクを移動する場合、前記タスクの実行状態を参照して、前記処理フェーズにおいて処理が終了したタスクを優先的に移動すべきタスクに選択することを特徴とする請求項１に記載の計算機システム。
【請求項３】
前記各計算機は、タスクによって利用されるメモリ領域に格納されたデータを二次記憶装置に退避するスワップアウト機能及び前記退避されたデータをメモリに格納するスワップイン機能を備え、
前記退避されたデータを利用するタスクを、優先的に移動すべきタスクに選択することを特徴とする請求項１に記載の計算機システム。
【請求項４】
前記各計算機は、スワップインするデータが少ないタスクを優先的に実行されるようにスケジューリングすることを特徴とする請求項３に記載の計算機システム。
【請求項５】
前記各計算機は、処理が終了したタスクが利用するデータを優先的にスワップアウトすべきデータに選択することを特徴とする請求項３に記載の計算機システム。
【請求項６】
前記各計算機は、
前記タスクによって利用されるメモリ領域に格納されたデータをスワップアウトする前に待機状態の時間を設定し、
前記待機状態であるタスクを優先的に移動すべきタスクに選択することを特徴とする請求項３に記載の計算機システム。
【請求項７】
ネットワークで相互に接続された複数の計算機上で、ジョブを構成する複数のタスクをスケジューリングに従って実行する計算機システムにおけるタスクの管理方法であって、
前記方法は、
前記計算機間でタスクを移動する場合、前記タスクの実行状態を判定するステップと、
前記判定されたタスクの実行状態に基づいて、処理が終了したタスクを優先的に移動すべきタスクに選択するステップとを含むことを特徴とするタスクの管理方法。
【請求項８】
前記計算機システムは、前記各計算機が、複数のタスクを並列実行する並列実行環境を構成し、
前記各タスクの処理と、前記ジョブを構成する全てのタスクの処理の完了を待つ処理とが一つの処理フェーズに定義され、
前記タスクを選択するステップでは、前記処理フェーズにおいて処理が終了したタスクを優先的に移動すべきタスクに選択することを特徴とする請求項７に記載のタスクの管理方法。
【請求項９】
前記各計算機は、タスクによって利用されるメモリ領域に格納されたデータを二次記憶装置に退避するスワップアウト機能及び前記退避されたデータをメモリに格納するスワップイン機能を備え、
前記方法は、前記退避されたデータを利用するタスクを、優先的に移動すべきタスクに選択するステップを含むことを特徴とする請求項７に記載のタスクの管理方法。
【請求項１０】
前記方法は、スワップインするデータが少ないタスクを優先的に実行されるようにスケジューリングするステップを含むことを特徴とする請求項９に記載のタスクの管理方法。
【請求項１１】
前記方法は、処理が終了したタスクが利用するデータを優先的にスワップアウトすべきデータに選択するステップを含むことを特徴とする請求項９に記載のタスクの管理方法。
【請求項１２】
前記方法は、
前記タスクによって利用されるメモリ領域に格納されたデータをスワップアウトする前に待機状態の時間を設定するステップと、
前記待機状態であるタスクを優先的に移動すべきタスクに選択するステップとを含むことを特徴とする請求項９に記載のタスクの管理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数の計算機によって並列分散処理を行う計算機システムに関し、特に、並列計算ジョブを構成するタスクを実行中の計算機から別の計算機に移動する技術に関する。
【背景技術】
【０００２】
一般に、大規模計算を行う場合、複数の計算機で並列計算を行うことによって、計算機システムの処理性能を向上させている。このような並列計算機システムでは、計算機の負荷に偏りが発生する場合がある。このため、計算機の負荷を平準化する技術として、ある計算機上で動作しているプロセスを他の計算機に移動させるプロセスマイグレーション技術が知られている。
【０００３】
例えば、特許文献１には、転送元プロセスのコピーを転送先計算機に作成し、その間に転送元プロセスの実行を継続し、転送元プロセスの実行記録を転送元計算機上に作成する。第１の転送処理が終了した後、転送先計算機に実行記録を転送するが、この第２の転送処理中にも転送元プロセスの実行を継続し、その実行記録を転送元計算機に作成する。このように実行記録の転送を繰り返し、転送予想時間が所定の長さ以下になった時点で、プロセスの実行を、転送元プロセスから転送先プロセスへ移行する。これによって、プロセスの停止時間を少なくしてプロセスを移動することができる。
【０００４】
また、特許文献２には、移動体端末が通信中の基地局の近くの計算機サーバからサービスを受けることによって、計算機サーバからのレスポンスを向上し、及び計算機リソースを節減するための技術である。特許文献２に記載された発明では、移動体端末の移動先を予測し、予測された移動先の計算機に予めプロセスのアドレス空間のデータを移動しておき、予測された移動先に移動体端末が移動することが明らかになった場合に、プロセスの実行を移行する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００４―７８４６５号公報
【特許文献２】特開２００４−８８２００号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
大規模計算は時間がかかるためジョブの実行時間を短くすることが重要であり、このためにネットワークやＣＰＵといった計算機資源の利用効率を向上する必要がある。特許文献１に記載された技術によると、未転送の差分データを繰り返し更新するため、計算機間で送受信されるデータは転送対象プロセスによって管理されるデータ量を超え、ネットワーク負荷が増える。また、複数回データを転送するため、転送処理のオーバーヘッドが増える。これら理由によって、プロセスを移動するためのネットワーク、ＣＰＵ等の計算機資源を多く必要とし、結果的にジョブ実行時間が長くなるという課題がある。
【０００７】
特許文献２に記載された技術は、移動体端末に対するサービスに特化したプロセス移動を最適化するものであり、複数の計算機を使用して大規模計算する用途に適用することができない。
【０００８】
本発明は、並列計算ジョブを構成するタスクを、計算機間で効率的に移動する方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明の代表的な一例を示せば以下の通りである。すなわち、ネットワークによって接続された複数の計算機を備え、前記各計算機はジョブを構成する複数のタスクをスケジューリングに従って実行する計算機システムであって、前記計算機間でタスクを移動する場合、前記タスクの実行状態を参照して、処理が終了したタスクを優先的に移動すべきタスクに選択することを特徴とする。
【発明の効果】
【００１０】
本発明によると、タスクの移動処理中におけるシステムのＣＰＵ利用率の低下を抑制することが可能となる。これによって、タスクの移動処理のオーバーヘッドを抑えることができる。
【図面の簡単な説明】
【００１１】
【図１】本発明の実施形態の計算機システムの構成図である。
【図２】本発明の実施形態の計算機のハードウェア構成図である。
【図３Ａ】本発明の実施形態のジョブ管理プロセスの内部構成図である。
【図３Ｂ】本発明の実施形態のノード内ジョブ管理プロセスの内部構成図である。
【図３Ｃ】本発明の実施形態のジョブ実行プロセスの内部構成図である。
【図４Ａ】本発明の実施の形態のジョブ管理プロセス内のスレーブ管理テーブルの構成図である。
【図４Ｂ】本発明の実施の形態のジョブ管理プロセス内のジョブ管理テーブルの構成図である。
【図４Ｃ】本発明の実施の形態のジョブ管理プロセス内のタスク管理テーブルの構成図である。
【図４Ｄ】本発明の実施の形態のジョブ管理プロセス内の移動中タスク管理テーブルの構成図である。
【図５Ａ】本発明の実施形態のノード内ジョブ管理プロセスの内部テーブルの構成図である。
【図５Ｂ】本発明の実施形態のノード内ジョブ管理プロセスの内部テーブルの構成図である。
【図５Ｃ】本発明の実施形態のノード内ジョブ管理プロセスの内部テーブルの構成図である。
【図６Ａ】本発明の実施形態のジョブ実行プロセスの内部テーブルの構成図である。
【図６Ｂ】本発明の実施形態のジョブ実行プロセスの内部テーブルの構成図である。
【図７】本発明の実施形態のタスクの状態遷移図である。
【図８】本発明の実施形態のタスクを実行する際のプロセス間通信を示すシーケンス図である。
【図９】本発明の実施形態のタスクのスケジューリング方法を示すフローチャートである。
【図１０】本発明の実施形態のタスクのスワップアウト方法を示すフローチャートである。
【図１１】本発明の実施形態の移動対象タスクの選択方法を示すフローチャートである。
【図１２】本発明の実施形態のタスクの移動方法を示すフローチャートである。
【発明を実施するための形態】
【００１２】
以下に、図面を参照して、本発明の実施形態について説明する。
【００１３】
図１は、本発明の実施形態の複数のノード（計算機）を用いて並列計算ジョブを実行する計算機システムの例を示す構成図である。
【００１４】
本実施の形態の計算機システムは、クライアントノード１０、マスタノード２０及びスレーブノード３０を備える。クライアントノード１０は、ジョブの実行を指示する計算機である。マスタノード２０は、ジョブの実行を管理する計算機である。スレーブノード３０は、ジョブ本体を実行する計算機である。本計算機システムは、１台のマスタノード２０と、必要な数のスレーブノード３０とを備える。スレーブノード３０の数を増やすことによって、計算機システムの計算能力を高めることができる。
【００１５】
この計算機システムは、複数のタスクから構成される並列計算ジョブを実行するシステムである。クライアントノード１０が、ジョブの実行をマスタノード２０に指示すると、マスタノード２０は、ジョブを構成する各タスクをスレーブノード３０に割り当て、スレーブノード３０が割り当てられたタスクを実行することによって、ジョブが実行される。
【００１６】
クライアントノード１０は、ジョブの実行を指示するクライアントプロセスＰ１を実行する。マスタノード２０は、ジョブ全体の実行を制御するジョブ管理プロセスＰ２と、分散ファイルシステム（ＦＳ）プロセスＰ５とを実行する。スレーブノード３０は、ノード内で動作するジョブの実行を制御するノード内ジョブ管理プロセスＰ３と、ジョブを実行するジョブ実行プロセスＰ４と、分散ＦＳプロセスＰ５を実行する。
【００１７】
ジョブ実行プロセスＰ４は、クライアントプロセスＰ１がジョブの実行を指示すると、動的に作成される。同一ノードにおいて、ジョブ毎にジョブ実行プロセスＰ４のインスタンスが作成される。従って、一つのノードが複数のジョブを同時に実行する場合、ノードに複数個のジョブ実行プロセスが生成される。ジョブの処理が終了した後、ジョブ実行プロセスＰ４は消滅する。
【００１８】
分散ＦＳは、ファイルの本体を複数のノードに分散配置し、どのノードからもすべてのファイルへ同一のパス名によるアクセスを可能にするファイルシステムである。ファイルサイズが大きい場合、一つのファイルが複数のノードに分割して配置される。分散ＦＳプロセスＰ５は、分散ＦＳを実現するためのプロセスであり、各プロセスは分散ＦＳプロセスを経由して、分散ＦＳ上のファイルにアクセスすることができる。以下、分散ＦＳプロセスを経由して分散ＦＳにアクセスすることを、単に、分散ＦＳにアクセスする、分散ＦＳからファイルを読み出す、等で表現する。
【００１９】
図２は、本発明の実施の形態の各ノード（計算機）のハードウェアの構成図である。
【００２０】
図２に示すように、各ノードは、プロセッサ（ＣＰＵ）１０１、ネットワークインターフェース（ＬＡＮ  Ｉ／Ｆ）１０２、入出力インターフェース１０３、メモリ１０４及びストレージインターフェース１０５を備え、これらの各部はノードの内部で接続されている。
【００２１】
プロセッサ１０１は、メモリに格納されたプログラムを実行する。入出力インターフェース１０３には、キーボード１０６、マウス１０７及びディスプレイ１０８が接続される。システムの利用者は、これらの入出力インターフェース１０３に接続された装置を使用してジョブの実行を指示する。ストレージインターフェース１０５には、ハードディスクドライブ等の記憶装置１０９が接続されている、記憶装置１０９は、オペレーティングシステム、各ノードで動作するプロセスのプログラム、及び並列計算によって解析されるデータが格納される。
【００２２】
システム起動時に、記憶装置１０９からプログラムがメモリ１０４に格納され、ＣＰＵ１０１がメモリ１０４に格納されたプログラムを実行する。なお、マスタノード２０とスレーブノード３０は、ユーザが直接入出力操作を行わないため、キーボード１０６、マウス１０７、ディスプレイ１０８を備えなくてもよい。
【００２３】
図３Ａ〜図３Ｃは、本発明の実施の形態の各ノードで実行されるプロセスの内部構成を示す図である。
【００２４】
図３Ａに示すジョブ管理プロセスＰ２は、ジョブ制御プログラムＰ２１、スレーブ管理テーブルＰ２２、ジョブ管理テーブルＰ２３、タスク管理テーブルＰ２４及び移動中タスク管理テーブルＰ２５を含む。例えば、ジョブ管理プロセスＰ２は、記憶装置１０９に格納されており、メモリ１０４に読み出され、ＣＰＵ１０１０により実行される。
【００２５】
ジョブ制御プログラムＰ２１は、ジョブを制御するサブプログラムである。従って、ジョブ制御プログラムＰ２１はメモリに格納されており、プロセッサ１０１によりメモリより読み出されて実行される。スレーブ管理テーブルＰ２２は、システム内のスレーブノード３０の情報を管理するための情報を保持する（図４Ａ参照）。ジョブ管理テーブルＰ２３は、実行中のジョブを管理するための情報を保持する（図４Ｂ参照）。タスク管理テーブルＰ２４は、実行中ジョブのタスクを管理するための情報を保持する（図４Ｃ参照）。移動中タスク管理テーブルＰ２５は、移動中のタスクを管理するための情報を保持する（図４Ｄ参照）。
【００２６】
図４Ａ〜図４Ｄは、本発明の実施の形態のジョブ管理プロセスＰ２に含まれるテーブルの構成図である。
【００２７】
図４Ａに示すスレーブ管理テーブルＰ２２は、スレーブＩＤ、ノードアドレス、最大タスク数、最大メモリ量、及びタスクＩＤ一覧を含み、システム内の全てのスレーブノードの情報を格納する。スレーブ管理テーブルＰ２の各エントリは各スレーブノードに対応する。
【００２８】
スレーブＩＤは、スレーブノード３０を一意に識別するための識別子である。ノードアドレスは、スレーブノード３０のネットワーク上のアドレスである。最大タスク数は、そのスレーブノードで同時に実行可能なタスクの数である。最大メモリ量は、そのスレーブノードでタスクが利用可能なメモリ量であり、例えば、単位はＭＢ（メガバイト）で表される。タスクＩＤ一覧は、そのスレーブノードで実行中のタスクの識別子である。
【００２９】
タスクＩＤ一覧は、例えば、ジョブの識別子（ジョブＩＤ）とタスク番号とを組み合わせたものが記載される。具体的には、図４Ａに示すように、最初のエントリ（スレーブＩＤ＝０１）のタスクＩＤ一覧の「Ｊ０１：１，Ｊ０１：２」は、ジョブＩＤが「Ｊ０１」でタスク番号が「１」のタスクと、ジョブＩＤが「Ｊ０１」でタスク番号が「２」のタスクが実行中であることを示す。
【００３０】
図４Ｂに示すジョブ管理テーブルＰ２３は、ジョブＩＤ、ジョブプログラム、初期データ、及びタスク番号一覧を含み、本計算機システムで実行中の全てのジョブの情報を格納する。ジョブ管理テーブルＰ２３の各エントリは実行中の各ジョブに対応する。
【００３１】
ジョブＩＤは、ジョブを一意に識別するための識別子である。ジョブプログラムは、ジョブの実行形式のプログラムであり、ジョブ実行プロセスＰ４内で実行される。初期データは、各タスクを初期化する際に各タスクに読み込まれるデータであり、分散ＦＳに格納されているファイルのファイル名で表される。タスク番号一覧は、このジョブを構成する全タスクのタスク番号である。ジョブ管理テーブルＰ２３のエントリはジョブＩＤ毎に設けられるため、ジョブ管理テーブルＰ２３のタスク番号一覧は、ジョブＩＤを含まない。
【００３２】
図４Ｃに示すタスク管理テーブルＰ２４は、ジョブＩＤ、タスク番号、実行状態、全データ量、スワップ量、及びスワップフラグを含み、システムで実行中の全てのタスクの情報を格納する。タスク管理テーブルＰ２４の各エントリは実行中のタスクに対応する。
【００３３】
ジョブＩＤは、ジョブを一意に識別するための識別子である。タスク番号は、ジョブ内でタスクを識別するための番号である。実行状態は、各タスクの実行状態を示し、図７に示す状態遷移図に示されたいずれかの状態となる。全データ量は、このタスクによって利用される全データ量であり、例えば、単位はＭＢ（メガバイト）で表される。なお、全データ量には、スワップ状態のデータの量も含まれる。スワップ量は、スワップされたデータの量であり、例えば、単位はＭＢ（メガバイト）で表される。スワップフラグは、タスクのデータのスワップ処理の状態を示し、ＩＤＬＥ（スワップ処理中ではない）、ＢＵＳＹ（スワップ処理中）、ＰＲＥ＿ＯＵＴ（スワップアウト処理を行う直前）のいずれかとなる。
【００３４】
なお、タスクによってメモリ１０４に保持されるデータを、記憶装置１０９に移動する処理がスワップアウトであり、記憶装置１０９に移動されたデータをメモリ１０４に戻す処理がスワップインである。
【００３５】
図４Ｄに示す移動中タスク管理テーブルＰ２５は、ジョブＩＤ、タスク番号、移動元スレーブＩＤ、移動先スレーブＩＤ、及び実行状態を含み、移動中の全てのタスクの情報が格納される。移動中タスク管理テーブルＰ２５の各エントリは移動中の各タスクに対応する。
【００３６】
ジョブＩＤは、ジョブを一意に識別するための識別子である。タスク番号は、タスクの番号は、ジョブ内でタスクを識別するための番号である。移動元スレーブＩＤ及び移動先スレーブＩＤは、各々、移動されるタスクの移動元のスレーブノード３０の識別子と、移動先のスレーブノード３０の識別子である。実行状態は、移動中タスクの移動前の状態が示され、タスク移動後にそのタスクの実行状態を移動前の実行状態に復帰するため、移動前の状態を保存するために使用される。
【００３７】
次に、図３Ｂに示すノード内ジョブ管理プロセスＰ３の構成を説明する。例えば、ノード内ジョブ管理プロセスＰ３は、記憶装置１０９に格納されており、メモリ１０４に読み出され、ＣＰＵ１０１０により実行される。
【００３８】
ノード内ジョブ管理プロセスＰ３は、ノード内ジョブ制御プログラムＰ３１、ノード内ジョブ管理テーブルＰ３２、タスク管理テーブルＰ３３及びメモリ管理テーブルＰ３４を含む。ノード内ジョブ制御プログラムＰ３１は、ジョブの実行を制御するプログラムである。従って、ジョブ制御プログラムＰ３１はメモリに格納されており、プロセッサ１０１によりメモリより読み出されて実行される。ノード内ジョブ管理テーブルＰ３２は、自ノードで実行中のジョブを管理するための情報を保持する（図５Ａ参照）。タスク管理テーブルＰ３３、実行中のタスクを管理するための情報を保持する（図５Ｂ参照）。メモリ管理テーブルＰ３４は、自ノードで実行中のタスクのメモリ使用状態を管理するための情報を保持する（図５Ｃ参照）。
【００３９】
図５Ａ〜図５Ｃは、ノード内ジョブ管理プロセスＰ３に含まれるテーブルの構成図である。
【００４０】
図５Ａに示すノード内ジョブ管理テーブルＰ３２は、ジョブＩＤ、ジョブプログラム、初期データ、及びタスク番号一覧を含み、このノードで実行中のジョブの情報のみが含まれる。ノード内ジョブ管理テーブルＰ３２の各エントリは、そのノードで実行中の各ジョブに対応する。
【００４１】
ノード内ジョブ管理テーブルＰ３２は、ジョブ管理プロセスＰ２に保持されるジョブ管理テーブルＰ２３と同じ構成であり、同名の各項目は同じ内容のデータを保持する。但し、ノード内ジョブ管理テーブルＰ３２には、そのノードで実行されているジョブの情報のみが含まれる。
【００４２】
図５Ｂに示すタスク管理テーブルＰ３３は、ジョブＩＤ、タスク番号、実行状態、及びノードアドレスを含み、システムで実行中のタスクの情報を格納する。なお、タスク管理テーブルＰ３３には、このノードで実行中のタスクの情報だけでなく、他ノードで実行中のタスクの情報も含まれるが、このノードで実行中のジョブ以外のジョブに対応するタスクの実行状態に関する情報は含まれない。タスク管理テーブルＰ３３の各エントリは実行中のタスクに対応する。
【００４３】
ジョブＩＤは、ジョブを一意に識別するための識別子である。タスク番号は、ジョブ内でタスクを識別するための番号である。実行状態はタスクの実行状態、実行状態は、各タスクの実行状態を示し、図７に示す状態遷移図に示されたいずれかの状態となる。なお、このノードで実行中のタスクの実行状態のみが格納される。ノードアドレスは、このジョブを実行中のスレーブノード３０のネットワーク上のアドレスである。なお、他のノードで実行中のタスクのノードアドレスのみが格納される。
【００４４】
図５Ｃに示すメモリ管理テーブルＰ３４は、ジョブＩＤ、タスク番号、データ名、データ量、及びスワップ状態を含み、このノードで実行中のすべてのタスクに割り当てられるメモリ領域の情報が含まれる。メモリ管理テーブルＰ３４の各エントリはメモリ領域に対応する。
【００４５】
ジョブＩＤは、ジョブを一意に識別するための識別子である。タスク番号は、ジョブ内でタスクを識別するための番号である。データ名は、各タスクによって保持されるデータの名称である。データ量は、各タスクによって保持されるデータの量であり、例えば、単位はＭＢ（メガバイト）で表される。スワップ状態は、メモリのスワップ（特に、スワップアウト）に関する状態を示す。具体的には、スワップ状態には、スワップなしを示す）「ＮＯＮＥ」、スワップアウト直前を示す「ＰＲＥ＿ＯＵＴ」、スワップアウト処理中を示す「ＯＵＴ」、スワップアウト済を示す「ＳＷＡＰ」、スワップイン処理中を示す「ＩＮ」のいずれかが格納される。
【００４６】
ノード内ジョブ管理プロセスＰ３は、ジョブＩＤ及びタスク番号によってタスクを一意に識別し、識別されたタスクによって保持されるデータの情報をデータ名、データ量、及びスワップ状態に格納する。各タスクは内部データ、バッファ、受信用バッファの３種類のデータを保持する。内部データはワーク用メモリ領域であり、各タスクは各メモリ領域に名前を付けることによって複数のワーク用メモリ領域を保持することができる。タスクがメモリ領域を保持する場合、ワーク用メモリ領域の名前をメモリ管理テーブルＰ３４のデータ名に格納する。バッファ用のメモリ領域には「ｂｕｆ」、受信バッファには「ｂｕｆ＿ｒｅｃｖ」を、メモリ管理テーブルＰ３４のデータ名に格納するとよい。
【００４７】
次に、図３Ｃに示すジョブ実行プロセスＰ４の構成について説明する。例えば、ジョブ実行プロセスＰ４は、記憶装置１０９に格納されており、メモリ１０４に読み出され、ＣＰＵ１０１０により実行される。
【００４８】
ジョブ実行プロセスＰ４は、タスク制御プログラムＰ４１、データ移動プログラムＰ４２、タスク移動プログラムＰ４３、タスク管理テーブルＰ４４、メモリ管理テーブルＰ４５及びタスクＰ４６を含む。タスク制御プログラムＰ４１は、タスクの実行を制御するプログラムである。データ移動プログラムＰ４２は、データのスワップ処理を行うプログラムである。タスク移動プログラムＰ４３は、タスクのノード間移動処理を行うプログラムである。。従って、タスク制御プログラムＰ４１、データ移動プログラムＰ４２、タスク移動プログラムＰ４３はメモリに格納されており、プロセッサ１０１によりメモリより読み出されて実行される。タスク管理テーブルＰ４４は、自ノードで実行中のタスクの情報を管理する（図６Ａ参照）。メモリ管理テーブルＰ４５は、自ノードで実行中のタスクのメモリ使用状態を管理する（図６Ｂ参照）。
【００４９】
タスクＰ４６は、ジョブ実行プロセスＰ４内に複数個生成することができる。タスクＰ４６の数の上限は、スレーブ管理テーブルＰ２２の最大タスク数に記載された数である。タスクはユーザプログラムであるタスク処理コードＰ４７、内部データ（ｄａｔａ）、バッファ（ｂｕｆ）、及び受信バッファ（ｂｕｆ＿ｒｅｃｖ）を含む。
【００５０】
内部データは、タスクが内部的に利用するワーク用のメモリ領域である。各タスクは、メモリ領域ごとに名前をつけることによって、複数のメモリ領域を利用することが可能である。タスク処理コードＰ４７は、タスク制御プログラムＰ４１に対してメモリ領域を要求することによって、内部データを利用することができる。タスク制御プログラムＰ４１は、タスク処理コードＰ４７が利用したメモリ領域を管理しており、必要があればデータ移動プログラムＰ４２に要求してスワップ処理を行う。
【００５１】
また、タスク同士はメッセージ交換によって通信することが可能である。タスクが受信したメッセージは、いったん受信バッファ（ｂｕｆ＿ｒｅｃｖ）に保存される。一方、タスク処理コードＰ４７は、バッファ（ｂｕｆ）からメッセージを取り出して利用する。本システムは、複数のタスクの並行処理と同期処理とを交互に実行する処理モデルで動作する。ある並行処理フェーズで送信したメッセージは、その並行処理フェーズにおいて宛先タスクの受信バッファ（ｂｕｆ＿ｒｅｃｖ）に保存される。その後、同期フェーズにおいて受信バッファ（ｂｕｆ＿ｒｅｃｖ）からバッファ（ｂｕｆ）へメッセージを移動し、次の並行処理フェーズにおいて、宛先タスクのタスク処理コードＰ４７は、バッファへ移動されたメッセージを利用することができる。並行処理と同期処理とを交互に行う動作の詳細は後述する。
【００５２】
図６Ａ、図６Ｂは、ジョブ実行プロセスＰ４に含まれるテーブルの構成図である。
【００５３】
図６Ａに示すタスク管理テーブルＰ４４は、ジョブＩＤ、タスク番号、実行状態、及びノードアドレスを含み、このジョブ実行プロセスＰ４によって実行されるジョブに対応するすべてのタスクの情報が記載される。タスク管理テーブルＰ４４の各エントリは、そのノードで実行中の各タスクに対応する。
【００５４】
タスク管理テーブルＰ４４は、ノード内ジョブ管理プロセスＰ３に含まれるタスク管理テーブルＰ３３と同様の構成であり、各項目の意味も同じである。但し、タスク管理テーブルＰ４４には、このジョブ実行プロセスＰ４によって実行されるジョブ以外のジョブに対応するタスクの情報は記載されない。
【００５５】
図６Ｂに示すメモリ管理テーブルＰ４５は、ジョブＩＤ、タスク番号、データ名、データ量、データＩＤ、及びスワップファイル名を含み、このジョブ実行プロセスＰ４が実行する全てのタスクによって保持されるメモリ領域の情報が記載される。メモリ管理テーブルＰ４５の各エントリは、各メモリ領域に対応する。
【００５６】
メモリ管理テーブルＰ４５のジョブＩＤ、タスク番号、データ名、データ量は、ノード内ジョブ管理プロセスＰ３に保持されるメモリ管理テーブルＰ３４の各項目と同じ意味である。データＩＤは、メモリ領域の識別子であり、タスク処理コードＰ４７はデータＩＤを使用してメモリ領域にアクセスする。具体的には、データＩＤとしてメモリ領域のハンドル番号やアドレス等を利用する。スワップファイル名は、このメモリ領域がスワップアウトされている場合のスワップファイルの名前である。このスワップファイルは、分散ＦＳ上ではなく、各スレーブノードのローカルファイルシステム上に格納される。
【００５７】
次に、タスクの実行状態の遷移を説明する。
【００５８】
図７は、本発明の実施形態のタスクの状態遷移図である。以下に説明するタスクの状態名称は、ジョブ管理プロセスＰ２に含まれるタスク管理テーブルＰ２４と、ノード内ジョブ管理プロセスＰ３に含まれるタスク管理テーブルＰ３３と、ジョブ実行プロセスＰ４に含まれるタスク管理テーブルＰ４４の実行状態に記載される。
【００５９】
新規にジョブ実行プロセスＰ４内にタスクが生成された時には、タスクの状態は「ＩＮＩＴ」になり、ジョブ管理テーブルＰ２３及びノード内ジョブ管理テーブルＰ３２の初期データに記載されたファイルを分散ＦＳから読み込む。ファイルが読み込まれた後、タスクの状態は「ＷＡＩＴ」になる。これは待機状態を意味しており、クライアントプロセスＰ１からタスク実行指示があるまで待機する。
【００６０】
タスク実行指示を受けた場合、タスクＰ４６内の受信バッファ（ｂｕｆ＿ｒｅｃｖ）内のメッセージをバッファ（ｂｕｆ）に移動した後、タスクの状態は「ＰＲＥ＿ＲＵＮ」になる。この状態はタスクがスケジューリングされるのを待っている状態である。
【００６１】
その後、タスクがスケジューリングされると、スワップアウト済みのデータをメモリ領域に読み込んだ後、タスクの状態は「ＲＵＮ」になり、タスク処理コードＰ４６の実行を開始する。タスク処理コードＰ４６を実行している間、タスクＰ４６によって管理されるデータはスワップアウトされない。タスク処理コードＰ４６の実行が終了した後、タスクの状態は「ＷＡＩＴ」に戻る。タスクの状態が「ＷＡＩＴ」の時、クライアントプロセスＰ１からタスク終了指示があると、タスクは、利用したメモリ領域を開放し、消滅する。なお、図７では、この状態を「ＥＮＤ」と記載しているが、これは便宜的に状態を記載しており、実際にはタスクが消滅するため「ＥＮＤ」という状態はテーブルには記載されない。
【００６２】
タスクの状態が「ＷＡＩＴ」又は「ＰＲＥ＿ＲＵＮ」の時、タスクを他のスレーブノード上のジョブ実行プロセスに移動することが可能である。タスクの移動が開始すると、移動元タスクの状態は「ＭＩＧ＿ＳＥＮＤ」になり、タスクの移動が終了すると、移動元タスクは消滅する。移動元タスクが移動を開始すると、移動先スレーブノードのジョブ実行プロセス上に、「ＭＩＧ＿ＲＥＣＶ」という状態のタスクが生成される。移動処理が完了すると、タスクの状態は「ＷＡＩＴ」又は「ＰＲＥ＿ＲＵＮ」になり、移動前の状態を復元する。従って、タスクの移動中は同一ジョブＩＤとタスク番号を持つ二つのタスク（移動元タスク及び移動先タスク）存在する。
【００６３】
図８は、本発明の実施形態のタスク実行持のプロセス間通信を示すシーケンス図であり、タスクが状態遷移する際の、各プロセスの連携動作を示す。なお、各プロセスは、各プロセスの属する計算機のＣＰＵによって実行される。
【００６４】
ジョブの処理を開始する時、クライアントプロセスＰ１はジョブ開始要求（Ｍ０１）をジョブ管理プロセスＰ２に送信する。ジョブ開始要求はジョブプログラムのファイル名、初期データのファイル名を含む。ジョブプログラム及び初期データは、分散ＦＳ上に格納されており、上記ファイル名は分散ＦＳ上のファイル名である。
【００６５】
ジョブ管理プロセスＰ２は、ジョブ開始要求（Ｍ０１）を受けると、実行されるジョブにジョブＩＤを割り当て、ノード内ジョブ管理プロセスＰ３にプロセス生成要求（Ｍ０２）を送信する。プロセス生成要求（Ｍ０２）は、ジョブＩＤ、ジョブプログラムのファイル名、及び初期データのファイル名を含む。
【００６６】
ノード内ジョブ管理プロセスＰ３は、プロセス生成要求（Ｍ０２）を受けると、ジョブ実行プロセスＰ４を生成（Ｍ０３）する。プロセス生成要求（Ｍ０２）に含まれるジョブプログラムのファイル名及び初期データのファイル名によって特定されるファイルを分散ＦＳから読み出し、読み出された初期データをパラメータとしたプログラムファイルを含むジョブ実行プロセスＰ４を起動する。ジョブ実行プロセスＰ４は、起動後に、プロセス生成通知（Ｍ０４）をノード内ジョブ管理プロセスＰ３に送信する。
【００６７】
ノード内ジョブ管理プロセスＰ３は、プロセス生成通知（Ｍ０４）を受けると、新規に生成されたジョブの情報をノード内ジョブ管理テーブルＰ３２に追加し、ジョブ管理プロセスＰ２にプロセス生成通知（Ｍ０５）を転送する。この時点でノード内ジョブ管理テーブルＰ３２には、ジョブＩＤ、ジョブプログラム、及び初期データが記載されたエントリが一つ生成される。但し、まだタスクは生成されていないため、タスク番号一覧は空である。
【００６８】
ジョブ管理プロセスＰ２は、プロセス生成通知（Ｍ０５）を受けると、ノード内ジョブ管理プロセスＰ３と同様に、ジョブの情報をジョブ管理テーブルＰ２３に追加し、クライアントプロセスＰ１にジョブ開始通知（Ｍ０６）を送信する。
【００６９】
クライアントプロセスＰ１は、ジョブ開始通知（Ｍ０６）を受けると、ジョブ管理プロセスＰ０２にタスク生成要求（Ｍ０７）を送信する。
【００７０】
ジョブ管理プロセスＰ２は、タスク生成要求（Ｍ０７）を受けると、生成されるタスクにタスク番号を割り当て、ノード内ジョブ管理プロセスＰ３経由でジョブ実行プロセスＰ４にタスク生成要求を転送する（Ｍ０８、Ｍ０９）。ジョブ管理プロセスＰ２によって割り当てられたタスク番号は、タスク生成要求（Ｍ８、Ｍ９）に付加されてジョブ実行プロセスＰ４に送られる。
【００７１】
ジョブ実行プロセスＰ４は、タスク生成要求（Ｍ９）を受けると、タスクＰ４６を生成し、タスクの生成が完了した後、生成したタスクの情報をタスク管理テーブルＰ４４に追加し、生成されたタスクのジョブＩＤ、タスク番号状態、タスク状態（ＩＮＩＴ）を含む状態遷移通知［ＩＮＩＴ］（Ｍ１０）をノード内ジョブ管理プロセスＰ３に送信する。
【００７２】
ノード内ジョブ管理プロセスＰ３は、状態遷移通知（Ｍ１０）を受けると、受信したタスクの情報（ジョブＩＤ、タスク番号、実行状態）をタスク管理テーブルＰ３３に追加し、状態遷移通知（Ｍ１０）をジョブ管理プロセスＰ２に転送（Ｍ１１）する。
【００７３】
ジョブ管理プロセスＰ４は、ジョブ管理プロセスＰ２を受けると、ノード内ジョブ管理プロセスＰ３と同様に、タスクの情報をタスク管理テーブルＰ２４に追加する。タスクはまだデータを読み込んでいないため、タスク管理テーブルＰ２４に記載する全データ量、スワップ量は０とし、スワップフラグは「ＩＤＬＥ」とする。この時点で各プロセスＰ２、Ｐ３、Ｐ４に含まれるタスク管理テーブルに記載された、このタスクの実行状態は「ＩＮＩＴ」になる。
【００７４】
さらに、ジョブ管理プロセスＰ２は、スレーブ管理テーブルＰ２２のノードアドレスが、受信した状態遷移通知［ＩＮＩＴ］の送信元ノードアドレスに一致するエントリを検索し、当該エントリのタスクＩＤ一覧に新規に作成されたタスクの情報（ジョブＩＤ及びタスク番号）を追加する。
【００７５】
図示を省略したが、ジョブ管理プロセスＰ２は、状態遷移通知［ＩＮＩＴ］（Ｍ１１）を受けると、スレーブ管理テーブルＰ２２を検索し、受信した状態遷移通知［ＩＮＩＴ］（Ｍ１１）が含むジョブＩＤをタスクＩＤ一覧に含むエントリを検索する。検索されたエントリがタスクを起動したジョブを実行中のノードに対応するエントリなので、これらエントリに対応するノードで状態遷移通知［ＩＮＩＴ］（Ｍ１１）の送信元以外のノードに、状態遷移通知［ＩＮＩＴ］（Ｍ１１）の送信元ノードのアドレスを追加した状態遷移通知［ＩＮＩＴ］を送信する。この状態遷移通知［ＩＮＩＴ］を受けたノード内ジョブ管理プロセスＰ３は、タスク管理テーブルＰ３３に生成されたタスクに対応するエントリを追加する。このとき、このタスクはリモートノードで実行されているので、タスク管理テーブルＰ３３の実行状態には何も記載せず、タスク管理テーブルＰ３３のノードアドレスには、受信した状態遷移通知［ＩＮＩＴ］にジョブ管理プロセスが追加したアドレスを記載する。
【００７６】
このように、新規にタスクを生成した場合、ジョブ実行プロセスＰ４からタスクの情報をジョブ管理プロセスＰ２に転送し、さらに他ノードのノード内ジョブ管理プロセスＰ３へタスクの情報を転送することによって、当該ジョブに関係するノード内ジョブ管理プロセスＰ３へタスクの情報を伝える。
【００７７】
次に、ジョブ実行プロセスＰ４は、初期データを分散ＦＳから読み込み、読み込んだデータをタスクの内部データ（ｄａｔａ）としてメモリ領域に格納する。初期データのファイル名は、ジョブ開始要求（Ｍ０１）、プロセス生成要求（Ｍ０２）に記載されており、ジョブ実行プロセスの起動オプションによってジョブ実行プロセスＰ４に送られる。
【００７８】
ジョブ実行プロセスＰ４は、初期データの読み込みが完了した後、ジョブ実行プロセスＰ４は、タスク管理テーブルＰ４４に記載された当該タスクに対応するエントリの実行状態を「ＷＡＩＴ」に更新し、ジョブＩＤ、タスク番号、タスク状態（ＷＡＩＴ）を含む状態遷移通知［ＷＡＩＴ］（Ｍ１２）を、ノード内ジョブ管理プロセスＰ３へ送信する。
【００７９】
ノード内ジョブ管理プロセスＰ３は、状態遷移通知［ＷＡＩＴ］（Ｍ１２）を受けると、ジョブ実行プロセスＰ４と同様に、タスク管理テーブルＰ３３の当該タスクのエントリの実行状態を「ＷＡＩＴ」に更新する。そして、ノード内ジョブ管理プロセスＰ３は、状態遷移通知［ＷＡＩＴ］をジョブ管理プロセスＰ２に転送（Ｍ１３）する。
【００８０】
ジョブ管理プロセスＰ２は、状態遷移通知［ＷＡＩＴ］（Ｍ１３）を受けると、ジョブＩＤとタスク番号が一致するエントリをタスク管理テーブルＰ２４から検索し、検索されたエントリの実行状態を「ＷＡＩＴ」に更新する。
【００８１】
このように、タスク実行状態が変更されたときに、状態遷移通知は、ジョブ実行プロセスＰ４から、ノード内ジョブ管理プロセスＰ３、ジョブ管理プロセスＰ２へ順に転送される。ノード内ジョブ管理プロセスＰ３及びジョブ管理プロセスＰ２は、状態遷移通知を受けると、各々、ジョブＩＤ及びタスク番号をキーとしてタスク管理テーブルＰ３３及びＰ２４から当該タスクに対応するエントリを検索し、検索されたエントリの実行状態を通知された値に変更する。
【００８２】
タスクのメモリ使用量又はスワップ状態が変更された場合も、タスク実行状態が変更された場合と同様に、状態遷移通知がジョブ実行プロセスＰ４から、ジョブ管理プロセスＰ２へ転送される。この場合は、ノード内ジョブ管理プロセスＰ３は、状態遷移通知に従ってメモリ管理テーブルＰ３４のエントリの追加／削除、データ量、及びスワップ状態を変更する。ジョブ管理プロセスＰ２も、状態遷移通知に従ってタスク管理テーブルＰ２４の全データ量、スワップ量、及びスワップフラグを変更する。
【００８３】
クライアントプロセスＰ１は、タスク生成要求（Ｍ０７）を送信した後、ジョブ管理プロセスＰ２に同期要求（Ｍ１４）を送信する。同期要求（Ｍ１４）は、同期待ち対象タスクのタスクＩＤ一覧を含む。ジョブ管理プロセスＰ２は、
同期要求（Ｍ１４）れを受けると、同期要求（Ｍ１４）に記載されたすべてのタスクＩＤが「ＷＡＩＴ」状態になるまで待つ。同期要求（Ｍ１４）に記載されたタスクが既に終了している場合や、同期待ち中に終了した場合は、ジョブ管理プロセスＰ２はクライアントプロセスＰ１にエラー通知を返信する。図８では、タスクの状態が「ＷＡＩＴ」になったので、同期完了通知（Ｍ１５）をクライアントに返している。
【００８４】
図８では、生成され、及び同期されタスクは一つのみであるが、実際には複数のタスクが生成され、及び同期される。具体的には、タスク生成要求（Ｍ０７）には、複数のタスクに関する情報が記載されており、ジョブ管理プロセスＰ２は、タスク生成要求（Ｍ０７）に記載された複数のタスクの生成を、ノード内ジョブ管理プロセスＰ３に要求する。このとき、ジョブ管理プロセスＰ２は、スレーブ管理テーブルＰ２２の最大タスク数とタスクＩＤ一覧を参照し、タスクの生成が要求されるノードに新たにタスクを生成する余裕があるかを確認する。ジョブ管理プロセスＰ２は、要求された数のタスクを一つのスレーブノードに生成できない場合は、他のスレーブノードにタスクを生成するために、他のノード内ジョブ管理プロセスＰ３にタスク生成要求を送信する。
【００８５】
従って、タスク実行するジョブ実行プロセスＰ４は、複数のノードで動作することになるが、各タスクからの状態遷移通知は必ずジョブ管理プロセスＰ２に送信される。ジョブ管理プロセスＰ２は、クライアントプロセスＰ１から同期要求（Ｍ１４）を受けると、同期要求（Ｍ１４）に記載されたすべてのタスクの状態を確認し、すべてのタスクの状態が「ＷＡＩＴ」になったら、クライアントプロセスＰ１に同期完了通知（Ｍ１５）を返信する。
【００８６】
クライアントプロセスＰ１は、同期完了通知（Ｍ１５）を受けると、タスク実行指示（Ｍ１６）をジョブ管理プロセスＰ２に送信する。タスク実行指示（Ｍ１６）には実行すべきタスクのタスクＩＤが記載されており、ジョブ管理プロセスＰ２は、スレーブ管理テーブルＰ２２のタスクＩＤ一覧を参照し、指定されたタスクＩＤに対応するタスクが動作中のスレーブのノードアドレスを取得する。ジョブ管理プロセスＰ２は、そのノードのノード内ジョブ管理プロセスにタスク実行指示（Ｍ１７）を送信する。タスク実行指示（Ｍ１６）には、当該ノードで実行すべきタスクのタスクＩＤが記載されている。タスク実行指示（Ｍ１６）に記載されているタスクが異なるノードで実行されている場合、各ノードのノード内ジョブ管理プロセスにタスク実行指示（Ｍ１７）を送信する。
【００８７】
ノード内ジョブ管理プロセスＰ０３は、タスク実行指示（Ｍ１７）を受けると、タスクＩＤに含まれるジョブＩＤを取り出し、取り出されたジョブＩＤを含むタスク実行指示（Ｍ１８）を、そのジョブを担当するジョブ実行プロセスに転送する。
【００８８】
ジョブ実行プロセスＰ４は、タスク実行指示（Ｍ１８）を受けると、タスク実行指示（Ｍ１８）に含まれるタスクＩＤからタスク番号を取り出し、取り出されたタスク番号をキーとしてタスク管理テーブルＰ４４から当該タスクに対応するエントリを検索し、検索されたエントリの実行状態を「ＰＲＥ＿ＲＵＮ」に変更する。そして、ジョブ実行プロセスＰ４は、当該タスクＰ４６内の受信バッファ（ｂｕｆ＿ｒｅｃｖ）に蓄えられたメッセージをバッファ（ｂｕｆ）に移動し、受信バッファ（ｂｕｆ＿ｒｅｃｖ）の内容をクリアする。その後、ジョブ実行プロセスＰ４は、状態遷移通知［ＰＲＥ＿ＲＵＮ］をノード内ジョブ管理プロセスＰ０３に返信する。
【００８９】
ノード内ジョブ管理プロセスＰ３は、状態遷移通知［ＰＲＥ＿ＲＵＮ］（Ｍ２０）を受けると、受信したタスク実行指示（Ｍ１７）に含まれるタスクＩＤからジョブＩＤとタスク番号を取り出し、取り出されたジョブＩＤ及びタスク番号をキーとしてタスク管理テーブルＰ３３を検索し、検索されたエントリの実行状態を「ＰＲＥ＿ＲＵＮ」に変更する。そして、ノード内ジョブ管理プロセスＰ３は状態遷移通知（Ｍ２１）をジョブ管理プロセスＰ２に転送する。
【００９０】
ジョブ管理プロセスＰ２は、状態遷移通知（Ｍ２１）を受けると、ノード内ジョブ管理プロセスＰ３と同様に、タスク管理テーブルＰ２４の、このタスクに対応するエントリの実行状態を「ＰＲＥ＿ＲＵＮ」に変更する。
【００９１】
次に、ノード内ジョブ管理プロセスＰ３は、タスク管理テーブルＰ３３を確認し、ノードアドレスが設定されていないタスク（自ノードで実行中のタスク）で実行状態が「ＲＵＮ」になっているエントリの数を計算する。この数が、そのノードで実際にスケジューリングされているタスクの数である。そして、この数が自ノードの最大タスク数よりも小さければ、タスクの実行を許可し、スケジューリング要求（Ｍ２２）をジョブ実行プロセスＰ４に送信する。スケジューリング要求（Ｍ２２）には、スケジューリング対象となったタスクのタスク番号が含まれている。
【００９２】
ジョブ実行プロセスＰ４は、スケジューリング要求（Ｍ２２）を受けると、スケジューリング要求（Ｍ２２）に含まれるタスク番号をキーとしてタスク管理テーブルＰ４４を検索し、検索されたエントリの実行状態を「ＲＵＮ」に変更する。
【００９３】
そして、ジョブ実行プロセスＰ４は、状態遷移通知［ＲＵＮ］をノード内ジョブ管理プロセスＰ３に返信し、そのタスクＰ４６のタスク処理コードＰ４７の実行を開始する。タスク処理コードＰ４７の実行は、タスク毎にスレッドが割り当てられ、非同期に実行される。このタスク処理コードＰ４７が他タスクへのメッセージ送信や、他タスクから受信したメッセージを、タスクＰ４６のバッファ（ｂｕｆ）から読み出す。
【００９４】
タスク処理コードＰ４７の実行が終了すると、ジョブ実行プロセスＰ４は、実行が終了したタスクのタスク番号をキーとしてタスク管理テーブルＰ４４を検索し、検索されたエントリの実行状態を「ＷＡＩＴ」に変更する。そして、この実行が終了したタスクのジョブＩＤとタスク番号を含んだ状態遷移通知［ＷＡＩＴ］（Ｍ２５）をノード内ジョブ管理プロセスＰ３に送信する。
【００９５】
ノード内ジョブ管理プロセスＰ３は、状態遷移通知［ＷＡＩＴ］（Ｍ２５）を受けると、状態遷移通知［ＷＡＩＴ］（Ｍ２５）に含まれるタスクのジョブＩＤ及びタスク番号をキーとしてタスク管理テーブルＰ３３を検索し、検索されたエントリの実行状態を「ＷＡＩＴ」に変更する。さらに、ノード内ジョブ管理プロセスＰ３は、状態遷移通知［ＷＡＩＴ］（Ｍ２６）をジョブ管理プロセスＰ２に転送する。
【００９６】
ジョブ管理プロセスＰ２は、状態遷移通知［ＷＡＩＴ］（Ｍ２６）を受けると、ノード内ジョブ管理プロセスＰ３と同様に、タスク管理テーブルＰ２４の、このタスクに対応するエントリの実行状態を「ＷＡＩＴ」に変更する。その後、ジョブ管理プロセスＰ２は、クライアントプロセスＰ１に同期完了通知（Ｍ２７）を返信する。
【００９７】
クライアントプロセスＰ１は、タスク実行指示（Ｍ１６）を送信した後に、同期要求（Ｍ１９）をジョブ管理プロセスに送信し、実行したタスクの状態が「ＷＡＩＴ」になるまで待つ。この処理は、Ｍ１４で示した同期処理と同様の処理である。
【００９８】
このように、クライアントプロセスＰ１からのタスク実行指示によるタスク処理の開始と、タスクの同期を交互に行うことによって、タスクの実行が進んでいく。
【００９９】
上記説明では、ノード内ジョブ管理プロセスＰ３はタスクが「ＰＲＥ＿ＲＵＮ」状態になった時に、そのタスクをスケジューリングしたが、クライアントプロセスが多数のタスクに対してタスク実行指示を行うと、スレーブノードの最大タスク数を超える数のタスクが同時に「ＰＲＥ＿ＲＵＮ」状態となり、「ＰＲＥ＿ＲＵＮ」状態になったタスクをすぐにはスケジューリングできなくなる。また、タスクの内部データ（ｄａｔａ）、バッファ（ｂｕｆ）はスワップアウト可能であり、タスク処理コードを実行する際に上記メモリ領域がスワップアウト済みであればスワップインする必要がある。また、ノード内のメモリが不足する場合、タスク処理コードを実行する前に、スワップアウト可能な別のタスクが管理する内部データ（ｄａｔａ）、バッファ（ｂｕｆ）をスワップアウトする必要もある。以下では、図９、図１０を参照し、スケジューリング処理の詳細を説明する。
【０１００】
ノード内ジョブ制御プログラムＰ３１が処理を開始すると、タスク管理テーブルＰ３３を確認し
、実行状態が「ＰＲＥ＿ＲＵＮ」状態のエントリを検索する（Ｓ１０１）。
【０１０１】
「ＰＲＥ＿ＲＵＮ」状態のエントリがない場合、「ＰＲＥ＿ＲＵＮ」状態のタスクが現れるまで待機する（Ｓ１０２）。
【０１０２】
Ｓ１０１において、「ＰＲＥ＿ＲＵＮ」状態のエントリが存在した場合、Ｓ１０１で見つけられた「ＰＲＥ＿ＲＵＮ」状態のエントリのジョブＩＤ及びタスク番号の一組を選択し、選択されたエントリとジョブＩＤ及びタスク番号が一致する、メモリ管理テーブルＰ３４のエントリを検索する。これらのエントリが、このタスクによって利用されるメモリ領域に対応する。
【０１０３】
そして、これらのエントリのスワップ状態を確認し、すべてのエントリのスワップ状態が「ＮＯＮＥ」であれば、そのタスクをスケジューリング対象として選択する。一方、スワップ状態が「ＮＯＮＥ」以外である場合、Ｓ１０１で見つけた別のエントリのジョブＩＤ及びタスク番号の組を選択し、前述した手順によってメモリ管理テーブルＰ３４を確認する。
【０１０４】
メモリ管理テーブルＰ３４のスワップ状態が「ＮＯＮＥ」である場合、メモリ領域がスワップアウトされておらず、直近でスワップアウトされる予定もない。従って、このステップではスワップインが不要のタスクを優先的にスケジューリングするための処理を行う。このような制御を行うことによって、スレーブノードのＣＰＵの空き時間を最小とし、効率的なスケジューリングが可能となる。また後述するが、タスクを移動する際、スワップ済みデータサイズが大きいタスクを優先的にタスク移動の対象として選択する（Ｓ１０３）。「ＲＵＮ」状態のタスクを移動することはできないため、前述した制御は、スワップ済みデータサイズが大きいタスクを、スケジューリングせずに移動対象として残す効果がある。
【０１０５】
Ｓ１０３においてタスクが選択できた場合、選択されたタスクをスケジューリングする。このため、ノード内ジョブ制御プログラムＰ３１は、当該タスクに対応するタスク管理テーブルＰ３３の実行状態を「ＲＵＮ」に変更する。そして、自ノードのメモリ使用状況を確認し、必要があれば他のタスクをスワップアウトする（Ｓ１０５）。このスワップアウト処理の詳細は図１０を用いて後述する。この処理が終わればＳ１１１に進む。
【０１０６】
Ｓ１０６においてスワップインが不要なタスクを選択できなかった場合、Ｓ１０１で見つけられた他のタスクを選択する。このとき、メモリ管理テーブルＰ３４のスワップ状態が「ＳＷＡＰ」（スワップ済み）のエントリのデータ量をタスク毎に加算し、この計算されたデータ量が最小のものをスケジューリング対象として選択する（Ｓ１０６）。メモリ管理テーブルＰ３４のデータ量は、メモリ領域のデータサイズを表している。このため、スワップ済みのデータサイズが最小のものを選択することによって、スケジューリングにおけるスワップイン処理を最小にしている。また、Ｓ１０３と同様に、スワップ済みデータサイズが大きいタスクをスケジューリングせずに移動対象として残す効果がある。
【０１０７】
その後、ノード内ジョブ制御プログラムＰ３１は、当該タスクに対応するタスク管理テーブルＰ３３の実行状態を「ＲＵＮ」に変更する。そして、Ｓ１０５と同様の手順で他のタスクをスワップアウトする（Ｓ１０７）。この処理の詳細は後述する。
【０１０８】
次に、ノード内ジョブ制御プログラムＰ３１は、スケジューリング対象として選択されたタスクのタスク番号をキーとしてメモリ管理テーブルＰ３４を検索し、検索されたタスクの中でスワップ状態が「ＰＲＥ＿ＯＵＴ」及び「ＯＵＴ」のものを見つける（Ｓ１０８）。スワップ状態が「ＰＲＥ＿ＯＵＴ」のエントリは、近いうちにスワップアウトされる予定のメモリ領域であり、このエントリが存在すればそのエントリのスワップ状態を「ＮＯＮＥ」に変更する。スワップ状態が「ＯＵＴ」のエントリは、現在スワップアウト中のメモリ領域である。スワップ状態が「ＯＵＴ」のエントリが存在した場合、ノード内ジョブ制御プログラムＰ３１は、このメモリ領域のスワップアウト処理をキャンセルするように、ジョブ実行プロセスＰ４に要求し、キャンセル処理が完了したら、上記エントリのスワップ状態を「ＮＯＮＥ」に変更する（Ｓ１０９）。
【０１０９】
次に、ノード内ジョブ制御プログラムＰ３１は、メモリ管理テーブルＰ３４を参照し、スケジューリング対象として選択されたタスクのタスク番号をキーとしてメモリ管理テーブルＰ３４から検索、検索されたエントリの中でスワップ状態が「ＳＷＡＰ」のものを探す。状態が「ＳＷＡＰ」のエントリはメモリ領域がスワップアウト済みなので、ノード内ジョブ制御プログラムＰ３１は、ジョブ実行プロセスＰ４に、このメモリ領域をスワップインするように要求する（Ｓ１１０）。ジョブ実行プロセスＰ４によるスワップイン処理が終了したらＳ１１１に進む。
【０１１０】
次に、ノード内ジョブ制御プログラムＰ３１は、スケジューリング対象として選択したタスクのジョブＩＤとタスク番号を含むスケジューリング要求を作成し、上記ジョブＩＤに対応するジョブ実行プロセスＰ４にスケジューリング要求を送信する。そして、ジョブ実行プロセスＰ４から状態遷移通知が返信されるのを待つ。状態遷移通知を受信すると、スケジューリングできたことが確認できるので、Ｓ１０１に戻る（Ｓ１１１）。
【０１１１】
次に、スワップアウト処理（Ｓ１０５）の詳細について説明する。
【０１１２】
図１０は、本発明の実施の形態のタスクをスワップアウトする手順を示すフローチャートである。
【０１１３】
ノード内ジョブ制御プログラムＰ３１は、自ノードに実装されたメモリの量及び使用されているメモリの量を取得し、使用メモリ量が一定基準以下（例えば、実装メモリ量の８０％以下）であるか否かを判定する（Ｓ２０１）。使用メモリ量は、メモリ管理テーブルＰ３４のスワップ状態が「ＳＷＡＰ」「ＯＵＴ」「ＰＲＥ＿ＯＵＴ」以外のエントリのデータ量を合計することによって求める。使用メモリ量が前記基準以下である場合、空きメモリ量は十分であると判定し処理を終える。一方、使用メモリ量が前記基準を超える場合、空きメモリ量は不十分であると判定し、スワップアウト処理を行うために、次のステップに進む（Ｓ２０１）。
【０１１４】
ノード内ジョブ制御プログラムＰ３１は、タスク管理テーブルＰ３３を参照し、実行状態が「ＷＡＩＴ」であるエントリを検索する。実行状態が「ＷＡＩＴ」であるエントリが見つかった場合、見つかったエントリのジョブＩＤ及びタスク番号が、タスク管理テーブルＰ３３から検索されたエントリと一致し、スワップ状態が「ＳＷＡＰ」であるエントリを、メモリ管理テーブルＰ３４から検索する。この条件を満たすエントリが見つかった場合、それらのいずれかのメモリ領域をスワップ対象として選択する。
【０１１５】
一方、この条件を満たすエントリが見つからなかった場合、タスク管理テーブルＰ３３を参照し、実行状態が「ＰＲＥ＿ＲＵＮ」であるエントリを検索し、見つかったエントリのジョブＩＤ及びタスク番号が、メモリ管理テーブルＰ３４のジョブＩＤ及びタスクＩＤに一致し、スワップ状態が「ＳＷＡＰ」であるエントリを、メモリ管理テーブルＰ３４から検索する。そして、この条件を満たすエントリが見つかったら、それらのいずれかのメモリ領域をスワップ対象として選択する。
【０１１６】
前述したように、実行状態が「ＷＡＩＴ」であるタスクを優先的にスワップアウトするように制御している。このため、すぐにスケジューリングされるタスク（実行状態が「ＰＲＥ＿ＲＵＮ」であるタスク）をなるべくスワップアウトしない状態にしておき、スケジューリングするときのスワップイン処理を少なくする効果がある。また、後述するように、本発明では、スワップアウトされたタスク、及びスワップアウトされる予定のタスクは優先的に移動対象タスクとする。従って、前述した制御によって、次にスケジューリングするまで時間がかかるタスク（実行状態が「ＷＡＩＴ」であるタスク）を優先的に移動対象タスクにする効果がある（Ｓ２０２）。
【０１１７】
Ｓ２０２でスワップ対象を選択できなかった場合、スワップアウトすることはできないので処理を終了する。一方、スワップ対象を選択できたら、Ｓ２０４に進む（Ｓ２０３）。
【０１１８】
次に、ノード内ジョブ制御プログラムＰ３１は、ジョブ管理プロセスＰ２に、Ｓ２０２でスワップ対象として選択されたメモリ領域のジョブＩＤ及びタスク番号を含むスワップ事前通知を送信し（Ｓ２０４）、一定時間待機する（Ｓ２０５）。ジョブ管理プロセスＰ２は、受信したスワップ事前通知に含まれるジョブＩＤ及びタスク番号をキーとしてタスク管理テーブルＰ２４を検索し、検索されたエントリのスワップフラグを「ＰＲＥ＿ＯＵＴ」に変更する。この処理は、この当該メモリ領域がスワップ対象となったことをジョブ管理プロセスＰ２に通知し、タスク移動対象として選択される可能性を高めるためのものである。タスク移動処理の詳細は後述する。
【０１１９】
ノード内ジョブ制御プログラムＰ３１は、一定時間待機した後、Ｓ２０２でスワップ対象として選択されたメモリ領域のジョブＩＤ及びタスク番号をキーとしてタスク管理テーブルＰ３３を検索する。そして、該当するエントリが検索された場合、検索されたエントリの実行状態が、「ＰＲＥ＿ＲＵＮ」又は「ＲＵＮ」であることを確認する。さらに、選択されたメモリ領域のジョブＩＤ、タスクＩＤ及びデータ名をキーとしてメモリ管理テーブルＰ３４を検索し、検索されたエントリのスワップ状態が「ＰＲＥ＿ＲＵＮ」であることを確認する。前述した全ての条件が確認できた場合、そのメモリ領域はスワップアウト可能であるので、次のステップに進む。一方、前述した一部の条件が確認できない場合、スワップアウトできないため、Ｓ２０１へ戻る（Ｓ２０６）。
【０１２０】
ノード内ジョブ制御プログラムＰ３１は、スワップアウト対象メモリ領域のジョブＩＤ、タスク番号及びデータ名を含むスワップ要求をジョブ実行プロセスＰ４に送信し、ジョブ実行プロセスＰ４にスワップアウトを指示する。さらに、ノード内ジョブ制御プログラムＰ３１は、そのメモリ領域に対応するメモリ管理テーブルＰ３４のエントリのスワップ状態を「ＯＵＴ」に変更し、そのメモリ領域のジョブＩＤ及びタスク番号を含むスワップ開始通知をジョブ管理プロセスＰ２に送信する。ジョブ管理プロセスＰ２は、スワップ開始通知に含まれるジョブＩＤ及びタスク番号をキーとしてタスク管理テーブルＰ２４を検索し、検索されたエントリのスワップフラグを「ＢＵＳＹ」に変更する。スワップ処理が開始された後、Ｓ２０１に戻る（Ｓ２０７）。
【０１２１】
次に、タスクの移動処理の詳細について説明する。システムを構成するスレーブノードの負荷（メモリ使用率、ＣＰＵ使用率）に偏りがある場合、負荷が高いスレーブノードから負荷が低いスレーブノードへタスクを移動することによって、負荷の偏りを平準化する。一般に、負荷が高いスレーブで複数のタスクが実行されている可能性が高く、移動候補となるタスクは複数存在する。本発明では、以下の優先順位で移動候補となるタスクを選択する。
（１）スワップアウト直前のタスク。
（２）すぐにはスケジューリングされない（ＷＡＩＴ状態の）タスク。
（３）メモリの一部がスワップアウトされているタスク。
（４）スワップアウトされていないタスク。
【０１２２】
スワップアウトされたメモリ領域を持つタスクをスケジューリングするにはスワップインが必要となる。このため、スワップアウトが発生するとＣＰＵの利用効率が低下する。また、本実施の形態では、移動後のタスクによって保持される全てのメモリ領域は、実メモリ上に割り当てられる。そこで、スワップアウト直前のタスクを優先的に移動することによって、スワップアウトの発生を抑制し、ＣＰＵの利用効率の低下を防止する。
【０１２３】
また、スケジューリング直前のタスクをスワップアウトすると、すぐにスワップインが発生するため、ＣＰＵの利用効率が低下する。また、移動中のタスクはスケジューリングできないため、スケジューリング直前のタスクを移動対象として選択すると、ＣＰＵの利用効率を低下させる可能性がある。そこで、すぐにスケジューリングされないタスクを優先的にスケジューリング対象として選択する。
【０１２４】
本実施の形態では、移動後のタスクを保持する全てのメモリ領域を実メモリ上に割り当てるため、スワップアウトされたタスクを移動すると、同時にスワップインを行うことになる。そこで、スワップアウトされたタスクを優先的に移動することによって、タスク移動中に実質的にスワップインを行い、処理時間を短縮する。
【０１２５】
次に、タスク移動の制御方法について詳しく説明する。このタスクの移動は、ジョブ管理プロセスＰ２のジョブ管理部Ｐ２１が制御する。
【０１２６】
図１１は、ジョブ制御プログラムＰ２１が移動対象タスクを選択する手順を示すフローチャートである。
【０１２７】
タスクの実行状態が変化した場合、スレーブノードの負荷は変化する。また、本システムのスレーブノード数が変更した場合、スレーブノードの負荷のバランスが変化する。このため、タスクの移動を開始すべきかを判定する必要がある。例えば、スレーブノードが追加された場合、ジョブ制御プログラムＰ１２は、スレーブ管理テーブルＰ２２に、追加されたスレーブノードの情報を登録し、タスクの移動を開始すべきかを判定するために、次のステップに進む（Ｓ３０１）。
【０１２８】
次に、ジョブ制御プログラムＰ２１は、計算機資源に余裕があるスレーブノードと、計算機資源が不足しているスレーブノードとが存在するか否かを判定する（Ｓ３０２）。具体的には、ＣＰＵ資源とメモリ資源の、いずれかが不足するスレーブノードは、計算機資源が不足すると判定する。一方、いずれにも余裕があるスレーブノードは、計算機資源に余裕があると判定する。
【０１２９】
ＣＰＵ資源については、スレーブ管理テーブルＰ２２に記載された最大タスク数と実行タスク数を比較することによって、ＣＰＵ資源に余裕があるか否かを判定する。具体的には、最大タスク数が実行タスク数より小さい場合、ＣＰＵ資源が不足すると判定する。また、実行タスク数が最大タスク数の一定割合（例えば、３０％）以下であれば、ＣＰＵ資源に余裕があると判定する。
【０１３０】
実行タスク数は、以下のように計算する。まず、スレーブ管理テーブルＰ２２を参照し、実行タスク数を調べたいスレーブノードに対応するエントリを選択する。次に、そのエントリのタスクＩＤ一覧（タスクＩＤセット）を取得し、タスクＩＤセットを一時的に保持する。タスクＩＤはジョブＩＤ及びタスク番号を含むので、それらを分離する。タスクＩＤに含まれるジョブＩＤ及びタスク番号をキーとして移動中タスク管理テーブルＰ２５を検索し、検索されたエントリの移動元スレーブＩＤが最初に選択されたスレーブ管理テーブルＰ２２のエントリのスレーブＩＤに一致している場合、そのタスクは他のノードに移動中であるため、タスクＩＤセットから取り除く。さらに、移動中タスク管理テーブルＰ２５の移動先スレーブＩＤに、最初に選択されたスレーブ管理テーブルＰ２２のエントリのスレーブＩＤに一致するエントリが存在すれば、そのタスクは他のノードから自身へ移動中であるため、タスクＩＤセットに追加する。このように作成されたタスクＩＤセットに含まれるタスクＩＤの数が実行タスク数である。
【０１３１】
メモリ資源については、スレーブ管理テーブルＰ２２に記載された最大メモリ量と使用メモリ量を比較することによって、メモリ資源に余裕があるか否かを判定する。具体的には、最大メモリ量が使用メモリ量より小さい場合、メモリ資源が不足すると判定する。また、使用メモリ量が最大メモリ量の一定割合（例えば、３０％）以下であれば、メモリ資源に余裕があると判定する。
【０１３２】
使用メモリ量は以下のように計算する。ＣＰＵ資源の確認処理で求めたタスクＩＤセットを、ジョブＩＤとタスク番号に分離し、分離されたジョブＩＤ及びタスク番号をキーとしてタスク管理テーブルＰ２４を検索する。そして、検索されたエントリがそのスレーブノードで動作する（実際には、タスク移動完了後に動作する）タスクに対応する。これらエントリの全データ量の和が、当該ノードにおける使用メモリ量である。
【０１３３】
このように、計算機資源に余裕があるスレーブノードと、計算機資源が不足しているスレーブノードとの両方がシステム内に存在する場合、Ｓ３０３に進む。一方、計算機資源に余裕があるスレーブノードと、計算機資源が不足しているスレーブノードとの一方しかシステム内に存在しない場合、タスクを移動せず、処理を終える（Ｓ３０２）。
【０１３４】
次に、ジョブ制御プログラムＰ２１は、Ｓ３０２で調査した計算機資源が不足するスレーブノードで実行中のタスクのうち、移動可能なタスクを抽出する（Ｓ３０３）。具体的には、スレーブ管理テーブルＰ２２を参照し、計算機資源が不足するスレーブノードに対応するエントリのタスクＩＤ一覧を取得する。さらに、タスクＩＤ一覧に記載されたタスクＩＤのジョブＩＤ及びタスク番号をキーとしてタスク管理テーブルＰ２４を検索し、ジョブＩＤ及びタスク番号が一致するエントリ群を抽出する。このエントリ群が、そのスレーブノードで実行中のタスクに対応するエントリである。このエントリ群の中で、実行状態が「ＰＲＥ＿ＲＵＮ」または「ＷＡＩＴ」であるタスクを抽出する。実行状態が上記のいずれかであるタスクは移動可能である。
【０１３５】
Ｓ３０３において、条件に一致するエントリが存在しないと判定された場合、移動可能なタスクが存在しないため、タスクを移動せず、処理を終える。一方、Ｓ３０３において、条件に一致するエントリを抽出できた場合、Ｓ３０５に進む（Ｓ３０４）。
【０１３６】
次に、ジョブ制御プログラムＰ２１は、Ｓ３０３において抽出されたタスク管理テーブルＰ２４のエントリの中で、スワップフラグが「ＰＲＥ＿ＯＵＴ」であるエントリがあるか否かを判定する（Ｓ３０５）。
【０１３７】
スワップフラグが「ＰＲＥ＿ＯＵＴ」であるエントリが存在する場合、このエントリに対応するタスクは、スワップアウト直前の状態なので、移動対象タスクに選択する。さらに、Ｓ３０２で求めた計算機資源に余裕があるスレーブノードの一つを移動先ノードに選択する。そして、移動対象タスクのジョブＩＤ及びタスク番号を移動中タスク管理テーブルＰ２５に追加し、タスクを実行中のノードのスレーブＩＤを移動中タスク管理テーブルＰ２５の移動元スレーブＩＤに記載し、移動先ノードのスレーブＩＤを移動先スレーブＩＤに記載し、移動対象タスクの実行状態を移動中タスク管理テーブルＰ２５の実行状態に記載する。その後、処理をＳ３０２に戻る（Ｓ３０６）。
【０１３８】
Ｓ３０５において、スワップフラグが「ＰＲＥ＿ＯＵＴ」であるエントリが存在しない場合、Ｓ３０３で抽出されたエントリ群から実行状態が「ＷＡＩＴ」であるエントリを抽出する。実行状態が「ＷＡＩＴ」であるエントリが存在する場合、Ｓ３０８へ進む。実行状態が「ＷＡＩＴ」であるエントリが存在しない場合、Ｓ３１１へ進む（Ｓ３０７）。
【０１３９】
Ｓ３０８では、ジョブ制御プログラムＰ２１は、Ｓ３０６で取り出されたエントリ群の各エントリのスワップフラグを確認し、スワップフラグが「ＳＷＡＰ」又は「ＢＵＳＹ」のタスクが存在するか否か判定する（Ｓ３０８）。
【０１４０】
Ｓ３０８において、スワップフラグが「ＳＷＡＰ」又は「ＢＵＳＹ」のタスクが存在すると判定された場合、そのタスクのいずれか一つを移動対象タスクにて選択する。続いて、Ｓ３０６と同様の手順で、移動対象タスクの移動先ノードを決定し、移動対象タスクの情報を移動中タスク管理テーブルＰ２５に登録し、Ｓ３０２へ戻る（Ｓ３０９）。
【０１４１】
Ｓ３０８において、スワップフラグが「ＳＷＡＰ」のタスクも、「ＢＵＳＹ」のタスクも存在しないと判定された場合、スワップ中のタスクは存在しないので、Ｓ３０７で取り出したエントリ群の一つを移動対象タスクに選択する。その後、Ｓ３０６と同様の手順によって、移動対象タスクの移動先ノードを決定し、移動対象タスクの情報を移動中タスク管理テーブルＰ２５に登録し、Ｓ３０２へ戻る（Ｓ３１０）。
【０１４２】
Ｓ３０７で実行状態が「ＷＡＩＴ」であるエントリが存在しないと判定された場合、Ｓ３０３において抽出されたエントリ群のすべてのエントリの実行状態は「ＰＲＥ＿ＲＵＮ」である。これらエントリ群のエントリのスワップフラグを確認し、スワップフラグが「ＳＷＡＰ」又は「ＢＵＳＹ」のタスクが存在するか否かを判定する（Ｓ３１１）。
【０１４３】
Ｓ３１１において、スワップフラグが「ＳＷＡＰ」又は「ＢＵＳＹ」のタスクが存在すると判定された場合、そのタスクの一つを移動対象タスクに選択する。その後、Ｓ３０６と同様の手順で、移動対象タスクの移動先ノードを決定し、移動対象タスクの情報を移動中タスク管理テーブルＰ２５に登録し、Ｓ３０２へ戻る（Ｓ３１２）。
【０１４４】
Ｓ３１１において、スワップフラグが「ＳＷＡＰ」のタスクも、「ＢＵＳＹ」のタスクも存在しないと判定された場合、スワップ中のタスクは存在しないので、Ｓ３０３で抽出したエントリ群のいずれかを移動対象タスクとして選択する。続いて、Ｓ３０６と同様の手順で、移動対象タスクの移動先ノードを決定し、移動対象タスクの情報を移動中タスク管理テーブルＰ２５に登録し、Ｓ３０２へ戻る（Ｓ３１３）。
【０１４５】
このような手順によって、移動中タスク管理テーブルＰ２５に移動対象タスクの情報が作成される。移動対象タスク選択処理が完了した後、ジョブ制御プログラムＰ２１は、移動中タスク管理テーブルＰ２５に記載された各タスクを移動する。
【０１４６】
次に、タスク移動処理の詳細を説明する。
【０１４７】
図１２は、本発明の実施形態のタスクを移動する手順を示すフローチャートである。
【０１４８】
ジョブ制御プログラムＰ２１は、移動中タスク管理テーブルＰ２５からエントリを一つ抽出し（Ｓ４０１）、以下の手順でタスクの移動処理を行う。なお、Ｓ４０１において抽出されたエントリに対応するタスクが、移動対象タスクである。
【０１４９】
まず、移動中タスク管理テーブルＰ２５に記載された全てのタスクについて、移動が完了しているか否かを判定する（Ｓ４０２）。その結果、全てのタスクの移動が完了している場合、タスク移動処理を終了する（Ｓ４０２）。
【０１５０】
Ｓ４０３では、ジョブ制御プログラムＰ２１は、移動対象タスクのジョブＩＤとタスク番号を含む移動開始要求を、移動対象タスクを実行中のスレーブノードのノード内ジョブ管理プロセスＰ３に送信する。ジョブＩＤとタスク番号をキーとしてスレーブ管理テーブルＰ２２のタスクＩＤ一覧を検索する。検索されたエントリのノードアドレスが、移動対象タスクを実行中のノードのアドレスである。
【０１５１】
ノード内ジョブ管理プロセスＰ３は、移動開始要求を受けると、移動開始要求に含まれるジョブＩＤ及びタスク番号をキーとしてタスク管理テーブルＰ３３を検索し、検索されたエントリの実行状態を確認する。
【０１５２】
実行状態が「ＰＲＥ＿ＲＵＮ」又は「ＷＡＩＴ」であれば、状態を「ＭＩＧ＿ＳＥＮＤ」に変更する。さらに、ノード内ジョブ管理プロセスＰ３は、このタスクを実行中のジョブ実行プロセスＰ４に、移動対象タスクの実行状態を「ＭＩＧ＿ＳＥＮＤ」に変更するよう要求する。これを受けたジョブ実行プロセスＰ４は、移動対象タスクに対応するタスク管理テーブルＰ４４のエントリの実行状態を「ＭＩＧ＿ＳＥＮＤ」に変更する。その後、ノード内ジョブ管理プロセスＰ３は、移動開始通知をジョブ管理プロセスＰ２に返信する。
【０１５３】
ジョブ制御プログラムＰ２１は、ノード内ジョブ管理プロセスから移動開始通知を受けると、移動対象タスクに対応するタスク管理テーブルＰ２４内のエントリの実行状態を「ＭＩＧ＿ＳＥＮＤ」に変更し（Ｓ４０３）、Ｓ４０５へ進む（Ｓ４０４）。
【０１５４】
移動対象タスクに対応するタスク管理テーブルＰ３３のエントリの実行状態が「ＰＲＥ＿ＲＵＮ」、「ＷＡＩＴ」以外である場合、ノード内ジョブ管理プロセスＰ３は、ジョブ管理プロセスＰ２にエラーを返信する。ジョブ制御プログラムＰ２１は、このエラーを受けた場合、移動対象タスクを移動することができないので、移動処理を中断し、Ｓ４０１に戻る（Ｓ４０４）。
【０１５５】
ジョブ制御プログラムＰ２１は、移動対象タスクに対応する移動中タスク管理テーブルＰ２５のエントリの移動先スレーブＩＤを参照し、このスレーブＩＤをキーとしてスレーブ管理テーブルＰ２２を検索する。検索されたエントリのノードアドレスが、移動先タスクを生成するノードのアドレスである。ジョブ制御プログラムＰ２１は、スレーブ管理テーブルＰ２２から検索されたエントリのタスクＩＤ一覧に、移動対象タスクのジョブＩＤに一致するジョブＩＤを持つタスクＩＤが含まれているか否かを判定する。
【０１５６】
判定の結果、このようなタスクＩＤが含まれていない場合、そのノードでジョブ実行プロセスＰ４が実行されていないため、プロセス生成要求（図８のＭ０２）を移動先ノードのノード内ジョブ管理プロセスＰ３に送信して、移動対象タスクを実行するためのジョブ実行プロセスＰ４を生成する。
【０１５７】
その後、ジョブ制御プログラムＰ２１は、タスク生成要求（図８のＭ０８）を移動先ノードのノード内ジョブ管理プロセスＰ３に送信し、移動先タスクを生成する（Ｓ４０５）。このとき、タスク生成要求には、ジョブＩＤ、タスク番号及び初期状態が「ＭＩＧ＿ＲＥＣＶ」であることを記載する。ノード内ジョブ管理プロセスＰ３は、タスク生成要求を受信すると、ジョブ実行プロセスＰ４にタスク生成要求を転送し、ジョブ実行プロセスＰ４内に移動先タスクを生成する。このときジョブ実行プロセスＰ４のタスク管理テーブルＰ４４、及びノード内ジョブ管理プロセスＰ３内のタスク管理テーブルＰ３３には、実行状態が「ＭＩＧ＿ＲＥＣＶ」であり、ジョブＩＤ及びタスク番号が、移動対象タスクのそれらと一致するエントリが作成される。
【０１５８】
次に、ジョブ制御プログラムＰ２１は、移動対象先タスクに対応するエントリをタスク管理テーブルＰ２４に生成する。新規に生成されるエントリのジョブＩＤ及びタスク番号は、移動対象先タスクのそれらと一致し、実行状態は「ＭＩＧ＿ＲＥＣＶ」であり、全データ量及びスワップ量は０であり、スワップフラグは「ＩＤＬＥ」である。
【０１５９】
次に、ジョブ制御プログラムＰ２１は、移動対象タスクのジョブを実行する全てのジョブ実行プロセスＰ４に、移動先タスク生成通知を送信する。まず、ジョブ制御プログラムＰ２１は。スレーブ管理テーブルＰ２２のタスクＩＤ一覧を参照し、移動対象タスクのジョブＩＤを含むエントリを抽出する。これらのエントリに対応するノードでジョブが実行中なので、これらのエントリのノードアドレスに対して、移動対象タスクのジョブＩＤ、タスク番号、移動先ノードのアドレスを含む移動先タスク生成通知を送信する。
【０１６０】
各ノードで動作するノード内ジョブ管理プロセスＰ３は、移動先タスク生成通知を受信すると、タスク管理テーブルＰ３３に移動先タスクの情報を登録する。ここで新規に生成されるエントリの実行状態は「ＭＩＧ＿ＲＥＣＶ」となる。次に、ノード内ジョブ管理プロセスＰ３は、移動先タスク生成通知に含まれるジョブＩＤに対応するジョブを実行中のジョブ実行プロセスＰ４に、移動先タスク生成通知を転送する。
【０１６１】
ジョブ実行プロセスＰ４は、移動先タスク生成通知を受信すると、移動先タスクの情報をタスク管理テーブルＰ４４に登録する。ここで新規に生成されるエントリの実行状態は「ＭＩＧ＿ＲＥＣＶ」になる。エントリが生成されると、ジョブ実行プロセスＰ４は、移動準備完了通知をノード内ジョブ管理プロセスＰ３に返信する。
【０１６２】
ノード内ジョブ管理プロセスＰ３は、移動準備完了通知を受信すると、ジョブ管理プロセスＰ２に移動準備完了通知を転送する。ジョブ制御プログラムＰ２１は、移動先タスク生成通知を送信したすべてのノードから移動準備完了通知を受信した後、Ｓ４０７に進む（Ｓ４０６）。
【０１６３】
ジョブ制御プログラムＰ２１は、移動元タスクを実行中のジョブ実行プロセスに、移動対象タスクのジョブＩＤ、タスク番号、移動先ノードのアドレスを含むデータ移動要求を送信する。具体的には、Ｓ４０３で説明した手順と同様に、ノード内ジョブ管理プロセスを経由してデータ移動要求を送信する。
【０１６４】
ジョブ実行プロセスＰ４のタスク移動プログラムＰ４３は、データ移動要求を受信すると、データ移動要求に含まれるタスク番号をキーとしてメモリ管理テーブルＰ４５を検索する。検索されたエントリが、移動する必要があるメモリ領域に対応する。タスク移動プログラムＰ４３は、検索されたエントリのデータＩＤを参照し、対応するメモリ領域からデータを読み取り、移動先ノードのジョブ実行プロセスＰ４に送信する。移動先ノードのジョブ実行プロセスＰ４は、データを受信すると、メモリ管理テーブルＰ４５に受信したデータの情報を登録する。但し、データＩＤはノード毎に管理されるメモリ領域のＩＤであるため、移動元ノードのメモリ管理テーブルＰ４５とは同じ値にはならない。
【０１６５】
また、データがスワップアウト済みである場合、メモリ管理テーブル４５のデータＩＤは空欄で、スワップファイル名にスワップファイルの名前が記載されている。この場合、スワップファイルの内容を送信する。スワップファイルからデータを送信した場合、移動先ノードにはスワップファイルは作成されず、データは実メモリ領域に割り当てられる。すべてのデータ送信が完了した後、転送元ノードのジョブ実行プロセスＰ４は、メモリ管理テーブルＰ４５から送信されたデータに対応するエントリを削除し、対応するメモリ領域を開放する。そして、ノード内ジョブ管理プロセスＰ３を経由して、データ移動完了通知をジョブ管理プロセスＰ２に送信する（Ｓ４０７）。
【０１６６】
ジョブ制御プログラムＰ２１は、データ移動完了通知を受信したら、移動元タスクを実行中のジョブ実行プロセスＰ４に、移動対象タスクのジョブＩＤ、タスク番号を含むタスク廃棄要求を送信する。具体的には、Ｓ４０３で説明した手順と同様に、ノード内ジョブ管理プロセスを経由してタスク廃棄要求を送信する。タスク実行プロセスＰ４は、タスク廃棄要求を受信すると、廃棄が要求されたタスクを削除し、削除されたタスクに対応するエントリをタスク管理テーブルＰ４４から削除する。
【０１６７】
さらに、ジョブ制御プログラムＰ２１は、移動中タスク管理テーブルＰ２５から移動対象タスクに対応するエントリを検索し、検索されたエントリの実行状態を取得する。そして、ジョブ制御プログラムＰ２１は、実行状態、移動対象タスクのジョブＩＤ、タスク番号を含む移動タスク復帰要求を、移動先ノードのジョブ実行プロセスＰ４に送信する。具体的には、Ｓ４０３で説明した手順と同様に、ノード内ジョブ管理プロセスＰ３を経由して移動タスク復帰要求が送信される。
【０１６８】
ジョブ実行プロセスＰ４は、移動タスク復帰要求を受信すると、移動タスク復帰要求に含まれるタスク番号をキーとしてタスク管理テーブルＰ４４を検索し、検索されたエントリの実行状態を移動タスク復帰要求に含まれる実行状態に変更する（Ｓ４０８）。
【０１６９】
以上のステップによってタスクの移動処理が完了する。ジョブ制御プログラムＰ２１は、Ｓ４０１に戻り、移動中タスク管理テーブルＰ２５に記載された他のタスクを移動し、全てのタスクの移動が完了するまでこの処理を繰り返信する。
【０１７０】
本発明は、明細書に開示した内容から当業者が可能な範囲で変更可能な範囲をその範疇に含む。例えば、本実施の形態では、３種類の計算機（クライアントノード１０、マスタノード２０、スレーブノード３０）を利用したが、これら計算機は共通のものでもよい。例えば、クライアントプロセスＰ１がマスタノード２０上で動作し、マスタノード２０をクライアントノード１０と共通に運用してもよい。また、マスタノード２０上でノード内ジョブ管理プロセスＰ３とジョブ実行プロセスＰ４が動作し、マスタノード２０をスレーブノード３０の一つとして運用してもよい。
【０１７１】
また、本発明の実施の形態では、初期データの格納場所として分散ＦＳを利用したが、すべてのノードから同一のパス名でアクセス可能なファイルシステムであれば、他のファイルシステムを利用することが可能である。例えば、ＮＦＳ（Ｎｅｔｗｏｒｋ  Ｆｉｌｅ  Ｓｙｓｔｅｍ）を利用してもよい。
【符号の説明】
【０１７２】
１０  クライアントノード
２０  マスタノード
３０  スレーブノード
Ｐ１  クライアントプロセス
Ｐ２  ジョブ管理プロセス
Ｐ２１  ジョブ制御プログラム
Ｐ２２  スレーブ管理テーブル
Ｐ２３  ジョブ管理テーブル
Ｐ２４  タスク管理テーブル
Ｐ２５  移動中タスク管理テーブル
Ｐ３  ノード内ジョブ管理プロセス
Ｐ３１  ノード内ジョブ制御プログラム
Ｐ３２  ホスト内ジョブ管理テーブル
Ｐ３３  タスク管理テーブル
Ｐ３４  メモリ管理テーブル
Ｐ４  ジョブ実行プロセス
Ｐ４１  タスク制御プログラム
Ｐ４２  データ移動プログラム
Ｐ４３  タスク移動プログラム
Ｐ４４  タスク管理テーブル
Ｐ４５  メモリ管理テーブル
Ｐ４６  タスク
Ｐ４７  タスク処理コード
Ｐ５  分散ＦＳ
１０１  ＣＰＵ
１０２  ＬＡＮ  Ｉ／Ｆ
１０３  入出力Ｉ／Ｆ
１０４  メモリ
１０５  ストレージＩ／Ｆ
１０６  キーボード
１０７  マウス
１０８  ディスプレイ
１０９  記憶装置
【図１】
2011197896.tif 000003
【図２】
2011197896.tif 000004
【図３Ａ】
2011197896.tif 000005
【図３Ｂ】
2011197896.tif 000006
【図３Ｃ】
2011197896.tif 000007
【図４Ａ】
2011197896.tif 000008
【図４Ｂ】
2011197896.tif 000009
【図４Ｃ】
2011197896.tif 000010
【図４Ｄ】
2011197896.tif 000011
【図５Ａ】
2011197896.tif 000012
【図５Ｂ】
2011197896.tif 000013
【図５Ｃ】
2011197896.tif 000014
【図６Ａ】
2011197896.tif 000015
【図６Ｂ】
2011197896.tif 000016
【図７】
2011197896.tif 000017
【図８】
2011197896.tif 000018
【図９】
2011197896.tif 000019
【図１０】
2011197896.tif 000020
【図１１】
2011197896.tif 000021
【図１２】
2011197896.tif 000022