(57)【要約】【課題】  トランジェント・フォールトを回復することができるシステムを提供すること。【解決手段】  主導スレッドと冗長スレッドが、並列に実行される。このシステムは、各セクションでトランジェント・フォールトが発生しないと予測し、投機的に各セクションで、好適には２つの異なるコアに主導スレッドと冗長スレッドを割り振って実行される。その際、主導スレッドと冗長スレッドで、共有メモリへの書き込みを行わず、スレッドローカルな領域にバッファリングしながら同時に実行し、２つのスレッドの実行結果が一致するなら、スレッドローカルな領域にバッファリングされた内容がコミットされ、共有メモリへの書き込みが行なわれる。２つのスレッドの実行結果が一致しないなら、主導スレッドと冗長スレッドは、前のコミット・ポイントまでロールバックされ、再度処理を実行する。こうして、２つのスレッドの実行結果が一致することが保証されるので、トランジェント・フォールトによるエラーが回避される。【選択図】  図４
2011044078.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサをもち、フォールト・トレラントに実行されるコンピュータ・システムであって、
所定の演算結果をもたらす第１のコードを含む第１のスレッドと、前記第１のコードと同一の演算を行なう第２のコードを含む第２のスレッドとを並列的に実行する手段と、
前記第１のスレッドがコミット・ポイントより前の所定のコードに到達したことに応答して、前記第１のコードの演算結果と、前記第２のコードの演算結果とを比較する手段と、
前記演算結果が不一致であることに応答して、前記第１のスレッドと前記第２のスレッドをロールバックさせる手段とを有する、
コンピュータ・システム。
【請求項２】
前記プロセッサが、マルチコア・プロセッサであり、前記第１のスレッドと前記第２のスレッドとがそれぞれ前記プロセッサの異なるコアに割り当てられる、請求項１に記載のコンピュータ・システム。
【請求項３】
前記演算結果が一致することに応答して、前記第１のスレッドが、前記第１のコードの演算結果を共有メモリに書き出す、請求項１に記載のコンピュータ・システム。
【請求項４】
前記ロールバック後、前記第１のスレッドと前記第２のスレッドをスレッド間通信させる手段をさらに有する、請求項１に記載のコンピュータ・システム。
【請求項５】
前記コミット・ポイントが、スレッドの同期、システム・コールの呼出し、外部にあるライブラリ関数、ロックの獲得、及びロックの解除のどれかである、請求項１に記載のコンピュータ・システム。
【請求項６】
前記ロールバックは、１つ前のコミット・ポイントへの移動である、請求項１に記載のコンピュータ・システム。
【請求項７】
プロセッサをもつコンピュータ・システムを、フォールト・トレラントに実行する方法であって、
所定の演算結果をもたらす第１のコードを含む第１のスレッドを実行するステップと、
前記第１のコードと同一の演算を行なう第２のコードを含む第２のスレッドを、前記第１のスレッドと並列的に実行するステップと、
前記第１のスレッドがコミット・ポイントより前の所定のコードに到達したことに応答して、前記第１のコードの演算結果と、前記第２のコードの演算結果とを比較するステップと、
前記演算結果が不一致であることに応答して、前記第１のスレッドと前記第２のスレッドをロールバックさせるステップとを有する、
コンピュータ・システムの実行方法。
【請求項８】
前記プロセッサが、マルチコア・プロセッサであり、前記第１のスレッドと前記第２のスレッドとがそれぞれ前記プロセッサの異なるコアに割り当てられる、請求項７に記載のコンピュータ・システムの実行方法。
【請求項９】
前記演算結果が一致することに応答して、前記第１のスレッドが、前記第１のコードの演算結果を共有メモリに書き出す、請求項７に記載のコンピュータ・システムの実行方法。
【請求項１０】
前記ロールバック後、前記第１のスレッドと前記第２のスレッドをスレッド間通信させるステップをさらに有する、請求項７に記載のコンピュータ・システムの実行方法。
【請求項１１】
前記コミット・ポイントが、スレッドの同期、システム・コールの呼出し、外部にあるライブラリ関数、ロックの獲得、及びロックの解除のどれかである、請求項７に記載のコンピュータ・システムの実行方法。
【請求項１２】
前記ロールバックは、１つ前のコミット・ポイントへの移動である、請求項７に記載のコンピュータ・システムの実行方法。
【請求項１３】
プロセッサをもつコンピュータ・システムを、フォールト・トレラントに実行するプログラムであって、
前記コンピュータ・システムをして、
所定の演算結果をもたらす第１のコードを含む第１のスレッドを実行するステップと、
前記第１のコードと同一の演算を行なう第２のコードを含む第２のスレッドを、前記第１のスレッドと並列的に実行するステップと、
前記第１のスレッドがコミット・ポイントより前の所定のコードに到達したことに応答して、前記第１のコードの演算結果と、前記第２のコードの演算結果とを比較するステップと、
前記演算結果が不一致であることに応答して、前記第１のスレッドと前記第２のスレッドをロールバックさせるステップと実行させる、
コンピュータ・システムの実行プログラム。
【請求項１４】
前記プロセッサが、マルチコア・プロセッサであり、前記第１のスレッドと前記第２のスレッドとがそれぞれ前記プロセッサの異なるコアに割り当てられる、請求項１３に記載のコンピュータ・システムの実行プログラム。
【請求項１５】
前記演算結果が一致することに応答して、前記第１のスレッドが、前記第１のコードの演算結果を共有メモリに書き出す、請求項１３に記載のコンピュータ・システムの実行プログラム。
【請求項１６】
前記ロールバック後、前記第１のスレッドと前記第２のスレッドをスレッド間通信させるステップをさらに有する、請求項１３に記載のコンピュータ・システムの実行プログラム。
【請求項１７】
前記コミット・ポイントが、スレッドの同期、システム・コールの呼出し、外部にあるライブラリ関数、ロックの獲得、及びロックの解除のどれかである、請求項１３に記載のコンピュータ・システムの実行プログラム。
【請求項１８】
前記ロールバックは、１つ前のコミット・ポイントへの移動である、請求項１３に記載のコンピュータ・システムの実行プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、コンピュータ・システムにおいて、宇宙線などの影響で発生したエラーを回復するためのシステム、方法及びプログラムに関するものである。
【背景技術】
【０００２】
コンピュータ・システムにおいて、トランジェント・フォールト(transient fault)と呼ばれる障害が知られている。トランジェント・フォールトとは、宇宙線などの影響により、一時的に起こる回路の誤動作である。トランジェント・フォールトの発生確率は、トランジスタの集積度の向上とともに増大しており、プロセッサにおいてもトランジェント・フォールトを検出・回復するための機構が望まれる。特にミッション・クリティカルな目的に使われるコンピュータ・システム、航空機や宇宙船制御システムなど、高いレベルの宇宙線に曝されるコンピュータ・システムにおいて、その要望は大きい。
【０００３】
これに関して、特開昭５５−１２５５９８号公報は、２つのプロセッサで同一のプログラムを動作させる冗長システムにおいて、一方のプロセッサが自分の主記憶装置内で破壊を検出したら、もう一方のプロセッサの主記憶装置から正しい値を読み込み回復する技術を開示している。
【０００４】
また、特開平３−２６９７４５号公報は、２つのプロセッサのそれぞれを稼動状態と待機状態にし、それぞれの主記憶の内容をメモリ等値化手段によって常に同じになるように等値化されているシステムにおいて、一方のプロセッサのメモリ診断手段が自分の主記憶装置内に破壊を検出したら、もう一方のプロセッサの主記憶装置から正しい値を読み込み回復する技術を開示している。
【０００５】
しかし、これらの従来技術では、プログラムの動作中にそれぞれのプロセッサの計算結果を照合していないので、プロセッサ内部で発生したトランジェント・フォールトを検出することができず、当然そこから回復することもできない。
【０００６】
一方、Cheng Wang, Ho-seop Kim, Youfeng Wu, and Victor Ying, 
"Compiler-Managed Software-based Redundant Multi-Threading for Transient
Fault Detection", In the Proceedings of the International Symposium on Code
Generation  and Optimization, pp.244-258 (2007).は、次のようにしてトランジェント・フォールトを検出する仕組みを開示する。すなわち、これによれば、ソースコードを 2 種類のバージョンにコンパイルし、それぞれを別々のＣＰＵコアで実行する。便宜上、それらのスレッドを、主導スレッド(Leading Thread)と冗長スレッド(Trailing Thread)と呼ぶことにする。主導スレッドと冗長スレッドは、同一の計算 を両者で重複して行い、共有メモリの読書き時に比較することにより、トランジェント・フォールトを検出する。しかしこの方式では、トランジェント・フォールトを検出しても、そこから回復することができない。すなわち、計算結果の不一致を検出しても、計算を行う以前の状態を復元する手段がなく、そのままプログラムを終了せざるを得ないためである。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開昭５５−１２５５９８号公報
【特許文献２】特開平３−２６９７４５号公報
【非特許文献】
【０００８】
【非特許文献１】Cheng Wang, Ho-seop Kim, Youfeng Wu, and Victor Ying, "Compiler-Managed Software-based Redundant Multi-Threading for Transient Fault Detection", In the Proceedings of the International Symposium on Code Generation and Optimization, pp.244-258 (2007)
【発明の概要】
【発明が解決しようとする課題】
【０００９】
従って、この発明の目的は、トランジェント・フォールトを検出するだけではなく、その状態から回復することが可能なコンピュータ・システムを提供することにある。
【課題を解決するための手段】
【００１０】
本発明は、上記課題を解決するためになされたものであり、本発明によれば先ず、実行すべきオリジナル・プログラムに存在するシステムコール等の回復不可能ポイントとスレッド同期ポイントで、プログラムがセクションに区切られる。この処理は、コンパイラによって行なわれる。スレッド同期ポイントでプログラムを区切ることにより、トランジェント・フォールトが発生しない限り、適切な同期処理を行っているプログラムでは、２  つのスレッドから同一の実行結果を得られることが保証される。なお、以下では便宜上、回復不可能ポイント、スレッド同期ポイント等をコミット・ポイントと呼ぶことにする。
【００１１】
さらに、実行すべきオリジナル・プログラムに基づき、主導スレッド(Leading Thread)と冗長スレッド(Trailing Thread)のコードが、好適にはコンパイラによって生成される。
【００１２】
主導スレッドと冗長スレッドは、オペレーティング・システムによって並列に実行される。本発明のシステムは、各セクションでトランジェント・フォールトが発生しないと予測し、投機的に各セクションで、好適には２つの異なるコアに主導スレッドと冗長スレッドを割り振って実行される。その際、主導スレッドと冗長スレッドで、共有メモリへの書き込みを行わず、スレッドローカルな領域にバッファリングしながら同時に実行し、２つのスレッドの実行結果が一致するなら、スレッドローカルな領域にバッファリングされた内容がコミットされ、共有メモリへの書き込みが行なわれる。
【００１３】
２つのスレッドの実行結果が一致しない場合、処理がセクションの先頭にロールバックされ、セクションの先頭から処理が再開される。
【００１４】
尚、データレース(Data Race)に起因する再実行の頻発を削減するために、再実行の際は、好適には、異なるコア間で、メモリアクセス毎に同期をしながら実行する。
【発明の効果】
【００１５】
以上のように、この発明によれば、トランジェント・フォールトの発生を検出したことに応答して、システム的に処理がロールバックされ再開することにより、トランジェント・フォールトが起きても、演算処理のミスを回避することが可能となる。
【図面の簡単な説明】
【００１６】
【図１】本発明を実施するためのハードウェア構成のブロック図である。
【図２】本発明に係る機能論理ブロック図である。
【図３】主導スレッドと、冗長スレッドを生成するための処理のフローチャートである。
【図４】主導スレッドと、冗長スレッドの間で実行結果を比較する処理のフローチャートである。
【発明を実施するための形態】
【００１７】
以下、図面に基づき、この発明の実施例を説明する。特に断わらない限り、同一の参照番号は、図面を通して、同一の対象を指すものとする。尚、以下で説明するのは、本発明の一実施形態であり、この発明を、この実施例で説明する内容に限定する意図はないことを理解されたい。
【００１８】
図１を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。図１において、システム・バス１０２には、ＣＰＵ１０４と、主記憶（ＲＡＭ）１０６と、ハードディスク・ドライブ（ＨＤＤ）１０８と、キーボード１１０と、マウス１１２と、ディスプレイ１１４が接続されている。ＣＰＵ１０４は、これには限定されないが、好適には、３２ビットまたは６４ビットのアーキテクチャに基づくマルチコア・タイプのものであり、例えば、インテル社のＣｏｒｅ（商標）２  Ｄｕｏ、Ｃｏｒｅ（商標）２  Ｑｕａｄ、ＡＭＤ  Ｔｕｒｉｏｎ（商標）などを使用することができる。主記憶１０６は、好適には、２ＧＢ以上の容量をもつものである。ハードディスク・ドライブ１０８は、例えば、３２０ＧＢ以上の容量をもつものである。
【００１９】
ハードディスク・ドライブ１０８には、個々に図示しないが、オペレーティング・システムが、予め格納されている。オペレーティング・システムは、Ｌｉｎｕｘ（商標）、マイクロソフト社のＷｉｎｄｏｗｓ  Ｖｉｓｔａ（商標）、Ｗｉｎｄｏｗｓ  ＸＰ（商標）、Ｗｉｎｄｏｗｓ（商標）２０００、アップルコンピュータのＭａｃ  ＯＳ（商標）などの、ＣＰＵ１０４に適合する任意のものでよい。
【００２０】
ハードディスク・ドライブ１０８にはまた、必要に応じて、Ｃ、Ｃ＋＋、Ｃ＃、Ｊａｖａ（商標）などのプログラム言語処理系も格納される。
【００２１】
ハードディスク・ドライブ１０８にはさらに、プログラム言語処理系でコンパイルするためのソースコードを書くためのテキスト・エディタ、及び、Ｅｃｌｉｐｓｅ（商標）などの開発環境を含んでいてもよい。
【００２２】
キーボード１１０及びマウス１１２は、オペレーティング・システムまたは、ハードディスク・ドライブ１０８から主記憶１０６にロードされ、ディスプレイ１１４に表示されたプログラム（図示しない）を起動したり、文字を打ち込んだりするために使用される。
【００２３】
ディスプレイ１１４は、好適には、液晶ディスプレイであり、例えば、ＸＧＡ（１０２４×７６８の解像度）、またはＵＸＧＡ（１６００×１２００の解像度）などの任意の解像度のものを使用することができる。
【００２４】
図２は、本発明に係る処理モジュールを用意するための機能ブロック図である。図２において、ソースコード２０２は、この実施例では、Ｊａｖａ（商標）で書かれたテキスト・ファイルであり、好適には、ハードディスク・ドライブ１０８に保存されている。
【００２５】
コンパイラ２０４は、Ｊａｖａ（商標）コンパイラであり、好適には、ハードディスク・ドライブ１０８に保存されており、オペレーティング・システムの働きによってキーボード１１０及びマウス１１２の操作に応答して、主記憶１０６にロードされ、ソースコード２０２をコンパイルして、実行可能コードを生成する。
【００２６】
特に、本発明においては、コンパイラ２０４は、ソースコード２０２に基づき、ソースコード２０２に記述されているのとほぼ等価な処理を行う主導スレッド・コード２０６と、冗長スレッド・コード２０８を生成する機能をもつ。
【００２７】
主導スレッド・コード２０６と、冗長スレッド・コード２０８は、コミット・ポイント(commit point)の前に、主導スレッド・コード２０６と、冗長スレッド・コード２０８とでバッファからデータを書き出すコードと、書き出したデータを比較するコードを挿入する点で、もとのソースコード２０２に記述された処理と異なるが、それ以外は、ほとんど同一である。
【００２８】
ここで、コミット・ポイントとは、もとのソースコードにおける、スレッドの同期（例えば、ロックの獲得、開放）、システム・コールの呼出し、外部にあるライブラリ関数の呼出しなどの位置のことである。
【００２９】
特に、この実施例では、コミット・ポイントから、次のコミット・ポイントまでを、セクションと呼ぶことにする。
【００３０】
このようにして用意された主導スレッド・コード２０６と、冗長スレッド・コード２０８は、好適には一旦ハードディスク・ドライブ１０８に保存され、プログラム実行時に、オペレーティング・システムに用意された実行環境２１０において、具体的には、主導スレッド・コード２０６と、冗長スレッド・コード２０８とが、ＣＰＵ１０４の個別のコアに割り当てられて実行される。その意味で、ＣＰＵ１０４は、マルチコア・タイプのものであることが望ましいが、必須ではなく、本発明は、シングルコア・タイプのＣＰＵにも適用可能であることを理解されたい。シングルコア・タイプのＣＰＵの場合は、ＣＰＵが、オペレーティング・システムの働きで、タスク・スイッチの機能によって主導スレッド・コード２０６と、冗長スレッド・コード２０８とを並列的に実行する。
【００３１】
図３は、コンパイラ２０４の機能の概要を示すフローチャートである。図３のステップ３０２で、コンパイラ２０４が、ソースコード２０２を読み取って処理する。これは通常のコンパイル処理と同様であるが、本発明に特有であるのは、ステップ３０４で、コンパイラ２０４が、共有メモリに書込みを行う場所の直前と、コミット・ポイントの直前にコードを挿入して主導スレッド・コード２０６を生成し、ステップ３０６で、コンパイラ２０４が、共有メモリに書込みを行う場所の直前と、コミット・ポイントの直前にコードを挿入して冗長スレッド・コード２０８を生成することである。
【００３２】
別の観点からこのことを説明してみる。先ず、オリジナルのソースコードが下記のようであるとする。このコードは、Ｊａｖａをベースにしているが、特定のプログラミング言語のコードに限定されない擬似コードであることを理解されたい。
// オリジナル・コード
lock();
compute val1;
p1 = val1;
compute val2;
s1 = val2;
unlock();
// ---------------
ここでlock()は、例えば、Ｊａｖａの文脈でのロック取得であり、unlock()は、Ｊａｖａの文脈でのロック解放である。lock()とunlock()は、コミット・ポイントに該当する。
【００３３】
上記のコードで、compute val1などとあるのは、val1を計算するための処理を形式的に記述した擬似コードである。
【００３４】
コンパイラ２０４は、このようなオリジナル・コードから、次のような主導スレッド・コードを生成する。
// 主導スレッド・コード
lock();
backup(p1);
compute val1
p1 = val1;
compute val2;
buffer(s1, val2);
if (compare_buffer_and_private_data() /* 冗長スレッドとの同期 */ == FALSE) {
restore(p1);
reset_buffer();
goto retry_with_synch;
}
commit_buffer();
unlock();
// ---------------
【００３５】
ここで、backup(p1)は、プライベート・データp1の値をバックアップする処理である。
p1 = val1は、スレッドにおけるプライベート・データの書込みである。
buffer(s1, val2)は、val2の値を、スレッド・ローカルなメモリの領域で、変数s1にコピーあるいはバッファする処理を意味する。
compare_buffer_and_private_data()は、主導スレッドがバッファした値及び主導スレッドにおけるプライベート・データの値と、冗長スレッドがバッファした値及び冗長スレッドにおけるプライベート・データの値とを比較する処理を示す。主導スレッドがバッファした値と冗長スレッドがバッファした値が一致し、且つ主導スレッドにおけるプライベート・データの値と冗長スレッドにおけるプライベート・データの値が一致するとき、compare_buffer_and_private_data()はTRUEを返し、そうでなければ、FALSEを返す。
restore(p1)は、p1の値を復元する処理である。
reset_buffer()は、バッファをフラッシュする処理である。
goto retry_with_synchは、典型的にはプログラムのセクション境界であるロールバック点まで処理を戻す。
示されているように、restore(p1)、reset_buffer()、及びgoto retry_with_synchは、compare_buffer_and_private_data()の結果がFALSEである場合に実行され、特に、goto retry_with_synchによって、ロールバックが引き起こされる。
一方、compare_buffer_and_private_data()がTRUE、すなわち、主導スレッドがバッファした値と冗長スレッドがバッファした値が一致し、且つ、主導スレッドにおけるプライベート・データの値と冗長スレッドにおけるプライベート・データの値が一致するなら、次のcommit_buffer()に進む。
commit_buffer()は、バッファされている値を実際に書き出すコミット処理のことである。すなわち、書込みバッファには、書き込む場所と値のペアがバッファリングされている。そこで、コミット処理とは、バッファリングされている書き込む場所に、その値を実際に書き込むことである。
【００３６】
以上から分かるように、本発明の実施例に従い、主導スレッドにおいて、共有メモリに書込みを行う場所の直前に挿入されるコードは次のとおりである。
(1) スレッドローカルなメモリ領域に、実行結果の値をバッファするコード。
また本発明の実施例に従い、主導スレッドにおいて、コミットポイントの直前に挿入されるコードは次のとおりである。
(2) 主導スレッドにバッファされた実行結果と、冗長スレッドにバッファされた実行結果を比較するコード。
(3) 実行結果が不一致なら、前のコミット・ポイントまでロールバックするコード。
(4) 実行結果が一致するなら、バッファされた実行結果をコミットするコード。
【００３７】
ところで、主導スレッド乃至冗長スレッドは、共有データを読み込む場合はまず、書込みバッファをチェックし、読み込むデータ領域の最新の値があればそれを読み込み、なければ共有データ領域から読み込むという処理を行う。
【００３８】
一方、生成される冗長スレッド・コードは下記のとおりで、lock(), commit_buffer(), unlock()を含まない点を除き、あとは主導スレッドと同一である。
// 冗長スレッド・コード
backup(p1);
compute val1;
p1 = val1;
compute val2;
buffer(s1, val2);
if (compare_buffer_and_private_data() /* 主導スレッドとの同期 */ == FALSE) {
restore(p1);
reset_buffer();
goto retry_with_synch;
}
// -----------------
【００３９】
次に、以上のように用意された主導スレッド・コードと、冗長スレッド・コードで以って、実行される処理について、図４のフローチャートを参照して説明する。
【００４０】
図４のステップ４０２ではまず、主導スレッド・コードと、冗長スレッド・コードが投機的に実行される。ここで、プログラム・セクションを実行、とあるのは、ステップ４０２の文脈では、１セクション毎の実行を想定している。
【００４１】
次に、ステップ４０４では、主導スレッド・コードと、冗長スレッド・コードが、コミット・ポイントに到達したかどうかの判断がなされる。コミット・ポイントに到達していなければ、ステップ４０２に戻って、主導スレッド・コードと、冗長スレッド・コードの、セクション内の処理を続ける。主導スレッド・コードと、冗長スレッド・コードではそれぞれ、上述のように、compute val2という同一の計算が行われ、その同一の計算の結果が、主導スレッド・コードと、冗長スレッド・コードで、buffer(s1, val2)によって個別にバッファされる。
【００４２】
ステップ４０４で、主導スレッド・コードと、冗長スレッド・コードが、コミット・ポイントに到達したと判断されると、ステップ４０６では、主導スレッド・コードと、冗長スレッド・コードの実行結果が比較される。上述のコードでは、主導スレッド・コードと冗長スレッド・コードの両方における、compare_buffer_and_private_data()のところの処理である。
【００４３】
このとき、トランジェント・フォールト、データレースなどのエラーがなければ、主導スレッド・コードと冗長スレッド・コードでは、同一の処理を実行しているので、実行結果は一致するはずである。
【００４４】
ここでデータレースとは、主導スレッドと、冗長スレッドとが、共有データの読込みを独立して行うために発生するデータ競合のことである。例えば、主導スレッドが共有データを読み込んだ後、冗長スレッドがその共有データを読み込む前に、全く別のスレッドが同じ共有データを書き換えた場合などに発生する。ただ、この実施例によれば、スレッド同期ポイントでセクションを論理的に区切ることにより、適切な同期処理を行っているプログラムでは、主導スレッドと、冗長スレッドとがある処理を実行している間は、他のスレッドが競合するセクションを実行できないようにすることにより、データレースによる実行結果の不一致が起こる確率を実質的に減少させている。
【００４５】
実際に実行結果が一致すると判断されると、ステップ４０８に進んで、書込みバッファの内容のコミットが行われる。これは、commit_buffer()として示されている処理である。より具体的には、ここで、プライベートデータのバックアップの内容が破棄され、書込みバッファの値が共有データのメモリ領域に書き込まれる。そして、書込みバッファの内容が初期化される。
【００４６】
ステップ４１０では、主導スレッドが、コミット・ポイントの位置にある処理を行い、処理はステップ４０２に戻る。そこで、主導スレッドと冗長スレッドの次のセクションの処理に移る。
【００４７】
ステップ４０６に戻って、主導スレッド・コードと、冗長スレッド・コードの実行結果が比較された結果、それらが不一致なら、ステップ４１２に進む。
これは、上記擬似コードで、compare_buffer_and_private_data()として示した処理である。
【００４８】
ステップ４１２では、主導スレッドと冗長スレッドを、プログラム・セクションの先頭までロールバックする処理が行われる。これは、上記の擬似コードでは、goto retry_with_synchとして示された処理である。より詳しくは、ロールバックに際して、バックアップされていたプライベート・データの復元、及び書込みバッファの初期化がまず行われる。それから、セクションの先頭まで、処理が戻される。
【００４９】
なお、ロールバックしたセクションで、データレースが発生している可能性がある。そこで、ステップ４１４では、次のような処理を行う。
【００５０】
すなわち先ず、主導スレッドが、共有データの値を読み込む。次に、主導スレッドが、スレッド間通信で、読み込んだデータを冗長スレッドに送信する。
【００５１】
主導スレッドは、読み込んだ内容を用いて、実行を継続する。一方、冗長スレッドは、送信された内容を用いて、実行を継続する。
【００５２】
そうして、ステップ４０４でコミット・ポイントに達したと判断されたら、ステップ４０６で、再度、主導スレッド・コードと、冗長スレッド・コードの実行結果が比較される。
【００５３】
その結果、実行結果が一致していれば、ステップ４０８で書込みバッファの内容をコミットし、ステップ４１０で主導スレッドでコミット・ポイントの位置にある処理を実行してから、ステップ４０２に戻る。
【００５４】
このように、主導スレッドの実行結果と冗長スレッドの実行結果が一致するまで、主導スレッドと冗長スレッドがロールバックするので、トランジェント・フォールトやデータレースが生じても、それによって正しくない実行結果が、後の処理に波及することが防がれる。
【００５５】
こうして、ステップ４０２で、主導スレッドがその処理の終わりに到達すると、主導スレッドは、冗長スレッドに終了を指示する。主導スレッドは、冗長スレッドの終了を確認後に、自身を終了させる。
【００５６】
以上、本発明を、パーソナル・コンピュータ上で実施する形態を用いて説明したが、特定のコンピュータ・アーキテクチャや構成に限定されず、ワークステーション、メインフレーム、航空機や宇宙船搭載の組込みシステムなどでも実装可能であることを、この分野の当業者なら理解するであろう。また、好適な実施例としてマルチコア・プロセッサの例を示したが、シングルコア・プロセッサでも実施可能である。
【００５７】
また、上記実施例では、Ｊａｖａベースで説明したが、マルチスレッドを実現可能な任意のオペレーティング・システムと、プログラミング言語処理系の組み合せで実施可能であり、Ｊａｖａ以外に、Ｃ、Ｃ＋＋、Ｃ＃その他、この分野の当業者に知られている任意のプログラミング言語処理系が使用可能である。
【符号の説明】
【００５８】
１０２  システム・パス
１０４  ＣＰＵ
１１０  キーボード
１１２  マウス
１１４  ディスプレイ
１０６  主記憶
１０８  ハードディスク・ドライブ
２０２  ソースコード
２０４  コンパイラ
２０６  主導スレッド・コード
２０８  冗長スレッド・コード
２１０  実行環境
【図１】
2011044078.tif 000003
【図２】
2011044078.tif 000004
【図３】
2011044078.tif 000005
【図４】
2011044078.tif 000006