(57)【特許請求の範囲】
【請求項１】
１つまたは複数の動作を実行するようにマイクロプロセッサを制御するように構成された第１のコンピュータ読取可能命令を受け取るステップと、
マイクロプロセッサを使用して、前記第１のコンピュータ読取可能命令に基づいて第２のコンピュータ読取可能命令を生成するステップであって、前記第２のコンピュータ読取可能命令は、
関数を実行するステップと、
チェックポイントに達したときに、データを保存するかどうかを判定するステップと、
データを保存すると判定される場合、前記チェックポイントにおいてデータを保存するステップと
を実行するように構成され、前記第２のコンピュータ読取可能命令は、さらに、
関数を呼び出すステップと、
前記関数による使用のためにデータをロードするステップであって、前記データは、前記関数の以前の実行中にチェックポイントで保存されている、ステップと、
前記関数の以前の実行中に前記チェックポイントにおいて実行中であった前記関数の行にスキップするステップであって、前記関数の行は、前記関数の最初でも最後でもない、前記関数内のポイントである、ステップと
によって、前記チェックポイントから前記関数の実行を再開するように構成される、前記生成するステップと
を含み、
前記第２のコンピュータ読取可能命令を生成するステップは、チェックポイントから前記関数の実行を再開するように構成される追加の命令を前記第１のコンピュータ読取可能命令に追加するステップを含むことを特徴とする方法。
【請求項２】
前記第１のコンピュータ読取可能命令を含むソースコードを、前記第２のコンピュータ読取可能命令を含むオブジェクトコードにコンパイルするコンパイラによって実行されることを特徴とする請求項１に記載の方法。
【請求項３】
前記第２のコンピュータ読取可能命令は、前記関数によって使用されるデータを保存するようにさらに構成されることを特徴とする請求項１に記載の方法。
【請求項４】
前記第２のコンピュータ読取可能命令は、前記関数を含むプログラムのプログラムスタックを追跡するようにさらに構成されることを特徴とする請求項１に記載の方法。
【請求項５】
前記第２のコンピュータ読取可能命令は、前記第２のコンピュータ読取可能命令を実行するデバイス上で実行されるオペレーティングシステムから独立した方法でチェックポイントから関数の実行を再開するように構成される請求項１に記載の方法。
【請求項６】
実行されると、
１つまたは複数の動作を実行するようにマイクロプロセッサを制御するように構成された第１のコンピュータ読取可能命令を受け取るステップと、
マイクロプロセッサを使用して、前記第１のコンピュータ読取可能命令に基づいて第２のコンピュータ読取可能命令を生成するステップであって、前記第２のコンピュータ読取可能命令は、
関数を実行するステップと、
チェックポイントに達したときに、データを保存するかどうかを判定するステップと、
データを保存すると判定される場合、前記チェックポイントにおいてデータを保存するステップと
を実行するように構成され、前記第２のコンピュータ読取可能命令は、さらに、
前記関数を含むプログラムのプログラムスタックを追跡し、
関数を呼び出すステップと、
前記関数による使用のためにデータをロードするステップであって、前記データは、前記関数の以前の実行中にチェックポイントで保存されている、ステップと、
前記関数の以前の実行中に前記チェックポイントにおいて実行中であった前記関数の行にスキップするステップであって、前記関数の行は、前記関数の最初でも最後でもない、前記関数内のポイントである、ステップと
によって、前記チェックポイントから前記関数の実行を再開するように構成される、前記生成するステップと
を含む方法を実行するプログラム。
【請求項７】
前記方法は、前記第１のコンピュータ読取可能命令を含むソースコードを、前記第２のコンピュータ読取可能命令を含むオブジェクトコードにコンパイルするコンパイラによって実行される請求項６に記載のプログラム。
【請求項８】
前記第２のコンピュータ読取可能命令を生成するステップは、チェックポイントから前記関数の実行を再開するように構成される追加の命令を前記第１のコンピュータ読取可能命令に追加するステップを含み、前記第２のコンピュータ読取可能命令は、前記関数によって使用されるデータを保存するようにさらに構成される請求項６に記載のプログラム。
【請求項９】
前記第２のコンピュータ読取可能命令は、前記関数によって使用されるデータを保存するようにさらに構成される請求項６に記載のプログラム。
【請求項１０】
前記第２のコンピュータ読取可能命令は、前記第２のコンピュータ読取可能命令を実行するデバイス上で実行されるオペレーティングシステムから独立した方法でチェックポイントから関数の実行を再開するように構成される請求項６に記載のプログラム。
【請求項１１】
関数を実行するステップと、
チェックポイントに達したときに、データを保存するかどうかを判定するステップと、
データを保存すると判定される場合、前記チェックポイントにおいてデータを保存するステップと
を実行するように構成され、且つ、
関数を呼び出すステップと、
前記関数による使用のためにデータをロードするステップであって、前記データは、前記関数の以前の実行中にチェックポイントで保存されている、ステップと、
前記関数の以前の実行中に前記チェックポイントにおいて実行中であった前記関数の行にスキップするステップであって、前記関数の行は、前記関数の最初でも最後でもない、前記関数内のポイントである、ステップと、
前記関数によって使用されるデータを保存するステップと、
前記関数を含むプログラムのプログラムスタックを追跡するステップと
によって前記チェックポイントから前記関数の実行を再開するように構成されたコンピュータ読取可能命令を格納したコンピュータ読取可能記憶媒体であって、前記コンピュータ読取可能命令は既存のコンピュータ読取可能命令を変更することにより生成される、コンピュータ読取可能記憶媒体と、
前記コンピュータ読取可能命令を実行するように構成された少なくとも１つのマイクロプロセッサと
を備えたことを特徴とするシステム。
【請求項１２】
前記少なくとも１つのマイクロプロセッサは、第１のマイクロプロセッサおよび第２のマイクロプロセッサを含むことを特徴とする請求項１１に記載のシステム。
【請求項１３】
前記第１のマイクロプロセッサは前記関数を実行し、前記第１のマイクロプロセッサを使用する前記関数の実行が中断されると、前記関数の実行は、前記第２のマイクロプロセッサを使用して前記チェックポイントから継続されることを特徴とする請求項１２に記載のシステム。
【請求項１４】
前記第１のマイクロプロセッサを含む第１のデバイスと、
前記第２のマイクロプロセッサを含む第２のデバイスと
を含むことを特徴とする請求項１３に記載のシステム。
【請求項１５】
前記第１のデバイスは、第１のオペレーティングシステムを実行し、前記第２のデバイスは、前記第１のオペレーティングシステムとは異なる第２のオペレーティングシステムを実行することを特徴とする請求項１４に記載のシステム。
【請求項１６】
前記コンピュータ読取可能命令の一部は、前記関数によって使用される前記データを保存するためのデータ構造を定義する請求項１１に記載のシステム。
【請求項１７】
前記コンピュータ読取可能命令は、前記関数内のどこで関数の呼び出しが他の関数に対してなされるかを識別する請求項１１に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本明細書で説明する技術は、中断ポイントからコンピュータプロセスの実行の復元を可能にすることに関する。
【背景技術】
【０００２】
アプリケーションまたは他のコンピュータプログラムが予期せずに終了し、または設計された通りに動作するのをやめるプログラムクラッシュが、発生することが知られている。一部のプログラムは、クラッシュが発生したときにデータ損失の量が制限されるように、情報を時々保存する。例えば、一部のワードプロセッシングプログラムは、ユーザが文書を操作する様々な時に、その文書の草稿を自動的に保存する。ワードプロセッシングプログラムがクラッシュした場合、ユーザは、文書がワードプロセッシングプログラムによって自動的に保存された最も近いポイントから、保存されたデータをロードすることによって、文書を復元できる場合がある。
【０００３】
一部のオペレーティングシステムは、プログラムが動作しているときに該プログラムから情報を受け取る能力を提供し、保存された状態からプログラムの実行を復元することができる。しかし、そのような技法では、プログラムの実行を復元できるようにするためには、オペレーティングシステムからの協力が必要である。
【発明の概要】
【０００４】
上で述べたように、中断ポイントからプログラムの実行を復元するいくつかの既存の技法は、オペレーティングシステムからの協力を必要とする。そのような技法は、オペレーティングシステムが、アプリケーションデータを保存し、実行が中断されたときにアプリケーションのオペレーションの状態を復元するのに適したインターフェースを提供することを必要とする。しかし、すべてのオペレーティングシステムが、そのような能力を提供するわけではない。オペレーティングシステムからの協力を必要とせずに、アプリケーションレベルでプログラムの実行を復元する能力を提供することは有利であろう。
【０００５】
いくつかのアプリケーションは、プログラムデータを保存し、実行が中断されたときにプログラムデータを復元する能力を含むように、特に設計され、プログラムされている。しかし、アプリケーションプログラマとって、新しいアプリケーションを書くときや既存のアプリケーションを変更するときに、そのような能力を提供するようにアプリケーションを設計し、プログラムする必要があることは、時間のかかることであろう。
【０００６】
本明細書で説明される技法は、プログラム実行のチェックポイントおよび復元を可能にする、プログラムレベルの柔軟なフレームワークを提供する。本出願人は、コンピュータのオペレーティングシステムからの協力を必要とすることなく、実行が中断されたポイントからプログラム実行を復元する技法を開発した。これらの技法を、プログラムを実行するオペレーティングシステム環境に関わらず、プログラムレベルで実装することができる。いくつかの実施形態では、これらの技法を実装するコードを、プログラムを変更し、中断されたプログラム実行の復元を可能にする命令を追加する、自動化されたツールを使用して、既存のプログラムコードに組み込むことができる。したがって、アプリケーションを開発するプログラマは、中断されたプログラム実行の復元を可能にするコードを、自動化されたツールを使用して自動的に組み込むことができるので、そのような機能を含むようにアプリケーションコードを設計またはプログラムする必要がない。
【０００７】
いくつかの実施形態は、１つまたは複数のオペレーションを実行するようにマイクロプロセッサを制御するように構成された第１のコンピュータ読取可能命令を受け取るステップと、マイクロプロセッサを使用して、第１のコンピュータ読取可能命令に基づいて第２のコンピュータ読取可能命令を生成するステップであって、１つまたは複数の命令を実行し、関数を呼び出すことによって関数の実行をチェックポイントから再開するようにされている、第２のコンピュータ読取可能命令を生成するステップと、上記関数による使用のためにデータをロードするステップであって、上記関数の以前の実行中にチェックポイントにおいて保存されたデータをロードするステップと、チェックポイントに達する前に関数の以前の実行中に実行された、関数の部分をスキップするステップとを含む方法に関する。いくつかの実施形態は、実行されたときに上述の方法を実行する命令を記憶したコンピュータ読取可能記憶媒体に関する。
【０００８】
いくつかの実施形態は、関数を呼び出すことと、関数による使用のためにデータをロードすることであって、関数の以前の実行中にチェックポイントで保存されたデータをロードすることと、関数の以前の実行中にチェックポイントに達する前に実行された関数の部分をスキップすることと、関数によって使用されるデータを保存することと、関数を含むプログラムのプログラムスタックを追跡することとによって、チェックポイントから関数の実行を再開するように構成されたコンピュータ読取可能命令を格納したコンピュータ読取可能記憶媒体を含むシステムに関する。このシステムは、コンピュータ読取可能命令を実行するように構成された少なくとも１つのマイクロプロセッサも含む。
【０００９】
前述は、いくつかの実施形態の非限定的な要約である。
【００１０】
図面では、様々な図に示された各同一のまたはほぼ同一の構成要素が、同様の符号によって表されている。明瞭性のために、必ずしもすべての構成要素が、すべての図で符号を付けられているわけではない。図面は、必ずしも原寸に比例して示されてはおらず、むしろ、本発明の様々な態様を示すことに重きをおいている。
【図面の簡単な説明】
【００１１】
【図１】いくつかの実施形態による、コンピュータプログラムの関数Ｆの一部としてオペレーションを実行するコンピュータ読取可能命令を含むソフトウェアモジュールを示す図である。
【図２】いくつかの実施形態による、様々なチェックポイントにおけるプログラム状態およびプログラムデータを保存することを含む、プログラムを実行する方法を示す流れ図である。
【図３】いくつかの実施形態による、チェックポイントから関数の実行を再構築する方法を示す流れ図である。
【図４】いくつかの実施形態による、チェックポイントからプログラムのオペレーションを復元することを可能にするためにコードを変更する方法を示す流れ図である。
【図５】本明細書で説明する技法を実装することができる複数のマイクロプロセッサを有するコンピューティングデバイスの例を示す図である。
【図６】本明細書で説明する技法を実装することができるコンピューティングデバイスを含むコンピューティング環境の例を示す図である。
【発明を実施するための形態】
【００１２】
上で述べたように、本明細書で説明する技法は、コンピュータのオペレーティングシステムからの協力を必要とせずに、実行が中断されたときにチェックポイントからプログラム実行を復元することを可能にする。そのような技法は、基礎になるハードウェアまたはソフトウェアの不安定性に対して保護することができ、オペレーティングシステムのクラッシュ、停電、またはシステム内の他の障害の後にプログラム実行を復元することを可能にすることができる。これらの技法を、自動化されたツールを使用して既存のコードを変更することによって、プログラマがこの機能性を特別に含めるためにアプリケーションをプログラムすることを必要とせずに、実装することができる。いくつかの実施形態では、コンパイラまたは他のプログラム翻訳ツールは、既存のコードを再構成して、プログラムの実行を保存し、エラーが発生した後にプログラムの実行を復元する能力を提供することができる。
【００１３】
有利なことに、これらの技法は、マルチスレッド式マルチコア環境内において、またプログラムが複数のマシン上で動作する環境にとって頑健なものとなり得る。実行が中断され、継続することができないとき、プログラムは、異なるプロセッサまたは異なるマシン上で、さらには異なるオペレーティングシステムを実行しているマシン上であっても実行を継続することができる。これらの技法は、複数のマシンがプログラムを実行するのに利用可能なクラウドコンピューティング環境において用いることができる点で有利である。例示的実施形態の詳細な議論を以下で提供する。
【００１４】
Ｉ．実行の復元をサポートするプログラムコードを変更する例
一般に使用されるプログラム言語は、プログラムの実行中に呼び出される関数を定義する能力を提供する。コードは、関数が受け入れる入力や、関数によって実行されるオペレーション、および関数によって返されるデータなど、関数の主要な態様を定義する。
【００１５】
例えば、次のコードは、関数ＦおよびＧを定義する。関数Ｆは、整数ａおよびｂを入力として受け取る。関数Ｆは、積ａ×ｂと等しくなるようにセットされる整数になるようにローカル変数ｘを初期化（instantiate）し、関数Ｇの戻り値と等しくなるようにセットされる整数になるように変数ｙを初期化する。関数Ｆは、値ｘ＋ｙを有する整数を返す。関数Ｇは、整数ｘおよびｂを入力として受け取るが、これは、それぞれ関数Ｇ内のローカル変数ａおよびｂに対応する。関数Ｇは、ａ＋ｂと等しくなるようにセットされる整数になるようにローカル変数ｘを初期化する。関数Ｇは、ｘの値と等しい整数を返す。
【００１６】
【表１】
0006027020.tif 000002
【００１７】
プログラムが実行されるとき、関数Ｆを呼び出すことができ、この関数Ｆは、関数Ｇを呼び出す。関数Ｆおよび／またはＧの実行中に、プログラムがクラッシュするか、あるいは実行が他の形で中断される場合、関数Ｆおよび／またはＧの実行で行われた進行は、失われる可能性がある。実行を継続するためには、プログラムをリスタートする必要があり、関数Ｆを始めからもう一度開始する必要があり、そして、関数Ｇをもう一度呼び出す必要がある。例示的な関数ＦおよびＧを実行するのに必要な処理能力の量は、大きくはない可能性があるが、複雑なプログラムを実行しているときは、かなりのデータが失われる可能性があり、関数Ｆおよび／またはＧの実行が中断されたポイントに到達するのに、かなりの処理を二度実行する必要がある可能性があることを理解されたい。失われた作業の量は、例えばモデリングおよびシミュレーションなどの複雑なプログラミングタスクを実行するとき、特に多くなる可能性がある。
【００１８】
いくつかの実施形態では、追加のコードをプログラムに挿入して、「チェックポイント」と呼ばれる様々なポイントにおいてプログラムのオペレーションの状態を格納することを可能にすることができる。どの関数が実行しているかに関する指示を保存することによってプログラムスタックを追跡するためのコードを含めることができる。関数によって使用されるローカル関数を格納し、および実行中に到達した関数内の行の指示を保存するコードを含めることもできる。これらのタイプのコードの追加は、チェックポイントで動作中であった１つまたは複数の関数を呼び出して、その１つまたは複数の関数によって使用中であったローカル変数をロードし、そしてその１つまたは複数の関数のうち、中断の前に既に実行された部分をスキップすることによって、プログラムの再構築を可能にすることができる。
【００１９】
図１に、コンピュータプログラムの関数Ｆのオペレーションを実行し、およびプログラム実行の復元を可能にするためのコンピュータ読取可能命令を含む、ソフトウェアモジュール１００の例を示す。ソフトウェアモジュール１００のコンピュータ読取可能命令は、プログラム内の関数の実行の状態を追跡すること、プログラム実行中に様々なチェックポイントで関数によって使用されるデータを保存すること、そしてプログラムが中断されるときにチェックポイントから関数の実行を復元することを可能にする。図１の例では、ソフトウェアモジュール１００は、ヘルパコード１０２、関数プリアンブル１０４、関数Ｆのオペレーションを実行する関数コード１０６、呼び出しサイトラベルコード１０８、および関数エピローグ１１０を含む。
【００２０】
ヘルパコード１０２は、関数Ｆのローカル変数および入力引数を保存するデータ構造体を定義するコード１１２を含むことができる。ヘルパコード１０２は、関数Ｆのデータを保存する保存関数を定義するコード１１４と、ストレージから関数Ｆのデータをロードするロード関数を定義するコード１１６も含むことができる。保存関数は、保存された変数をチェックポイントファイルに付加する。ロード関数は、変数をチェックポイントファイル内の現在のポイントからロードし、ファイルポインタを進める。概念を示すためにソースコードとして示されているが、ヘルパコード１０２および本明細書で説明される任意の他のコードを、オブジェクトコードまたは任意の他の適切なタイプのコードとして実装することができることを理解されたい。データ構造体を定義し、保存関数およびロード関数を提供するのに適したヘルパコード１０２の例を以下に示す。
【００２１】
【表２】
0006027020.tif 000003
【００２２】
【表３】
0006027020.tif 000004
【００２３】
図１に示されているように、関数プリアンブル１０４は、関数Ｆのローカル変数用のデータ構造体オブジェクトをインスタンス化するコード１１８と、関数Ｆがｐｕｓｈ（）関数を使用して実行されていることの指示を保存することによってプログラムスタックを追跡するコード１２０とを含むことができる。関数プリアンブル１０４は、チェックポイントから関数Ｆの実行の再構築を可能にするコード１２２も含むことができる。関数Ｆの実行が再構築されている場合には、コード１２４が、チェックポイントで保存された関数Ｆのローカル変数をロードするのに実行される。コード１２６は、チェックポイントに達する前に既に実行された関数Ｆの部分をスキップするのに実行される。例えば、プログラムの実行が中断されたときに、関数Ｇが関数Ｆの範囲内で実行中であった場合には、コード１２６は、関数Ｆの、関数Ｇを呼び出す行までスキップすることができる。いくつかの実施形態で使用され得る関数プリアンブル１０４の例を、以下に示す。
【００２４】
【表４】
0006027020.tif 000005
【００２５】
図１に示されているように、関数コード１０６は、関数、例えば関数Ｆのオペレーションを実行するために含まれる。関数Ｆを例として述べるが、本明細書で説明する技法を、コンピュータプログラムの１つまたは複数のオペレーションを実行する任意の関数に使用することができる。関数コード１０６を、元の関数、例えば、関数Ｆの関数コードから再び書くことができ、その結果、実行中のデータの保存を容易にするために、ローカル変数をコード１１２によって定義されたデータ構造体に格納し、これにより、関数Ｆの実行を再構築する必要がある場合には後に変数をロードすることが可能になる。いくつかの実施形態での使用のための関数コード１０６の例を、以下に示す。
【００２６】
【表５】
0006027020.tif 000006
【００２７】
関数Ｆに関して上述したように、変数ｘは、積ａ・ｂと等しくなるようにセットされる。関数コード１０６では、関数Ｆにおける演算と同一の乗算演算が実行されるが、コードは、関数を再構築する必要がある場合にローカル変数の再ロードを容易にするため、結果をコード１１２によって定義されるデータ構造体内に格納するように変更される。
【００２８】
図１に示されるように、呼び出し側ラベルコード１３０は、関数Ｆ内で他の関数が呼び出される場所を識別するコードを含むことができる。例えば、関数Ｆは、別の関数Ｇを呼び出すことができ、呼び出し側ラベルコード１３０は、関数Ｆ内で関数Ｇが呼び出される位置を識別することができる。コード１３２も、関数Ｇを呼び出すために関数Ｆ内に含まれる。いくつかの実施形態での使用のための呼び出し側ラベルコード１３０の例を、以下に示す。
【００２９】
【表６】
0006027020.tif 000007
【００３０】
この点で、下記のコードなど、上記関数Ｆ内と同様に変数ｘおよびｙの合計を計算するのに実行される、追加の関数コード１０６を含むことができる。
【００３１】
【表７】
0006027020.tif 000008
【００３２】
図１に示されるように、関数エピローグ１１０は、関数Ｆの実行が完了されるときにｐｏｐ（）関数を使用してプログラムスタックの追跡を更新するコード１３４を含むことができる。関数エピローグ１１０は、関数Ｆによってデータを返すコード１３６も含むことができる。いくつかの実施形態で使用できる関数エピローグ１１０の例を、以下に示す。
【００３３】
【表８】
0006027020.tif 000009
【００３４】
Ｐｕｓｈ（）およびＰｏｐ（）のサンプルの実施態様を、例として以下に示す。
【００３５】
【表９】
0006027020.tif 000010
【００３６】
次のコードは、「Ｌｏｃａｌｓ」オブジェクトのＬｏａｄ（）メソッドおよびＳａｖｅ（）メソッドによって使用されるＬｏａｄＬｏｃａｌｓ（）およびＳａｖｅＬｏｃａｌｓ（）の実施態様を有する「Ｃｈｅｃｋｐｏｉｎｔ」クラスの例を定義する。
【００３７】
【表１０】
0006027020.tif 000011
【００３８】
ＩＩ．チェックポイントにおけるプログラム状態を保存する例
図２は、プログラムを実行し、様々なチェックポイントでプログラム状態を保存する方法２００の例を示す。プログラム状態を保存するために、ローカルオブジェクトのスタックをトラバースすることができ、各々を順番に保存することができる。プログラムの実行は、ステップ２０２において開始する。ステップ２０３において、チェックポイント機会に達し、ここで、プログラムは、プログラムの状態を保存するオプションを有する。プログラムは、ステップ２０３において、このチェックポイント機会を利用してプログラム状態を保存するかどうかに関する判定を行うことができる。プログラムがチェックポイント機会を使用するかどうかに関する判断は、最後のチェックポイント以降に経過した時間の長さまたは任意の他の適切な判断基準に基づいて行うことができる。いくつかの場合に、ユーザが、チェックポイントを明示的に要求することができる。プログラム状態保存の頻度とプログラムの性能との間には、トレードオフが存在する。プログラム状態を保存する頻度を高めることは、データ消失の量を制限することができるが、プログラム性能の低下を引き起こす可能性がある。チェックポイント機会を利用する頻度は、アプリケーションに応じて変化し得る。
【００３９】
プログラムが、チェックポイント機会を使用してプログラム状態を保存すると判断した場合、この情報が、ステップ２０４において保存される。例えば、プログラムは、ヘルパコード１０２内のコード１１４によって定義される保存関数を使用することができる。プログラムが、チェックポイント機会を使用しないと判断した場合、プログラムの実行は、ステップ２０６において継続される。プログラムの実行は、次のチェックポイントに達するまで継続され、これに達したポイントにおいて、この方法は、ステップ２０３における次のチェックポイント機会に戻る。方法２００は、プログラムが終了されるまで継続することができる。
【００４０】
ＩＩＩ．チェックポイントからプログラム実行を復元する例
図３は、いくつかの実施形態による、チェックポイントから関数の実行を復元する方法３００を示す。ステップ３０２において、クラッシュまたは他の障害が発生した後に、プログラムがリスタートされる。ステップ３０４において、プログラムが、上で述べた関数Ｆなどの第１の関数を呼び出す。ステップ３０６において、関数Ｆのチェックポイントで保存されたローカル変数が、ストレージからロードされる。ステップ３０８において、プログラムは、チェックポイントで実行中であった関数Ｆの行にスキップし、関数Ｆの実行は、そのポイントから再開される。したがって、ステップ３０６および３０８は、関数Ｆの実行を、プログラム状態がチェックポイントで保存されたときの実行ポイントまで復元することを容易にする。関数Ｇがチェックポイントで実行中であった場合、プログラムは、関数Ｇを呼び出す関数Ｆの行までスキップすることができ、次いで、ステップ３１０において、関数Ｇが呼び出される。その後、ステップ３０６および３０８が、関数Ｇについて繰り返される。チェックポイントで保存された関数Ｇのローカル変数が、ストレージからロードされ、プログラムは、チェックポイントで実行中であった関数Ｇの行にスキップする。前の関数の範囲内で他に実行中の関数がなかった場合、方法は終了し、プログラム実行がチェックポイントから継続される。したがって、プログラムの実行は、プログラムの中断に先立ってチェックポイントに達する前に実行されたオペレーションのすべてを再実行する必要なしに、チェックポイントから再開することができる。
【００４１】
ＩＶ．状態の保存およびチェックポイントからのプログラム実行の復元を可能にするコードの生成
図４は、いくつかの実施形態による、チェックポイントからプログラムのオペレーションを復元することを可能にするようにコードを変更する方法を示す。上で述べたように、有利には、本明細書で説明する技法を、プログラマによる手作業のコーディングなしで、プログラムに自動的に組み込むことができる。コンパイラなどのプログラム変換ツールは、既存のコードを変更して、チェックポイントからプログラムのオペレーションを復元することを可能にすることができる。例えば、ステップ４０２において、コンパイラまたは他のプログラム変換ツールは、１つまたは複数の関数を定義するコードを含むプログラムコードを受け取ることができる。本明細書で説明する技法は、プログラムによって実行されるオペレーションのタイプに関して限定されないので、プログラムコードは、任意の適切なオペレーションを実行するように設計することができる。一例として、プログラムコードは、上述の関数ＦおよびＧを定義するコードを含むことができる。ステップ４０４において、関数ＦおよびＧを実行するためのコードが、プログラムがチェックポイントから実行を復元することを可能にするように変更される。例えば、コンパイラまたは他のプログラム変換ツールは、上で述べたヘルパコード１０２、関数プリアンブル１０４、呼び出し側ラベルコード１０８、および関数エピローグ１１０を挿入することができる。チェックポイント機会を、データを保存するコード内の適切な位置に挿入することもできる。関数コード１０６は、ヘルパコード１０２内で定義されるローカル変数を格納するデータ構造体を利用するように変更され得る。コンパイラを使用して方法４００を実行する場合、生成される結果は、中断が発生したときにチェックポイントから関数ＦおよびＧの実行を復元することを可能にする追加の能力を有する、関数ＦおよびＧを実行するように構成されたオブジェクトコードとすることができる。
【００４２】
Ｖ．適用法
本明細書で説明する技法は、長い実行時間を有するプログラムにとって非常に重要になり得るフォールトトレラント方式およびフェイルオーバ方式を提供することができる。これは、計算のサイズが増大すると、失われる作業のコストが増大することに起因する。障害の可能性は、より多くのハードウェアを使用して計算を実行するときにより高いので、これらの技法は、多くのコンピューティングリソースを利用する分散プログラムにとっても非常に有用であり得る。新しいコンピューティングハードウェアにおける傾向は、ハードウェアの各連続する世代が指数関数的により速いパラダイムから、各連続する世代が指数関数的により多くの計算コアを有するパラダイムにシフトしてきた。本明細書で説明する技法を使用して、複数の計算コアまたはマシンのクラスタ上で動作するマルチスレッド式プログラムを使用して大量の計算作業を実行することを可能にすることができる。例えば、そのような技法を、複数のマシンおよび／または複数のコアがプログラムデータの処理に用いられるクラウドコンピューティング環境で使用することができる。
【００４３】
本明細書で説明する技法の利点は、あるプログラムをあるプロセッサ／マシン上で開始し、その後、クラッシュまたは他の障害が発生したときに、処理を別のプロセッサ／マシン上で継続することができることである。あるプロセッサまたはマシンが障害を発生した場合、最小限の中断で処理を別のプロセッサまたはマシン上で再開することができる。本明細書で説明する技法は、オペレーティングシステムの協力を必要としないので、いくつかの実施形態では、処理を、異なるオペレーティングシステムを実行しているプロセッサ／マシン上で継続することができるであろう。プログラムは、適切なバージョンが新しいアーキテクチャ上でコンパイルされ、チェックポイントのファイルフォーマットがアーキテクチャにまたがってポータブルである場合、異なるオペレーティングシステム上で動作することができる。
【００４４】
図５は、複数のマイクロプロセッサ５０２および５０３を有するコンピューティングデバイス５０１の例を示す。実行を中断するクラッシュまたは他の障害が発生したとき、プログラム全体またはプログラムスレッドが、マイクロプロセッサ５０２上で動作している場合がある。本明細書で説明する技法を使用すると、そのプログラムまたはプログラムスレッドは、そのプログラムの実行の状態を表す永続ストレージ５０４内に格納されたデータを使用して、マイクロプロセッサ５０３上でプログラムの実行を継続することができる。
【００４５】
図６は、マイクロプロセッサ６０２を有するコンピューティングデバイス６０１およびマイクロプロセッサ６０４を有するコンピューティングデバイス６０３を含むコンピューティング環境の例を示す。実行を中断するクラッシュまたは他の障害が発生したとき、プログラムまたはプログラムスレッドが、マイクロプロセッサ６０２上で動作していることがある。本明細書で説明する技法を使用すると、そのプログラムまたはプログラムスレッドは、デバイス６０３のマイクロプロセッサ６０４上でプログラムの実行を継続することができる。デバイス６０１および６０３を、任意の適切な通信接続によって接続することができる。デバイス５０１、６０１、および６０３は、例えば汎用コンピュータまたは本明細書で説明する他のデバイスなど、任意の適切なコンピューティングデバイスとすることができる。
【００４６】
本発明の少なくとも１つの実施形態の複数の態様を説明したので、当業者には様々な代替形態、修正形態、および改善が容易に思い付くであろうことは理解されよう。
【００４７】
そのような代替形態、修正形態、および改善は、本開示の一部であることが意図されており、また本発明の趣旨および範囲に含まれることが意図されている。したがって、前述の説明および図面は、例にすぎない。
【００４８】
本発明の上で説明した実施形態を、多数の形のいずれかで実装することができる。例えば、実施形態を、ハードウェア、ソフトウェア、またはその組合せを使用して実装することができる。ソフトウェアで実装されるとき、ソフトウェアコードを、単一のコンピュータ内で提供されようと複数のコンピュータの間で分散されようと、任意の適切なプロセッサまたはプロセッサの集合において実行することができる。そのようなプロセッサを、集積回路コンポーネント内に１つまたは複数のプロセッサを有する、集積回路として実装することができる。しかし、プロセッサを、任意の適切なフォーマットの回路網を使用して実装することができる。
【００４９】
さらに、コンピュータを、ラックマウントコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、またはタブレットコンピュータなど、複数の形のいずれかで具現化することができることを理解されたい。さらに、コンピュータを、ＰＤＡ（携帯情報端末）、スマートホン、または任意の他の適切なポータブルもしくは固定の電子デバイスを含む、一般にコンピュータとはみなされないが、適切な処理能力を有するデバイス内に組み込むことができる。
【００５０】
また、コンピュータは、１つまたは複数の入力デバイスおよび出力デバイスを有することができる。これらのデバイスを使用して、とりわけ、ユーザインターフェースを提示することができる。ユーザインターフェースを提供するのに使用できる出力デバイスの例には、出力の視覚的提示のためのプリンタまたはディスプレイスクリーンと、出力の可聴提示のためのスピーカまたは他のサウンド生成デバイスとが含まれる。ユーザインターフェースに使用できる入力デバイスの例には、キーボードと、マウス、タッチパッド、およびディジタイジングテーブルなどのポインティングデバイスとが含まれる。別の例として、コンピュータは、音声認識を介してまたは他の可聴フォーマットで入力情報を受け取ることができる。
【００５１】
そのようなコンピュータを、ローカルエリアネットワーク、または企業ネットワークもしくはインターネットなどの広域ネットワークを含む、任意の適切な形の１つまたは複数のネットワークによって相互接続することができる。そのようなネットワークは、任意の適切な技術に基づくものとすることができ、任意の適切なプロトコルに従って動作することができ、無線ネットワーク、有線ネットワーク、または光ファイバネットワークを含むことができる。
【００５２】
また、本明細書で概要を示した様々な方法またはプロセスを、様々なオペレーティングシステムまたはプラットフォームのうちの任意の１つを用いる１つまたは複数のプロセッサ上で実行可能なソフトウェアとしてコーディングすることができる。さらに、そのようなソフトウェアを、複数の適切なプログラミング言語および／またはプログラミングツールもしくはスクリプティングツールのいずれかを使用して記述することができ、実行可能機械語コードまたはフレームワークもしくは仮想マシン上で実行される中間コードとしてコンパイルすることもできる。
【００５３】
これに関して、本発明を、１つまたは複数のコンピュータまたは他のプロセッサ上で実行されたとき、本発明の様々な態様を実装する方法を実行する１つまたは複数のプログラムがエンコードされたコンピュータ読取可能記憶媒体（または複数のコンピュータ読取可能媒体）（例えば、コンピュータメモリ、１つまたは複数のフロッピディスク、ＣＤ、光ディスク、ＤＶＤ（ディジタルビデオディスク）、磁気テープ、フラッシュメモリ、フィールドプログラマブルゲートアレイまたは他の半導体デバイス内の回路構成、あるいは他の非一時的な有形のコンピュータ記憶媒体）として実装することができる。１つまたは複数のコンピュータ読取可能記憶媒体を、その上に格納された１つまたは複数のプログラムを１つまたは複数の異なるコンピュータまたは他のプロセッサにロードして上で述べた本発明の様々な態様を実装することができるように、可搬とすることができる。本明細書で使用されるとき、用語「非一時的なコンピュータ読取可能記憶媒体」は、製品（すなわち、製造品）または機械と見なすことがきるコンピュータ読取可能媒体のみを包含する。あるいはまたはそれに加えて、本発明を、伝搬する信号など、コンピュータ読取可能記憶媒体以外のコンピュータ読取可能媒体として実装することができる。
【００５４】
用語「プログラム」または「ソフトウェア」は、本明細書では、包括的な意味で、上で述べた本発明の様々な態様を実装するようにコンピュータまたは他のプロセッサをプログラムするのに用いることができる、任意のタイプのコンピュータコードまたはコンピュータ実行可能命令のセットを指すのに使用される。さらに、この実施形態の一態様によれば、実行されると本発明の方法を実行する１つまたは複数のコンピュータプログラムは、必ずしも単一のコンピュータまたはプロセッサ上に存在する必要はなく、本発明の様々な態様を実装するように複数の異なるコンピュータまたはプロセッサの間でモジュラの形で分散され得ることを理解されたい。
【００５５】
コンピュータ実行可能命令は、１つまたは複数のコンピュータまたは他のデバイスによって実行される、プログラムモジュールなどの多数の形とすることができる。一般に、プログラムモジュールは、特定のタスクを実行するか特定の抽象データ型を実装する、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造体などを含む。典型的に、プログラムモジュールの機能性を、様々な実施形態で望み通りに組み合わせ、または分散させることができる。
【００５６】
本発明の様々な態様を、単独で、組み合わせて、または前述で説明される実施形態で具体的には述べられない様々な配置で使用することができ、したがって、その適用において、前述の説明または図面に示された詳細およびコンポーネントの配置に限定されない。例えば、一実施形態で説明される態様を、他の実施形態で説明される態様と任意の形で組み合わせることができる。
【００５７】
また、本発明を、その例を提供した方法として実施することができる。この方法の一部として実行される動作を、任意の適切な形で順序付けることができる。したがって、例示の実施形態において順次動作として示されている場合であっても、いくつかの動作を同時に実行することを含め、示されたものとは異なる順序で動作が実行される実施形態を構成することができる。
【００５８】
特許請求の範囲における、請求項の要素を修飾する「第１」、「第２」、「第３」などの順序単語の使用は、それ自体では、別の請求項の要素に対する請求項の要素の優先、優越、もしくは順序、または方法の行為が実行される時間的順序を意味するものではなく、単に、請求項の要素を区別するために、ある名前を有するある請求項の要素を（順序単語の使用を除いて）同一の名前を有する別の要素から区別するためのラベルとして使用される。
【００５９】
本明細書で使用される語法および用語法は、説明のためのものであって、限定するものとして考慮されるべきではない。「ｉｎｃｌｕｄｉｎｇ（含む）」、「ｃｏｍｐｒｉｓｉｎｇ（備える）」、または「ｈａｖｉｎｇ（有する）」、「ｃｏｎｔａｉｎｉｎｇ（含む）」、「ｉｎｖｏｌｖｉｎｇ（伴う）」およびその変形の本明細書での使用は、その後に列挙される項目およびその同等物ならびに追加項目を含むように意図されている。
【図１】
0006027020.tif 000012
【図２】
0006027020.tif 000013
【図３】
0006027020.tif 000014
【図４】
0006027020.tif 000015
【図５】
0006027020.tif 000016
【図６】
0006027020.tif 000017