(57)【特許請求の範囲】
【請求項１】
ターゲットプログラムの複数のコピーを実行する実行ステップと、
少なくとも１つの指定されたブレークポイントに対して前記複数のコピーによって生成される少なくとも１つの変数の値を比較することによって少なくとも１つのコピーにおけるフォールトを検出するステップとからなる、コンピューティングシステムにおいてフォールトトレランスを提供する方法において、
各コピーの実行は、インスツルメンテーションツールのユーザインタフェースと通信する対応するコントローラによって制御され、
少なくとも１つの変数およびブレークポイントは、前記インスツルメンテーションツールのユーザインタフェースにおいてユーザによって指定され、該インタフェースからコントローラへ通信されることにより、ターゲットプログラムコードの修正なしにフォールトが検出されることを特徴とする、コンピューティングシステムにおいてフォールトトレランスを提供する方法。
【請求項２】
与えられた１つのコピーにおいてフォールトが検出された場合に、別のコピーのチェックポイントをとり、該チェックポイントから新しいコピーをリスタートするステップをさらに有することを特徴とする請求項１に記載の方法。
【請求項３】
前記実行ステップは、ターゲットプログラムのそれぞれのコピーを相異なるマシン上で実行することを特徴とする請求項１に記載の方法。
【請求項４】
前記インスツルメンテーションツールのユーザインタフェースにおいて複数の変数および複数のブレークポイントの少なくとも一部をユーザに選択させるステップと、
各コントローラへ対応するコマンドを送るステップとをさらに有することを特徴とする請求項１に記載の方法。
【請求項５】
各ブレークポイントごとに、各コントローラは、前記インスツルメンテーションツール内の多数決処理メカニズムへ少なくとも１つの変数の値を報告することを特徴とする請求項１に記載の方法。
【請求項６】
前記多数決処理メカニズムは、前記インスツルメンテーションツールのユーザインタフェースのプロセスにおいて実装されることを特徴とする請求項５に記載の方法。
【請求項７】
前記多数決処理メカニズムは、１つまたは複数のコントローラにおいて実装されることを特徴とする請求項５に記載の方法。
【請求項８】
ターゲットプログラムの与えられたコピーの少なくとも１つの変数の報告された値が、ターゲットプログラムの他のコピーのものと異なる場合、該与えられたコピーはフォールトを含むと識別されることを特徴とする請求項１に記載の方法。
【請求項９】
前記少なくとも１つの変数は、ターゲットプログラムの制御フロー変数、ターゲットプログラムの出力関数にパラメータとして渡される変数、および、ターゲットプログラムの関数によって入力として使用されるかまたは該関数によって出力される変数、のうちの少なくとも１つを含むことを特徴とする請求項１に記載の方法。
【請求項１０】
ターゲットプログラムの複数のコピーを実行する少なくとも１つのマシンを有する、コンピューティングシステムにおいてフォールトトレランスを提供する装置において、
各コピーの実行は、インスツルメンテーションツールのユーザインタフェースと通信する対応するコントローラによって制御され、
少なくとも１つの指定されたブレークポイントに対して前記複数のコピーによって生成される少なくとも１つの変数の値を比較することによって少なくとも１つのコピーにおけるフォールトが検出され、
少なくとも１つの変数およびブレークポイントは、前記インスツルメンテーションツールのユーザインタフェースにおいてユーザによって指定され、該インタフェースからコントローラへ通信されることにより、ターゲットプログラムコードの修正なしにフォールトが検出されることを特徴とする、コンピューティングシステムにおいてフォールトトレランスを提供する装置。
【請求項１１】
前記装置は複数のマシンを含み、ターゲットプログラムのそれぞれのコピーは相異なるマシン上で実行され、前記インスツルメンテーションツールのユーザインタフェースは別のマシン上に実装されることを特徴とする請求項１０に記載の装置。
【請求項１２】
与えられたマシン上で与えられた１つのコピーにおいてフォールトが検出された場合に、前記ユーザインタフェースが実装されているマシンは、前記与えられたマシンとは別のマシンに対して、ターゲットプログラムのコピーのチェックポイントをとるよう指示し、該チェックポイントから新しいコピーをリスタートすることができるようにすることを特徴とする請求項１１に記載の装置。
【請求項１３】
前記ユーザインタフェースが実装されているマシンは、前記インスツルメンテーションツールのユーザインタフェースにおいて複数の変数および複数のブレークポイントの少なくとも一部をユーザに選択させ、他のマシン上の各コントローラへ対応するコマンドを送ることを特徴とする請求項１１に記載の装置。
【請求項１４】
各ブレークポイントごとに、各コントローラは、前記インスツルメンテーションツール内の多数決処理メカニズムへ少なくとも１つの変数の値を報告することを特徴とする請求項１０に記載の装置。
【請求項１５】
前記多数決処理メカニズムは、前記インスツルメンテーションツールのユーザインタフェースのプロセスにおいて実装されることを特徴とする請求項１４に記載の装置。
【請求項１６】
前記多数決処理メカニズムは、１つまたは複数のコントローラにおいて実装されることを特徴とする請求項１４に記載の装置。
【請求項１７】
ターゲットプログラムの与えられたコピーの少なくとも１つの変数の報告された値が、ターゲットプログラムの他のコピーのものと異なる場合、前記多数決処理メカニズムは、該与えられたコピーがフォールトを含むと識別することを特徴とする請求項１４に記載の装置。
【請求項１８】
前記少なくとも１つの変数は、ターゲットプログラムの制御フロー変数、ターゲットプログラムの出力関数にパラメータとして渡される変数、および、ターゲットプログラムの関数によって入力として使用されるかまたは該関数によって出力される変数、のうちの少なくとも１つを含むことを特徴とする請求項１０に記載の装置。
【請求項１９】
ターゲットプログラムの複数のコピーを実行する手段と、少なくとも１つの指定されたブレークポイントに対して前記複数のコピーによって生成される少なくとも１つの変数の値を比較することによって少なくとも１つのコピーにおけるフォールトを検出する手段とからなる、コンピューティングシステムにおいてフォールトトレランスを提供する装置において、
各コピーの実行は、インスツルメンテーションツールのユーザインタフェースと通信する対応するコントローラによって制御され、
少なくとも１つの変数およびブレークポイントは、前記インスツルメンテーションツールのユーザインタフェースにおいてユーザによって指定され、該インタフェースからコントローラへ通信されることにより、ターゲットプログラムコードの修正なしにフォールトが検出されることを特徴とする、コンピューティングシステムにおいてフォールトトレランスを提供する装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピューティングシステムに関し、特に、コンピューティングシステムにおいてフォールトトレランスを提供する技術に関する。
【０００２】
【従来の技術】
分散および非分散のいずれのコンピューティングシステムにおいても、プロセス障害やマシン障害のようなフォールト（故障）にシステムが耐えられるようにするメカニズムを提供することが必要とされることが多い。このようなフォールトトレランスメカニズムの最も重要な点は、一般に、エラー検出およびエラー回復である。従来、プロセス複製を多数決（投票、voting）とともに用いてエラー検出を実行し、チェックポインティングを用いてエラー回復を実行するコンピューティングシステムが実現されている。プロセス複製は一般に、与えられたターゲットプログラムの複数のコピーを異なるマシン上で実行するものであり、「Ｎバージョン」あるいは「Ｎモジュラ」プログラミングとも呼ばれる。プログラムの各コピーは、指定されたブレークポイントにおけるデータ値を返し、多数決プロセスを用いて、いずれかのプロセスあるいはマシンに障害があるかどうかを判定する。例えば、１つ以外のすべてのコピーから返されたデータが同一である場合、その１つのコピーに障害があると仮定することができる。このような障害の場合、正しく実行中のコピーのうちの１つを用いてチェックポイントをとり、障害のあるプロセスをそのチェックポイントからリスタートする。このような、およびその他の従来技術に関して詳細には、例えば、
・J. Long, W. K. Fuchs, and J. A. Abraham, “Forward recovery using checkpointing in parallel systems”, Proc. IEEE International Conference on Parallel Processing, pp.272-275, 1990
・D. K. Pradhan and N. H. Vaidya, “Roll-forward checkpointing scheme: A novel fault-tolerant architecture”, IEEE Transactions on Computers, 34(10):1163-1174, October 1994
・Algirdas A. Avizienis, “The Methodology of N-Version Programming”, in Michael R. Lyu, editor, Software Fault Tolerance, pp.23-46, John-Wiley & Sons Ltd., 1995
に記載されている。
【０００３】
【発明が解決しようとする課題】
従来のフォールトトレランス技法は一般に、上記のエラー検出および回復の機能を追加するために、ソースコードまたはバイナリ実行可能コードの修正を必要とする。このような修正は一般に、ターゲットプログラムの実行前に行われ、ユーザがファイルを編集するか、または、直接インスツルメンテーションソフトウェアを実行しなければならず、非効率的である場合が多い。さらに、エラーの検出をオペレーティングシステムに頼る従来技術は、オペレーティングシステム例外がトリガされないときにデータの完全性を保つことができないという欠点がある。他の従来の方式では、アルゴリズムに基づく検出方法を使用するが、これは一般に、多くのタイプのプログラムに適用可能なわけではない。
【０００４】
【課題を解決するための手段】
本発明は、間接ソフトウェアインスツルメンテーションという技法を利用して、コンピューティングシステムにおけるフォールトトレランスを実現する。実施例は、いくつかのコンピュータなどのマシンを含むシステムで実現される。与えられたターゲットプログラムの複数のコピーをシステム内の異なるマシン上で実行する。ターゲットプログラムのコピーを実行する各マシンは、そのコピーの実行を制御するコントローラを有する。コントローラはそれぞれインスツルメンテーションツールのユーザインタフェースと通信する。このインスツルメンテーションツールは別のマシン上に実装されることも可能である。ユーザは、インタフェースと対話して、モニタされる変数、すなわち、「多数決」される変数と、多数決が行われるブレークポイントと、多数決および回復パラメータなどの情報とを指定し、ツールは、対応するコマンドを各コントローラへ送信する。指定されたブレークポイントで相異なるコピーによって生成されたユーザ指定変数のうちの１つ以上の値を比較することによって、コピーのうちの１つにフォールトが検出される。与えられたブレークポイントにおいて、コントローラはこれらの値を多数決処理メカニズムに報告する。多数決処理メカニズムは、システムのいずれかのマシン上に実現することが可能である。多数決処理メカニズムは、フォールトが発生したかどうかを判定する。与えられたコピーにおいてフォールトが検出されると、フォールトがないと判定された別のコピーのチェックポイントをとり、新しいコピーがそのチェックポイントからリスタートされる。ユーザ指定情報に基づいてターゲットプログラムの各コピーの実行を制御するために別々のコントローラを使用することにより、ターゲットプログラムコードの修正なしに、フォールトが検出され、適当な回復アクションをとることが可能となる。他の実施例として、各コピーを実行するのに単一のマシンを使用するものや、一部のマシン上で複数のコピーを実行するものも可能である。
【０００５】
本発明は、ソースコードや実行可能コードの修正を必要とせずに、重要な（クリティカル）データのデータ完全性を保証する一般的なエラー検出および回復の技法を提供する一方で、フォールトトレラントな構成および動作のための高度な自動化および透過性を提供する。本発明は、多くのさまざまなタイプのプログラムでの使用に適している。さらに、本発明は、ソースコードがないか、あるいは、コードに関する最低限の情報しか入手できないアプリケーション（いわゆる「レガシー」アプリケーションを含む。）に対して、エラー検出を実行することができる。実施例で対処されるフォールトには、単一マシン上の過渡および固定ハードウェアフォールトや、いくつかのタイプのアプリケーションおよびオペレーティングシステムソフトウェアフォールトがあるが、他の実施例では他のタイプのフォールトトレランスを提供することも可能である。
【０００６】
【発明の実施の形態】
以下で、本発明について、例示的なコンピューティングシステムとともに説明する。しかし、理解されるべき点であるが、本発明は、特定のタイプのコンピューティングシステムでの使用に限定されるものではなく、むしろ、従来可能であったよりも効率的にフォールトトレランスを提供することが望まれる任意のコンピューティング環境あるいはアプリケーションに一般に適用可能である。ここで開示する技術は、ＬＡＮ（ｌｏｃａｌ  ａｒｅａ  ｎｅｔｗｏｒｋ）、ＷＡＮ（ｗｉｄｅ  ａｒｅａ  ｎｅｔｗｏｒｋ）、ＭＡＮ（ｍｅｔｒｏｐｏｌｉｔａｎ  ａｒｅａ  ｎｅｔｗｏｒｋ）、イントラネット、エクストラネット、および、インターネットのようなグローバルネットワークに接続されたコンピュータなどのマシンで利用可能である。本明細書で「プログラム」という用語は、コンピューティングシステムないのコンピュータなどのマシン上で実行されるいかなる種類の命令、コード、プロセス、スレッドなどをも含むものとする。「分散システム」という用語は、複数のコンピュータなどのマシンを含む任意のシステムを含むものとする。本明細書で「マシン」という用語は、コンピュータ、ワークステーションあるいはその他のタイプのデータ処理装置と、そのような装置のさまざまなコンポーネントとを含むものと理解すべきである。本明細書で「リモートマシン」という用語は一般に、別のマシンの代わりにプロセスを実行するコンピュータ、ワークステーションなどのデータ処理装置を指す。従って、本発明によるリモートマシンは、ホストマシンから地理的に離れている必要はない。「間接インスツルメンテーション」という用語は、インスツルメントされるターゲットプログラムのソースコードあるいは実行可能コードを直接に変更することなく実装可能なインスツルメンテーションを指す。「インスツルメンテーションツール」とは一般に、インスツルメンテーションプロセスの少なくとも一部を実装するソフトウェアプログラムのことである。「コントローラ」という用語は一般に、インスツルメンテーションツールのバックエンドに関連して本明細書で説明する機能を提供するソフトウェアプログラムなどのメカニズムを指し、バックエンド全体を指すためにも、バックエンドの要素を指すためにも用いられる。
【０００７】
ソフトウェアインスツルメンテーション（ｓｏｆｔｗａｒｅ  ｉｎｓｔｒｕｍｅｎｔａｔｉｏｎ）とは、一般に、プログラム実行中にプログラムのパフォーマンスのさまざまなモニタリングおよび分析を行うように設計された追加コード（インスツルメンテーションコードという。）を含むようにプログラムを修正するプロセスをいう。また、インスツルメンテーションとは、プログラムパフォーマンスのモニタリングおよび分析の他に、フォールトトレランスのための修正（例えばチェックポインティング（ｃｈｅｃｋｐｏｉｎｔｉｎｇ））や、フォールト注入のような他のアクティビティも含む。このように、インスツルメンテーションは一般に、機能を変更または追加するようにターゲットプログラムを修正することを含む。例えば、インスツルメンテーションコードは、与えられた入力のセットでプログラムが実行されるときに特定の分岐が成立するか否かに関する指標を提供するため、あるいは、フォールト位置における支援のために実行中のプロセッサに割り込むために用いられる。
【０００８】
図１に、本発明によりフォールトトレランスを提供するために用いられる間接インスツルメンテーションソフトウェアツールの全体的アーキテクチャを示す。この実施例は、ユーザマシン１２およびリモートマシン１４を含む分散システム１０において実装される。ユーザマシン１２とリモートマシン１４は通信媒体１５を通じて通信する。通信媒体１５は、本実施例では、ウェブ埋込みアプリケーション層１６および従来のＴＣＰ／ＩＰ(Transmission Control Protocol/Internet Protocol)層１８を含む。ウェブ埋込みアプリケーション層１６は、ＴＣＰ／ＩＰ層１８とともに動作するように設定された適当なメッセージパッシングメカニズムとすることが可能である。例示的なウェブ埋込みアプリケーション層に関してさらに詳細には、本出願と同日に出願される同一出願人の特許出願番号０９／１００，８２７（発明の名称：「ソフトウェアインスツルメンテーション方法」）に記載されている。代替実施例では他のタイプの通信媒体も使用可能である。さらに、他の間接インスツルメンテーションの実施例は、単一のマシン、あるいは、３個以上のマシンを用いて実装することも可能である。
【０００９】
間接インスツルメンテーションソフトウェアツールは、「フロントエンド」部分と「バックエンド」部分を有する。フロントエンドはユーザマシン１２上に実装され、特に、「作成」グラフィカルユーザインタフェース（ＧＵＩ）２０を有する。フロントエンドは、例えば、Ｊａｖａ対応コンピュータなどの適当なマシン上で実行可能なＪａｖａアプレットとすることが可能である。バックエンドはリモートマシン１４上に実装され、ターゲットプログラム２２（すなわち、インスツルメントされるべきプログラム）と、ターゲットプログラム２２に対してインスツルメンテーションを実行するバックエンドソフトウェア２４という２つのソフトウェアプロセスを有する。以下で詳細に説明するように、バックエンドソフトウェア２４は、複数のプロセスおよびスレッドからなることが可能である。ターゲットプログラム２２内で、要素２５は、ターゲットプログラムの制御フロー実行を表し、要素２６は、ターゲットプログラムのデータ空間を表す。バックエンドソフトウェア２４はコントローラ２７を有する。フロントエンドは、ユーザと、ターゲットプログラム２２を制御するバックエンドソフトウェア２４との間のインタフェースを提供する。フォールトトレラントコンピューティングの実施例では、フロントエンドは、多数決機能および複数のバックエンドの調整を行うようにも作用する。フロントエンドのＧＵＩ２０は、詳細には図３および図４に関して後述するように、好ましくは、ポイントしてクリックすること（ポイント・アンド・クリック）により駆動され、プルダウンメニュー、ウィンドウ、リスト、ボタン、およびテキストフィールドを有する。
【００１０】
リモートマシン１４上で実行されるコントローラ２７は、ターゲットプログラム２２の制御フローを指示し、プログラム２２が実行されるときのプログラム２２の内部状態への観測可能性を提供する。コントローラ２７は、ターゲットプログラムに対して、任意の時点における実行の開始、中断、および終了を指示する能力を有する。また、コントローラ２７は、静的および動的なデータならびにプロセッサレジスタを含む、ターゲットプログラムの全データ空間を観察し操作することも可能である。コントローラ２７は、デバッガ（例えば、従来のｇｄｂあるいはｄｂｘデバッガ）や、オペレーティングシステムによって提供される低レベルファシリティ（例えば、ＵＮＩＸにおける従来のｐｔｒａｃｅファシリティや／ｐｒｏｃファイルシステム）を有することが可能である。これは、直接にターゲットプログラム２２を制御しターゲットプログラム２２と通信するバックエンドの一部として作用する。実施例では、コントローラ２７は、ｇｄｂデバッガ（Ｒ．  Ｍ．  Ｓｔａｌｌｍａｎ，  ”Ｄｅｂｕｇｇｉｎｇ  ｗｉｔｈ  ＧＤＢ：  ｔｈｅ  ＧＮＵ  Ｓｏｕｒｃｅ−Ｌｅｖｅｌ  Ｄｅｂｕｇｇｅｒ”，  ４．１２  ｅｄｉｔｉｏｎ，  Ｊａｎｕａｒｙ  １９９４、に記載）を有すると仮定する。コントローラ２７で使用するための代替物も存在するが、ｇｄｂは、所望の機能を提供し、広くテストされ、多くのプラットフォームに移植されている。コントローラ２７によれば、間接インスツルメンテーションの自動化が可能となり、ハンドコーディングされるインスツルメンテーションコードの量が最大限可能な限り削減される。インスツルメンテーションツールのユーザは、主にフロントエンドのＧＵＩ２０と対話し、一方、インスツルメンテーションはバックエンドのコントローラ２７によって実行される。間接インスツルメンテーションソフトウェアツールのこの分散構成により、従来のソフトウェアインスツルメンテーションよりも有用性が拡大し、以下で説明するように分散ソフトウェアフォールトトレランスの実装が可能となる。
【００１１】
注意すべき点であるが、本実施例のインスツルメンテーションツールは、デバッガをその構成要素の１つとして有するコントローラを含むが、ツール自体は、一般にデバッガにはない追加機能を提供する。デバッガは一般に、ブレークポイントの管理、ブレークポイントに遭遇したときのデバッガコマンドの実行、および、変数の値の印字および修正のような、多くの低レベルタスクを実行することが可能である。これに対して、本実施例のインスツルメンテーションツールは、自動化され、透過的で、しかも分散方式で必要なすべてのタスクを実行するようにコントローラ２７内のデバッガを設定する。さらに、このインスツルメンテーションツールは、デバッガのみでは実行不可能なタスクを実行するために、ターゲットプログラム２２にユーザ指定コードを組み込んで実行する能力を追加する。また、このインスツルメンテーションソフトウェアツールは、例えば、指定されたイベントが発生したときに前述のユーザ指定コードをトリガする自動化フィードバックメカニズムのような、他の独自の機能も提供する。
【００１２】
図２に、図１のインスツルメンテーションツールの２つの動作モードを示す。前述のように、インスツルメンテーションツールは、作成ＧＵＩ２０を提供することによってターゲットプログラム２２のインスツルメンテーションをサポートする。インタラクティブ（対話）動作モードにおいて、作成ＧＵＩ２０は、ユーザが、カスタマイズされた「作成対象」ＧＵＩ（作成されるＧＵＩ）３０を作成することを可能にし、作成対象ＧＵＩ３０は、図示のようにバックエンド２８に接続する。作成ＧＵＩ２０および作成対象ＧＵＩ３０はいずれも、インスツルメンテーションツールのフロントエンド部分に関連づけられ、実施例のユーザマシン１２上で動作する。バックエンド２８は、コントローラ２７を含むバックエンドソフトウェア２４を有し、リモートマシン１４上に実装される。ユーザが作成ＧＵＩ２０と対話する間、作成対象ＧＵＩ３０は、必要に応じて直ちに調べて修正することができる別のウィンドウ内に形成される。作成ＧＵＩ２０は、バックエンド２８に対してターゲットプログラム情報を要求し（破線で示す）、バックエンド２８はこれに応答して、作成対象ＧＵＩ３０へ、要求された情報を送る（実線で示す）。ユーザが、インスツルメンテーションおよび作成対象ＧＵＩ３０に満足すると、作成対象ＧＵＩ３０の最終バージョンを、スタンドアロン動作モード用に生成することができる。スタンドアロン動作モードでは、このバージョンを、作成ＧＵＩ２０とは独立に実行することができる。このスタンドアロン動作モードでは、作成対象ＧＵＩ３０は、ターゲットプログラム実行中にバックエンド２８に対して直接にターゲットプログラム情報を要求し（破線で示す）、バックエンド２８はこれに応答して、作成対象ＧＵＩ３０へ、要求された情報を送る（実線で示す）。ユーザは、一般に、まずインタラクティブモードに入って作成対象ＧＵＩ３０を調整した後、結果として得られる作成対象ＧＵＩ３０をスタンドアロンモードで実行する。
【００１３】
図３および図４と、図５に、それぞれ、本発明による作成ＧＵＩ２０および作成対象ＧＵＩ３０の例を示す。図３および図４の作成ＧＵＩ２０は、ソースリスティング（ｓｏｕｒｃｅ  ｌｉｓｔｉｎｇ）ウィンドウ４０、関数リスト（ｆｕｎｃｔｉｏｎ  ｌｉｓｔ）４２、グローバル変数リスト（ｇｌｏｂａｌ  ｖａｒｉａｂｌｅ  ｌｉｓｔ）４４およびローカル変数リスト（ｌｏｃａｌ  ｖａｒｉａｂｌｅ  ｌｉｓｔ）４６を含む。関数リスト４２から選択された関数は、リスト４２において強調表示され、図示のようにテキストフィールド５２に表示される。選択された関数の対応するグローバル変数およびローカル変数は、それぞれのグローバル変数リスト４４およびローカル変数リスト４６に表示され、一方、その関数のソースコードがソースリスティングウィンドウ４０に表示される。メーター（Ｍｅｔｅｒ）ウィジェットボタン５４、テキストフィールド（ＴｅｘｔＦｉｅｌｄ）ウィジェットボタン５６およびテキストエリア（ＴｅｘｔＡｒｅａ）ウィジェットボタン５８のようないくつかのボタンが設けられる。これらのボタンにより、ユーザは、作成対象ＧＵＩ３０に現れることになる個々のウィジェットを指定することができる。例えば、メーターウィジェットボタン５４を用いて、作成対象ＧＵＩ３０内に視覚的に認識されるフォーマットでモニタされる特定の変数を指定することが可能である。このようなフォーマットの１つは水平バーであり、その長さが、対応する変数の値に比例する。他のタイプのウィジェットには、例えば、パイチャート（円グラフ）ウィジェット、タイムラインウィジェットなどがある。これらおよびその他のウィジェットクラスは、ユーザが拡張可能な基本グラフィカルウィジェットライブラリに含めることができる。
【００１４】
図３および図４には図示しないが、作成ＧＵＩ２０に、いくつかのプルダウンメニューを設けることが可能である。例えば、作成ＧＵＩ２０は、ターゲットプログラムのロード、実行、割込み、定期的割込み、あるいは終了のコマンドのような、ターゲットプログラムに全体的に関係するコマンドのメニューを含むことが可能である。別のメニューには、ソースコード行に対応するブレークポイントを設定するためのコマンドや、ユーザ定義関数に対するトリガメカニズムを指定するコマンドのような、インスツルメンテーションコマンドを提供することが可能である。こうして、作成ＧＵＩ２０により、ユーザは、インスツルメンテーションツールによって提供されるインスツルメンテーション動作を選択し設定することができる。例えば、プルダウンメニューから選択された特定のインスツルメンテーションコマンドがユーザ指定パラメータを要求する場合、ユーザは、キーボードによりそのパラメータを対応するテキストフィールドに入力することができる。作成ＧＵＩ２０のウィンドウおよびリストに表示されるターゲットプログラム情報は、前述のように、作成ＧＵＩ２０からバックエンドに対して要求されることが可能である。
【００１５】
図５の作成対象ＧＵＩ３０は、作成ＧＵＩ２０においてユーザによって指定されたブレークポイントアクション（ｂｒｅａｋｐｏｉｎｔ  ａｃｔｉｏｎ）をリストするウィンドウ６０と、ブレークポイントアクションあるいは他のユーザ指定インスツルメンテーションに応答してバックエンドから受け取った通知（ｎｏｔｉｆｉｃａｔｉｏｎ）をリストするウィンドウ６２を有する。作成対象ＧＵＩ３０はさらに、選択された変数ｉ、ｌｅｎおよびｔｉｍｅ＿ｐｔｒの現在の状態をそれぞれ指定する変数ウォッチ（ｖａｒｉａｂｌｅ  ｗａｔｃｈ）ウィンドウ６４、６６および６８のセットを有する。注意すべき点であるが、これらの選択された変数は、選択されたターゲットプログラムの場合の例示的なものであり、他の型の変数もモニタすることが可能である。変数ウォッチウィンドウは、図３および図４の作成ＧＵＩ２０内のメーターウィジェットボタン５４を用いて指定することが可能なメーターウィジェットの例である。こうして、作成対象ＧＵＩ３０は、作成ＧＵＩ２０から生成されたユーザ指定インスツルメンテーションの表示を行う。前述のように、作成対象ＧＵＩ３０はスタンドアロンモードで実行することが可能である。このモードで、作成対象ＧＵＩ３０は、バックエンドと対話して、ターゲットプログラムの実行時に、ターゲットプログラムに関する必要な情報を取得する。このように、ユーザは、作成ＧＵＩ２０のインスツルメンテーション生成機能を用いて、カスタマイズされた作成対象ＧＵＩ３０を生成し、作成対象ＧＵＩ３０がバックエンドと対話してインスツルメンテーションに必要なターゲットプログラム情報を提供するようにする。
【００１６】
図６に、インスツルメンテーションツールの例示的なフロントエンド１００を詳細に示す。フロントエンド１００は、前述の作成ＧＵＩ２０および作成対象ＧＵＩ３０を有する。作成対象ＧＵＩ３０は、テキストエリアコード３０Ａ、メーターウィジェットコード３０Ｂおよびテキストフィールドコード３０Ｃを有する。コード３０Ａ、３０Ｂおよび３０Ｃのセットは、図５に示した作成対象ＧＵＩ３０のグラフィカル表示の対応部分を生成するためのものである。コード３０Ａ、３０Ｂおよび３０Ｃのセットのグラフィカル出力は、ユーザがＧＵＩ３０の一部として特定のウィジェットを使用すると決めたかどうかに応じて、作成対象ＧＵＩ３０の一部として表示される。フロントエンド１００はさらに、フロントエンド１００とバックエンドの間の通信を実装するＰＣＰ（Ｐｒｉｓｍ  Ｃｏｍｍｕｎｉｃａｔｉｏｎｓ  Ｐｒｏｔｏｃｏｌ）要素１０２と、通信媒体１５を通じてバックエンドからの通信を受け取るバックエンドリスナ１０４とを有する。
【００１７】
図７に、例示的なバックエンド２８を詳細に示す。要求されるさまざまな作業を処理するために、本実施例におけるバックエンドはいくつかのコンポーネントに分割される。これらのコンポーネントは一般に並列に実行され、フォーク（ｆｏｒｋ）されたプロセスとして実行されるものも、スレッドとして実行されるものもある。コンポーネント自体が追加プロセスをフォークしなければならない場合を除いては、可能な限りスレッドが用いられる。複数のスレッドが、同じメモリ空間を共有し、単一のプロセスを形成することも可能である。図７で、太実線矢印は、与えられたプロセスのフォークを示し、細実線矢印は、与えられたプロセスのスレッドを示し、破線矢印は通信を示す。本実施例におけるバックエンド２８は、動作を制御するｍａｉｎプロセス１１０を有する。デバッガプロセスｇｄｂおよび別のプロセスｓｕｒｒｏｇａｔｅは、ｍａｉｎプロセスからのフォークとして開始され、ｒｅａｄｇｄｂ、ｒｅａｄｗｅａｓｌおよびｒｅａｄｓｕｒｒｏｇａｔｅはｍａｉｎプロセスのスレッドである。ｒｅａｄｇｄｂスレッドは、ｇｄｂプロセスから情報を読み出すことを担当し、ｒｅａｄｗｅａｓｌスレッドは、通信媒体１５から情報を読み出すことを担当し、ｒｅａｄｓｕｒｒｏｇａｔｅスレッドは、ｓｕｒｒｏｇａｔｅプロセスから情報を読み出すことを担当する。ｇｄｂプロセスは、ｇｄｂプロセスからのフォークとして開始されるｔａｒｇｅｔプロセスによって図示されるように、バックエンド２８によって行われるデバッガ動作を制御する。ｓｕｒｒｏｇａｔｅプロセスは、ｓｕｒｒｏｇａｔｅプロセスからのフォークとして開始されるａｃｔｉｏｎプロセスによって図示されるように、バックエンド２８によって行われるアクションを制御する。
【００１８】
前述のように、バックエンド２８は、ターゲットプログラムに対するコントローラとして作用する。フロントエンド１００からのすべての要求はバックエンドによって処理され、ターゲットプログラム２２からフロントエンドへのすべての出力はバックエンドによって転送される。このように、本実施例におけるバックエンドは、フロントエンドとターゲットプログラムの間の唯一のインタフェースである。バックエンドがターゲットプログラムに対して実行する動作は、間接インスツルメンテーションの基礎を構成する。ターゲットプログラムとフロントエンドの間のインタフェースとして作用することに加えて、バックエンドは、他の重要な機能も実行する。第１に、バックエンドのアクションは、所望のトリガ条件に遭遇したときに実行されるようにユーザが指定することが可能である。このアクションは、計算を実行すること、ターゲットプログラム変数値を含むターゲットプログラムの実行を変更すること、出力をフロントエンドに送ること、別のプログラムを起動すること、あるいは他の機能を実行することを行う。アクションを実装することに加えて、バックエンドは、固有の内部カウンタを含み、ターゲットプログラム変数以外の変数として使用することが可能である。これらのバックエンドのアクションおよびカウンタは非常に強力であり、ターゲットプログラムの実行を多くの方法で変更する能力を提供する。バックエンドによってサポートされるアクション、および、それらのアクションに対応するトリガについては、前掲の同日の米国特許出願番号０９／１００，８２７に詳細に記載されている。
【００１９】
本発明によれば、上記のインスツルメンテーションツールを用いて、コンピューティングシステムにおけるフォールトトレランスを提供することが可能である。間接インスツルメンテーションは、ユーザに対して高度の透過性および自動化を提供するような方法で、プログラムに機能を追加するのに有用である。これは特に、明示的なフォールトトレランス能力を有するように開発されなかったプログラムにフォールトトレランスを追加する場合に成り立つ。間接インスツルメンテーションにより、このような非フォールトトレラントプログラムは、作成ＧＵＩを通じての数分間の設定の後に、フォールトトレラントモードで実行することができる。エラー検出や回復ソフトウェアは主にコントローラプログラム内に含まれるため、ソースコード修正や再コンパイルは不要である。本発明はソースコードへのアクセスが不要である点に注意すべきである。このことは、いわゆる「レガシー」コードであっても、本発明の技法を用いてフォールトトレラントにすることが可能であることを意味する。ターゲットプログラムソースコードが入手可能でない場合、インスツルメンテーションは、ターゲットプログラムに付属するシンボルテーブルを用いて実行することができる。シンボルテーブルが入手可能でない場合、ターゲットプログラムへのすべての参照は仮想アドレスに関して行うことが可能である。
【００２０】
本発明による間接インスツルメンテーションに基づくフォールトトレランスは、明示的に選択された重要な（クリティカル）データのデータ完全性を保つ一般的に適用可能なエラー検出を提供することが可能である。以下で説明する実施例で対処されるフォールトのタイプには、過渡あるいは固定ハードウェアフォールトのすべての単一発生と、動作環境におけるエラー条件を引き起こすソフトウェアフォールトがある。本実施例では検出されないフォールトには、通信フォールトや、内部値エラーしか引き起こさない他のソフトウェアフォールトがある。
【００２１】
図８に、本発明によるフォールトトレランスを有するコンピューティングシステムの実施例を示す。この実施例は、フロントエンド１００と、３個のバックエンド２８−１、２８−２および２８−３（バックエンド１、バックエンド２およびバックエンド３とも表す。）を有する。フロントエンド１００および３個のバックエンド２８−ｉはそれぞれ、上記のように構成することが可能である。この例では、フロントエンド１００およびバックエンド２８−ｉはそれぞれ相異なるマシンに対応すると仮定するが、これは本発明の要件ではない。フロントエンドおよびバックエンドを相異なるマシンに配置することは、各バックエンドに対するパフォーマンスとエラー閉込めを最大化する。他の実施例では、１つまたは複数のフロントエンド１００と、バックエンド２８−ｉを同じマシン上に実装することも可能である。前述のように、フォールトトレランスの最も重要な点は一般に、エラー検出およびエラー回復である。図８の実施例におけるエラー検出は、与えられたターゲットプログラムの、３個のマシン上の複製により実現される。ターゲットプログラムの各コピーは、３個のマシン上のそれぞれのバックエンド２８−ｉによって制御される。これらのバックエンドは単一のフロントエンド１００と通信する。フロントエンド１００は、バックエンド２８−ｉのコーディネータ（調整者）として作用し、コピーが実行されるときにターゲットプログラムの相異なるコピー間の不一致を判定する。検出されたエラーからの回復は、以下で説明するチェックポインティングおよびリスタートのメカニズムにより実現される。
【００２２】
動作時に、ターゲットプログラムの各コピーは、最初のプログラム命令のはじめに一時的に中断される。この時点で、ユーザは、フロントエンド１００の作成ＧＵＩを用いて、所望の多数決パラメータ（例えば、多数決されるべき変数と、多数決回数）と回復パラメータを選択する。他の実施例では、これらおよびその他の同様のパラメータのサブセットのみがユーザによって指定される。次に、フロントエンド１００は、対応するコマンドを各バックエンド２８−ｉへ送る。上記のフロントエンド作成ＧＵＩは、多数決パラメータおよび回復パラメータのユーザによるこの指定を可能にするように容易に修正することが可能である。適当なブレークポイントがバックエンド２８−ｉによって挿入された後、ターゲットプログラムのすべてのコピーの実行は再開される。各ブレークポイントに対して、各バックエンド２８−ｉは、あらかじめ選択された重要な（クリティカル）変数の値をフロントエンド１００に報告する。フロントエンド１００は、すべての報告された値が同一であると判定した場合、各バックエンド２８−ｉに対して、ターゲットプログラムのコピーの実行を継続するよう指示する。
【００２３】
図９に、フロントエンド１００がバックエンド２８−ｉから報告された値に相違を検出した場合を例示する。少数派の値のバックエンドはエラーのあるバックエンドであると識別され、対応するマシン上のターゲットプログラムの実行は停止される。この例におけるエラーのあるバックエンドはバックエンド２（２８−２）である。次に、エラーのないバックエンドのうちの１つ（例えば、バックエンド１（２８−１））からチェックポイントをとり、そのチェックポイントデータを、エラーのあるバックエンド、すなわち、バックエンド２（２８−２）を有するマシンにコピーし、そのチェックポイントデータを用いて、バックエンド２上で新たなターゲットプログラムを起動する。このようにして、チェックポインティング回復メカニズムによりエラーは検出され訂正される。
【００２４】
この実施例では、エラーが検出されたときにのみチェックポイントがとられ、これは比較的稀にしか起こらないはずである点に注意すべきである。しかし、代替実施例では、定期的チェックポインティングのような他のタイプのチェックポインティングを利用することも可能である。本実施例におけるフロントエンド１００は、複製されたバックエンド２８−ｉから収集されるデータに対する多数決カウンタとして作用する。フロントエンド１００によって利用される多数決管理コードは、バックエンドの同期のための管理コードを含むことが可能である。回復については、ｌｉｂｃｋｐチェックポインティングパッケージ（Ｙ．−Ｍ．  Ｗａｎｇ，  Ｙ．  Ｈｕａｎｇ，  Ｋ．−Ｐ．  Ｖｏ，  Ｐ．−Ｙ．  Ｃｈｕｎｇ，  ａｎｄ  Ｃ．  Ｋｉｎｔａｌａ，  ”Ｃｈｅｃｋｐｏｉｎｔｉｎｇ  ａｎｄ  Ｉｔｓ  Ａｐｐｌｉｃａｔｉｏｎ”，  Ｐｒｏｃ．  ２５ｔｈ  Ｆａｕｌｔ−Ｔｏｌｅｒａｎｔ  Ｃｏｍｐｕｔｉｎｇ  Ｓｙｍｐｏｓｉｕｍ，  ｐｐ．２２−３１，  １９９５、に記載）を用いて、エラーがあると判定されたターゲットプログラムプロセスのリスタートおよび移動を行うことが可能である。任意個数のバックエンド、従ってターゲットプログラムの任意個数のコピーをサポートすることが可能であるが、図８の実施例におけるエラー検出を実行するには少なくとも３個のバックエンドが一般に必要である。
【００２５】
上記の実施例における実際の多数決処理は報告された値の直接比較に基づくことが可能であるが、解決すべきいくつかの問題点がある。例えば、ターゲットプログラムのコピーは一般に独立に実行される。従って、値が報告されるときにターゲットプログラムのすべてのコピーが同一の論理実行ポイントにあることを保証する同期メカニズムが必要となることがある。この同期を保証する１つの簡便な方法は、すべてのコピー内の同じアドレスにブレークポイントを挿入することである。これらのブレークポイントは、最後のコピーがブレークポイントに到達するまですべてのコピーが待機しなければならないという一種のバリア同期として作用する。さらに、多数決処理は、決定性のデータ、従って、すべてのコピーで同一であることが保証されるデータに対してのみ実行されるべきである。これは、通常、マシン名、非グローバルクロック時間、および動的仮想アドレスのようなデータを排除する。データは、標準化されたフォーマットでフロントエンド１００に送らなければならない。バックエンドコントローラプログラムとしてデバッガを使用することは、データを標準化する簡便な方法を提供する。ターゲットプログラムのシンボリック情報が入手可能な場合、多数決されるべきデータは変数名として指定することが可能である。そうでない場合でも、データは、仮想アドレスで指定することが可能である。
【００２６】
実施例における複製された入出力は、例えば、入力をすべての複製されたターゲットプログラムにコピーし、プライマリと指定された１つのバックエンド以外のバックエンドからの出力を捨てることによって処理することが可能である。このタイプの入出力（Ｉ／Ｏ）管理は、すべてのｒｅａｄ（）およびｗｒｉｔｅ（）システムコールをトラップすることによって実行可能である。しかし、このようなｒｅａｄ（）／ｗｒｉｔｅ（）方式は一般に、メモリマップドＩ／Ｏおよびｉｏｃｔｌ（）コールを処理しない。実施例におけるＩ／Ｏ管理を提供するために他の適当な技術を使用することも可能である。
【００２７】
また、チェックポインティングに関してもいくつかの問題を考慮すべきである。チェックポイントされたプロセス状態をファイルに保存し、チェックポイントされたデータファイルから新しいプロセスをリスタートするコードは、ターゲットプログラムの一部であることも可能であり、あるいは、ターゲットプログラムの外部に存在することも可能である。チェックポイントコードをターゲットプログラムの一部にする場合、ソースコード修正、コンパイル時リンク、または実行時（ランタイム）リンクによって、もとのターゲットプログラムに統合することが可能である。チェックポイントコードがターゲットプログラムの外部にある場合、インスツルメンテーションとは全く別個のチェックポインティングパッケージを用いてチェックポイント動作を実行することも可能であり、あるいは、バックエンドコントローラを用いてチェックポイント動作を実行することも可能である。後者の選択肢は、チェックポイントされたデータを標準の中間フォーマットでシンボリック情報を用いて保存する場合には特に、プラットフォーム独立性が高くなり有利である。
【００２８】
新たにリスタートされたターゲットプログラムのコピーは、もとのターゲットプログラムのコピーと同期するべきである。これは、チェックポイントコードがターゲットプログラムに統合されている場合には特に重要となる。その場合、リスタートされたターゲットプログラムのコピーと、チェックポイントされたターゲットプログラムは、いずれもコードを非対称に実行することになる。リスタートされたコピーは、必ずしも他のコピーと同じ位置からリスタートする必要はない。リスタートされたコピーは、到達する次の多数決ポイントが他のコピーと同一になるような位置からリスタートすればよい。これは、ターゲットプログラムの新たなコピーをリスタートするときに、多数決ブレークポイントのセットを保つべきであることを意味する。
【００２９】
ターゲットプログラムをリスタートするのに使用するマシンを指定するポリシーを設定することが可能である。例えば、ターゲットプログラムの新たなコピーは、Ｘ回という最大リスタートしきい値（ただしＸ≧０）までは同じマシン上でリスタートすることが可能である。ターゲットプログラムが別のマシン上でリスタートされる場合、チェックポイントファイルをその新しいマシンにコピーしなければならない。このマシンは、コピーされたチェックポイントファイルを用いてターゲットプログラムをリスタートすることができるためには、障害のあるマシンと十分に類似していなければならない。
【００３０】
図１０は、図７のフォールトトレランス実施例に対するイベントの系列の例を示す図である。バックエンド２８−ｉのうちの２つと、フロントエンド１００に対するイベントを表す３本のタイムラインが示されている。図８の構成には２つより多くのバックエンドが存在するが、そのうちこの例のタイムラインに情報が表示されているのは、エラーが生じるバックエンド（例えばバックエンド２（２８−２））と、回復に用いられるチェックポイントを生成するバックエンド（例えばバックエンド１（２８−１））の２つのみである。繰り返すイベントに関する添字はＴｘｉ＿ｊの形式である。ここで、ｘはイベントのタイプであり、ｉはバックエンドを識別し、ｊは、各バックエンドのイベントを区別する。縦の破線は、同時に起こるイベントを示す。なお、この図は一定の縮尺に従っているわけではない。
【００３１】
フォールトがバックエンド２で起こり、このフォールトは、多数決のために選択されたデータ変数の値に影響を及ぼすと仮定する。このフォールトの発生は図９ではＸで示されている。フォールトの発生後、バックエンドはすべて時刻Ｔｐｉ＿ｊに停止して、データをフロントエンド１００へ送る。このとき、多数決は、フォールトのために全体一致ではない。少なくとも３個のバックエンドが多数決に参加した場合、フォールトのない２個のバックエンドがフロントエンドへ同じデータ値を提示するはずである。このようにして、フロントエンドは、どのバックエンドにエラーがあるかを判定することができる。その後、回復プロセスが開始される。フロントエンドは、エラーのないバックエンドのうちの１つに対して、そのバックエンドの状態のチェックポイントをチェックポイントファイルの形で生成するよう指示する。図１０では、バックエンド１が時刻Ｔｃｋｐ１＿１にその状態のチェックポイントをとる。フロントエンドは、チェックポインティングが完了するのを待機する。バックエンド１とバックエンド２が異なるマシン上に存在する場合、チェックポイントファイルはバックエンド１のマシンからバックエンド２のマシンにコピーされる。次に、フロントエンドは、バックエンド２に対して、フォールトのあるターゲットプログラムを停止し、チェックポイントファイルを用いて新たなターゲットプログラムをリスタートするよう指示する。新たなターゲットプログラムが、フォールトのないターゲットプログラムと同じ状態に到達した後、フロントエンドは、時刻Ｔｃｉ＿ｊに、継続コマンドをすべてのバックエンドに与える。リスタートポリシーに応じて、既に最大リスタートしきい値に到達している場合、バックエンド２全体が停止され、他のマシン上でリスタートされる。ターゲットプログラムの新たなコピーもその新たなマシン上でリスタートされる。
【００３２】
バックエンド２で生じたフォールトが、多数決ブレークポイントに到達することができないようにしてターゲットプログラムに影響を及ぼす場合、フロントエンドは、最大待機しきい値に到達するまで待機した後、バックエンド２にエラーがあると宣言する。その後、上記と同じ回復プロセスが開始される。このタイプのフォールトは、ターゲットプログラムのクラッシュ、不確定なハング、あるいは、正しい多数決ブレークポイントに遭遇せずに実行が継続することを引き起こすことがある。最後の場合、別の多数決ブレークポイントに遭遇すれば、フロントエンドはやはりエラーが生じたと判定する。
【００３３】
この実施例のエラー検出および回復技法は、過渡的であるか固定的であるかにかかわらず、ハードウェアフォールトのすべての単一発生に対処することができる。固定フォールトは、リスタートを、フォールトのないマシンに移動させる。「単一フォールト発生」の場合、第１のフォールトによって開始される回復プロセスが完了するまで第２のフォールトは発生しない。また、ある種のソフトウェアフォールトにも対処することができる。このようなソフトウェアフォールトは、ターゲットプログラムの外部の環境におけるエラーを引き起こし、これによってターゲットプログラム内のシステムコールが異なる値を返したり、プログラム終了を引き起こしたりする。例えば、ターゲットプログラムにおけるメモリリークが最終的に追加メモリの要求を引き起こし、その後、未割当てメモリへのアクセスがオペレーティングシステムによって検出される不正メモリアクセスエラーを引き起こすときにプログラム終了が起こることがある。もちろん、多数決パラメータの選択は非常に重要である。多数決を受けるデータは、ターゲットプログラム内の「重要な（クリティカル）」変数のセットを含むことが可能である。以下は、そのような変数の例である。
【００３４】
制御フロー：
分岐あるいはループの条件部分の変数のような、制御フローに関する変数。
プログラム出力：
視覚的出力、ファイル出力、およびプロセス間出力を含む出力関数へのパラメータとして渡される変数。
アルゴリズム入出力：
アルゴリズムおよび関数により入力として用いられる変数、あるいは、それらにより出力される変数（例えば、行列演算の入出力行列）。
【００３５】
図８のフロントエンド１００は、１つの障害ポイントとなる可能性があるため、その信頼性を高めるためにいくつかのアプローチが可能である。例えば、自己検査および回復のコードを外部ウォッチドッグメカニズムとともにフロントエンド１００に追加して、フロントエンドが動作し続けることを保証することが可能である。別の例として、単一のフロントエンドプロセスを、冗長多数決構成で複製することも可能である。しかし、これは、複数の複製されたフロントエンドプロセス間に分散コンセンサスを必要とする。バックエンド間の分散コンセンサスに基づく多数決を用いて、フロントエンド多数決処理の必要性をすべてなくすことも可能である。
【００３６】
上記のフォールトトレランス技法は、フォールト注入を用いて実装されテストされた。フォールト注入テストは、目的とするフォールトに対処するのに上記の技法が有効であることを示したが、パフォーマンスに影響がある。図１０の例において、以下のようなパフォーマンス劣化の原因を見ることができる。
（１）ターゲットプログラムが実際に実行を開始する前に、バックエンドソフトウェアを起動する時間。これは図１０ではＴｂｉ−Ｔ０として示される。
（２）各多数決における同期時間。これは、フロントエンドが多数決集計を完了して継続コマンドを発行するのを待機する間、各ターゲットプログラムがストールする時間である。図１０においてこの時間は、全体一致多数決の場合は時間Ｔｃｉ＿ｊ−Ｔｐｉ＿ｊとして示され、非全体一致多数決の場合は時間Ｔｃｋｐｉ＿ｊ−Ｔｐｉ＿ｊとして示される。
（３）エラーが検出された後にかかる回復時間。この時間は図１０ではＴｃｉ＿ｊ−Ｔｃｋｐｉ＿ｊとして示される。
【００３７】
実施例のこれらおよびその他のオーバーヘッドは、さまざまな要因に帰することが可能である。第１に、バックエンドコントローラプログラムは、プロセッサ時間に関してターゲットプログラムと競合しなければならないため、オーバーヘッドを受ける。第２に、コントローラプログラムは、ブレークポイントの管理を含む、ターゲットプログラムの実行を管理する追加のオーバーヘッドを受ける。第３に、多数決プロセスは、ターゲットプログラムに対して一種のバリア同期をかける。バックエンドマシンの処理速度が相等しくない場合には待機時間は特に顕著になる。その理由は、速いマシンは、遅いマシンが多数決ポイントに到達するのを待機することになるからである。第４に、フロントエンドとバックエンドは分散しているため、通信オーバーヘッドを受ける。第５に、回復プロセスはある有限の時間を必要とする。
【００３８】
実施例においてオーバーヘッド時間を短縮するにはさまざまなアクションをとることが可能である。それには例えば以下のものがある。
（１）多数決の頻度を減らす。
（２）多数決をするデータのサイズを減らす。
（３）現在の多数決の結果がフロントエンドによって判定されるまでターゲットプログラムが実行をストールする必要性を除去する。
アクション（１）は、図１０におけるＴｃｉ＿ｊ−Ｔｐｉ＿ｊのオーバーヘッドの数を減らすことになる。アクション（２）は、平均のＴｃｉ＿ｊ−Ｔｐｉ＿ｊの時間を短縮するが、おそらくそれはほんのわずかである。多数決をするデータがあまり大きくない限り、Ｔｃｉ＿ｊ−Ｔｐｉ＿ｊの時間のほとんどは、同期および通信のオーバーヘッドからなる。アクション（３）は、Ｔｃｉ＿ｊ−Ｔｐｉ＿ｊのオーバーヘッドを完全に除去するが、多数決および回復のプロセスの複雑さを増大させることになる。その理由は、ターゲットプログラムはもはや同期しなくなるからである。従って、多数決データを使用するまで保存しておかなければならず、回復は、一部の多数決データの部分的キャンセルを必要とする。
【００３９】
【発明の効果】
以上述べたごとく、本発明によれば、ソースコードや実行可能コードの修正を必要とせずに、重要な（クリティカル）データのデータ完全性を保証する一般的なエラー検出および回復の技法を提供する一方で、フォールトトレラントな構成および動作のための高度な自動化および透過性を提供する。
【図面の簡単な説明】
【図１】本発明によりフォールトトレランスを実現するために用いられる間接インスツルメンテーションソフトウェアツールの実施例のブロック図である。
【図２】図１の実施例によってサポートされる複数の動作モードの図である。
【図３】作成グラフィカルユーザインタフェース（ＧＵＩ）の図である。
【図４】作成グラフィカルユーザインタフェース（ＧＵＩ）の図である。
【図５】作成対象ＧＵＩの図である。
【図６】図１の実施例のフロントエンド部分の詳細図である。
【図７】図１の実施例のバックエンド部分の詳細図である。
【図８】間接インスツルメンテーションを利用してフォールトトレランスを提供する、本発明によるコンピューティングシステムの実施例の図である。
【図９】図８の実施例のチェックポインティングの図である。
【図１０】図７の実施例の動作を示すタイミング図である。
【符号の説明】
１０  分散システム
１２  ユーザマシン
１４  リモートマシン
１５  通信媒体
１６  ウェブ埋込みアプリケーション層
１８  ＴＣＰ／ＩＰ層
２０  作成ＧＵＩ
２２  ターゲットプログラム
２４  バックエンドソフトウェア
２７  コントローラ
２８  バックエンド
３０  作成対象ＧＵＩ
３０Ａ  テキストエリアコード
３０Ｂ  メーターウィジェットコード
３０Ｃ  テキストフィールドコード
４０  ソースリスティングウィンドウ
４２  関数リスト
４４  グローバル変数リスト
４６  ローカル変数リスト
５２  テキストフィールド
５４  メーターウィジェットボタン
５６  テキストフィールドウィジェットボタン
５８  テキストエリアウィジェットボタン
６４  ウォッチウィンドウ
６６  ウォッチウィンドウ
６８  ウォッチウィンドウ
１００  フロントエンド
１０２  ＰＣＰ要素
１０４  バックエンドリスナ
１１０  ｍａｉｎプロセス
【図１】
0003624119.tif 000002
【図２】
0003624119.tif 000003
【図３】
0003624119.tif 000004
【図４】
0003624119.tif 000005
【図５】
0003624119.tif 000006
【図６】
0003624119.tif 000007
【図７】
0003624119.tif 000008
【図８】
0003624119.tif 000009
【図９】
0003624119.tif 000010
【図１０】
0003624119.tif 000011