(57)【特許請求の範囲】
【請求項１】
第１の仮想計算機と該第１の仮想計算機を管理する第１のハイパーバイザとが稼働する第１の計算機、及び第２の仮想計算機と該第２の仮想計算機を管理する第２のハイパーバイザとが稼働する第２の計算機を含む高可用システムであって、
前記第１のハイパーバイザは、
前記第1の仮想計算機について発生した、該第1の仮想計算機に対する入力を伴うイベントに関する同期情報を収集する収集部と、
収集した前記同期情報を、前記第２のハイパーバイザへ送信する送信部とを備え、
前記第２のハイパーバイザは、
前記第１のハイパーバイザから、前記同期情報を受信する受信部と、
受信した前記同期情報に従って、前記第２の仮想計算機の入力に係る実行状態を、前記第１の仮想計算機の入力に係る実行状態と同一になるように、制御する制御部とを備え、
前記収集部は、前記イベントの発生するタイミングが非決定的であるか、決定的であるかを判定し、非決定的であると判断した場合に、前記同期情報に、該イベントが発生したタイミングを特定するためのタイミング情報を含ませることを特徴とする高可用システム。
【請求項２】
前記送信部は、複数の前記同期情報を、当該同期情報に係るイベントが発生した順に送信することを特徴とする請求項１に記載の高可用システム。
【請求項３】
前記制御部は、複数の前記同期情報を、当該同期情報が受信された順に参照することによって、前記第１の仮想計算機について複数のイベントが発生した順番と同一の順番で、前記第２の仮想計算機について同一の複数のイベントが発生するように、制御することを特徴とする請求項２に記載の高可用システム。
【請求項４】
前記制御部は、前記同期情報に係るイベントの発生するタイミングが非決定的である場合に、前記同期情報に含まれるタイミング情報に従って、前記第１の仮想計算機について該イベントが発生したタイミングと同一のタイミングで、前記第２の仮想計算機について該イベントと同一のイベントが発生するように、制御することを特徴とする請求項１に記載の高可用システム。
【請求項５】
前記第１のハイパーバイザから前記第1の仮想計算機へ制御が移るに際して、実行された命令数を保持するカウンタをクリアして、それ以降で実行される命令数をカウントし、前記第1の仮想計算機から前記第１のハイパーバイザへ制御が移るに際して、該命令数のカウントを停止するカウンタ制御部を更に備え、
前記収集部は、前記第1の仮想計算機から前記第１のハイパーバイザへ制御が移るにあたって発生したイベントが、該第1の仮想計算機に関係する割り込みであった場合には、前記イベントの発生するタイミングが非決定的であると判定し、停止したときの前記カウンタが示す実行命令数を、前記タイミング情報とすることを特徴とする請求項１に記載の高可用システム。
【請求項６】
前記カウンタ制御部は、前記第１のハイパーバイザから前記第1の仮想計算機へ制御が移るに際して、前記第1の仮想計算機から前記第１のハイパーバイザへ制御が移るにあたって発生したイベントが、該第1の仮想計算機に関係しない割り込みである場合には、前記カウントをクリアする代わりに、前記カウントを再開することを特徴とする請求項５に記載の高可用システム。
【請求項７】
前記制御部は、前記同期情報に含まれる前記実行命令数に従って、前記第２の仮想計算機が実行している命令列の中に、前記同期情報に係るイベントと同一のイベントを発生させるためのブレークポイントを設定することを特徴とする請求項５に記載の高可用システム。
【請求項８】
前記第２の計算機は、前記第２の仮想計算機に割り込みをかけた場合に、割り込み遅延が発生しないものであり、
前記制御部は、前記同期情報に含まれる前記実行命令数に従って、前記第1の仮想計算機で割り込みが発生したタイミングと同一のタイミングで前記第２の仮想計算機に割り込みをかけることを特徴とする請求項５に記載の高可用システム。
【請求項９】
前記制御部は、前記同期情報に含まれる前記実行命令数に従って、前記割り込み遅延の発生にかかわらずに前記第1の仮想計算機で割り込みが発生したタイミング以前のタイミングで前記第２の仮想計算機の命令の実行が確実に停止するように制御した上で、前記第1の仮想計算機で割り込みが発生したタイミングと同一のタイミングに至ったと判断されるまで、前記第２の仮想計算機の命令を、１命令又は複数命令ずつ、繰り返し実行することを特徴とする請求項８に記載の高可用システム。
【請求項１０】
前記第２のハイパーバイザから前記第２の仮想計算機に制御が移るに際して割り込みイベントを通知させることを特徴とする請求項９に記載の高可用システム。
【請求項１１】
前記収集部は、前記イベントについて、前記第1の仮想計算機の処理が中断して、制御が前記第１のハイパーバイザへ移る場合、及び前記第１のハイパーバイザから前記第1の仮想計算機へ制御が復帰する場合に、前記同期情報を収集することを特徴とする請求項１に記載の高可用システム。
【請求項１２】
前記収集部は、前記イベントがハイパーバイザ呼び出しである場合、前記第1の仮想計算機の処理の中断時に係る前記同期情報に、ハイパーバイザ呼び出しの種類及び引数の情報を含ませることを特徴とする請求項１に記載の高可用システム。
【請求項１３】
前記収集部は、前記イベントがハイパーバイザ呼び出しである場合、前記第1の仮想計算機の処理への復帰時に係る前記同期情報に、ハイパーバイザ呼び出しの応答情報及び応答経路の情報を含ませることを特徴とする請求項１２に記載の高可用システム。
【請求項１４】
前記収集部は、前記イベントが例外である場合、前記第1の仮想計算機の処理の中断時に係る前記同期情報に、例外の内容を含ませることを特徴とする請求項１に記載の高可用システム。
【請求項１５】
前記収集部は、前記例外である場合、前記第1の仮想計算機の処理への復帰時に係る前記同期情報に、例外ハンドラ呼び出しの実行を示す情報を含ませることを特徴とする請求項１４に記載の高可用システム。
【請求項１６】
前記収集部は、前記イベントが割り込みである場合、前記第1の仮想計算機の処理の中断時に係る前記同期情報に、割り込みハンドラが起動される仮想計算機の識別情報、例外の情報及び割り込み位置の情報を含ませることを特徴とする請求項１に記載の高可用システム。
【請求項１７】
前記収集部は、前記イベントが割り込みである場合、前記第1の仮想計算機の処理への復帰時に係る前記同期情報に、割り込みハンドラ呼び出しに関する情報を含ませることを特徴とする請求項１６に記載の高可用システム。
【請求項１８】
第１の仮想計算機と該第１の仮想計算機を管理する第１のハイパーバイザとが稼働する第１の計算機、及び第２の仮想計算機と該第２の仮想計算機を管理する第２のハイパーバイザとが稼働する第２の計算機を含む高可用システムの実行状態制御方法であって、
前記第１のハイパーバイザの備える収集部が、前記第1の仮想計算機について発生した、該第1の仮想計算機に対する入力を伴うイベントに関する同期情報を収集するステップと、
前記第１のハイパーバイザの備える送信部が、収集した前記同期情報を、前記第２のハイパーバイザへ送信するステップと、
前記第２のハイパーバイザの備える受信部が、前記第１のハイパーバイザから、前記同期情報を受信するステップと、
前記第２のハイパーバイザの備える設定部が、受信した前記同期情報に従って、前記第２の仮想計算機の入力に係る実行状態を、前記第１の仮想計算機の入力に係る実行状態と同一になるように、制御するステップとを有し、
前記収集部は、前記イベントの発生するタイミングが非決定的であるか、決定的であるかを判定し、非決定的であると判断した場合に、前記同期情報に、該イベントが発生したタイミングを特定するためのタイミング情報を含ませることを特徴とする実行状態制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、二重化技術を施した高可用システム及びその実行状態制御方法に関する。
【背景技術】
【０００２】
サーバ計算機のハードウェアに生じる故障を隠蔽することで、該サーバ計算機によるサービスを継続可能にする技術がある。その技術の一つとして、フォールトトレラントサーバが知られている。フォールトトレラントサーバでは、主要なハードウェアがすべて二重化される。フォールトトレラントサーバにおいては、二重化されたハードウェアを制御するための専用ハードウェアが搭載されているため、該専用ハードウェアによって、該二重化されたハードウェアの完全な同期実行が達成され、該二重化されたハードウェアの或る箇所に障害が発生しても、自動的にその障害個所を切り放して、サービスを継続させることが可能になる。
【０００３】
しかし、このようなフォールトトレラントサーバは、主要なコンポーネントを２倍搭載する必要があり、加えて、専用ハードウェアを搭載する必要があるために、非常に高価である。また、専用ハードウェアを搭載するために、特殊な設計が必要になるので、サーバのハードウェア技術の急速な進展への追従が難しい。
【０００４】
二重化のための専用ハードウェアを用いる手法に代るものとして、一般的な（二重化されていない、単体の）サーバを２台組み合わせて、フォールトトレラントサーバを構成する技術がある。
【０００５】
特許文献１に開示された技術では、２台の独立したサーバを組み合わせて、フォールトトレラントが実現される。この技術では、各サーバのＣＰＵが、ＳＭＰやマルチコアなどにより、論理的に２つ以上のＣＰＵで構成されることを前提に、ソフトウェアで２台のサーバの実行を同期させて、二重化を実現している。
【０００６】
ＯＳやアプリケーションの挙動は、ＯＳやアプリケーションの実行とは非同期に発生するＩ／Ｏの事象により、非決定的な振る舞いとなる。このため、独立した２つのサーバを使って二重化を実現するためには、非決定的なＩ／Ｏの事象をサーバ間で同期させることが、不可欠となる。特許文献１に開示された技術では、各サーバ内の２つのＣＰＵを、ＯＳやアプリケーションの実行を担当するＣＥ（Computing Elements）と、入出力を担当するＩＯＰ（I/O processor）とに分けて、ＯＳやアプリケーションの実行と、Ｉ／Ｏとを分離することによって、解決を図っている。
【特許文献１】米国特許第５６１５４０３号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
独立した２台のサーバを組み合わせて、二重化されたフォールトトレラントサーバを構成する方法は、量産化される、安価で、最新の技術が搭載された、サーバを利用することができる、という利点がある。しかし、２台のサーバをフォールトトレラントサーバ用に固定的に割当てる必要があるため、二重化を構成するサーバの組み合わせを、運用中に変更することができない。例えば、フォールトトレラントサーバを構成する２台のうちの１台を保守のために停止させたい場合に、二重化されていない運用状態が一時的に発生することを避けるために、停止させるサーバの処理を第３のサーバに引き継がせて、二重化を継続できることが望ましいが、そのような運用ができない。
【０００８】
また、Ｉ／Ｏの処理と、ＯＳやアプリケーションの処理とを、相異なるＣＰＵに割当てるために、Ｉ／Ｏ処理と、ＯＳやアプリケーション処理とのいずれかに負荷が片寄る場合に、サーバのハードウェアが持つ能力を充分活かすことができない。
【０００９】
本発明は、上記事情を考慮してなされたもので、独立した２台の計算機上でそれぞれ稼働する仮想計算機を組み合わせて二重化を実現することを可能にする高可用システム及び実行状態制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
本発明は、第１の仮想計算機と該第１の仮想計算機を管理する第１のハイパーバイザとが稼働する第１の計算機、及び第２の仮想計算機と該第２の仮想計算機を管理する第２のハイパーバイザとが稼働する第２の計算機を含む高可用システムであって、前記第１のハイパーバイザは、前記第1の仮想計算機について発生した、該第1の仮想計算機に対する入力を伴うイベントに関する同期情報を収集する収集部と、収集した前記同期情報を、前記第２のハイパーバイザへ送信する送信部とを備え、前記第２のハイパーバイザは、前記第１のハイパーバイザから、前記同期情報を受信する受信部と、受信した前記同期情報に従って、前記第２の仮想計算機の入力に係る実行状態を、前記第１の仮想計算機の入力に係る実行状態と同一になるように、制御する制御部とを備え、前記収集部は、前記イベントの発生するタイミングが非決定的であるか、決定的であるかを判定し、非決定的であると判断した場合に、前記同期情報に、該イベントが発生したタイミングを特定するためのタイミング情報を含ませることを特徴とする。
【発明の効果】
【００１１】
本発明によれば、独立した２台の計算機上でそれぞれ稼働する仮想計算機を組み合わせて二重化を実現することが可能になる。
【発明を実施するための最良の形態】
【００１２】
以下、図面を参照しながら本発明の実施形態について説明する。
【００１３】
図１に、本実施形態に係る高可用システムの概略構成例を示す。
【００１４】
図１に示されるように、本実施形態の高可用システムは、２台のサーバ計算機１，２を含む。
【００１５】
第１のサーバ計算機１は、プロセッサ１１、メモリ１２、通信装置(NIC(Network Interface Card))１３、物理デバイス１４，１５を備えている。プロセッサ１１内には、パフォーマンスカウンタとして使用可能なカウンタ１１１が存在する。
【００１６】
同様に、第２のサーバ計算機２は、プロセッサ２１、メモリ２２、通信装置２３、複数のデバイス２４，２５を備えている。プロセッサ２１内には、パフォーマンスカウンタとして使用可能なカウンタ２１１が存在する。
【００１７】
サーバ計算機１とサーバ計算機２は、所定のネットワーク８を介して、通信可能である。
【００１８】
なお、図１で示したデバイスは一例であり、デバイスの種類や数は任意である。
【００１９】
サーバ計算機１（２）において、メモリ１２（２２）には、仮想計算機（仮想マシン（ＶＭ）とも呼ばれる。）内で動作するＯＳやアプリケーションプログラムのソフトウェアと、データが格納されるメモリ領域１２１（２２１）があり、また、ハイパーバイザ（ＨＶ）のプログラムと、データが格納されるメモリ領域１２２（２２２）がある。ハイパーバイザ（ＨＶ）は、サーバ計算機への入力情報を仮想計算機（ＶＭ）に対する入力に変換する、などの処理を行う。
【００２０】
プロセッサ１１（２１）は、ハイパーバイザに係るメモリ領域１２２（２２２）に格納されたプログラムを読み出して実行し、また、仮想計算機に係るメモリ領域１２１（２２１）内のプログラムを読み出して実行する。
【００２１】
プロセッサ１１，２１は、複数の特権レベルを持つ。ハイパーバイザのプログラムは、該複数の特権レベルのうち最も高い特権レベルで動作し、仮想計算機のプログラムは、該ハイパーバイザの動作する特権レベルに比較して、より低い特権レベルで動作する。仮想計算機のプログラムには、ＯＳとアプリケーションプログラムとが含まれる。仮想計算機のＯＳは、アプリケーションプログラムに比較して、より高い特権レベルで動作する。
【００２２】
仮想計算機のプログラムが、その実行中に、最も高い特権レベルを必要とする処理を行う場合には、該仮想計算機からハイパーバイザを呼び出し、呼び出したハイパーバイザに、その処理を依頼する。なお、ハイパーバイザの呼び出し方は、プロセッサに仮想化支援機構が搭載されている場合と、それが搭載されていない場合とで、異なる。仮想計算機のＯＳの処理で特権命令違反を発生させることができる場合には、その特権命令違反をトリガとして、ハイパーバイザが呼び出される。仮想化支援機構が搭載されていない場合には、予め、ＯＳのコードに、ハイパーバイザ呼び出しのコードが挿入される。あるいは、プログラムがメモリに読み込まれてから実行されるまでの間の適当なタイミングで、コードが走査され、ハイパーバイザ呼び出しのコードが挿入される。本実施形態は、仮想化支援機構の有無を問わない。
【００２３】
以下では、図１の高可用システムにおいて、サーバ計算機１上で動作する仮想計算機をメインとし、サーバ計算機２上で動作する仮想計算機をクローンとして、説明する。
【００２４】
図２に、メイン側となるサーバ計算機１における、ハイパーバイザの機能ブロックの構成例を示す。
【００２５】
図２において、１はメイン側となるサーバ計算機、１３はＮＩＣ、１４，１５は物理デバイス、１６はディスク（Ｄｉｓｋ）、１００はメイン側のハイパーバイザ、１５０はメイン側の仮想計算機をそれぞれ表している。
【００２６】
また、メイン側ハイパーバイザ１００において、１０１は物理デバイス管理部、１０２は配送先決定部、１０３は仮想デバイス管理部、１０４は同期情報送信部、１０５はカウンタ制御部、１０６は仮想計算機（ＶＭ）実行状態保存部、１０７は中断情報収集部、１０８はハイパーバイザサービス実行部、１０９は復帰情報収集部をそれぞれ表している。
【００２７】
また、仮想デバイス管理部１０３中の１３３、１３６、１３７はそれぞれＮＩＣ、Ｄｉｓｋ、タイマー（Ｔｉｍｅｒ）の仮想デバイスを表している。
【００２８】
メイン側ハイパーバイザ１００内の各部の概要は、次の通りである。
【００２９】
物理デバイス管理部１０１は、物理デバイスを管理する。
【００３０】
配送先決定部１０２は、物理デバイスの状態の配送先を決定する。
【００３１】
仮想デバイス管理部１０３は、仮想デバイスを管理する。
【００３２】
同期情報送信部１０４は、同期情報を送信する。
【００３３】
カウンタ制御部１０５は、パフォーマンスカウンタの制御を行う。パフォーマンスカウンタとしては、プロセッサ１１内のカウンタ１１１を使用することができる。
【００３４】
ＶＭ実行状態保存部１０６は、仮想計算機（ＶＭ）の実行状態を保存する。
【００３５】
中断情報収集部１０７は、メイン側仮想計算機１５０の処理の中断時に、必要な処理を行う。
【００３６】
ハイパーバイザサービス実行部１０８は、本来のハイパーバイザサービスを実行する。
【００３７】
復帰情報収集部１０９は、メイン側仮想計算機１５０の処理の復帰時に、必要な処理を行う。
【００３８】
図３に、クローン側となるサーバ計算機２における、ハイパーバイザの機能ブロックの構成例を示す。
【００３９】
図３において、２はクローン側となる計算機、２３はＮＩＣ、２４，２５は物理デバイス、２６はＤｉｓｋ、２００はクローン側のハイパーバイザ、２５０はクローン側の仮想計算機をそれぞれ表している。
【００４０】
また、クローン側ハイパーバイザ２００において、２０１は物理デバイス管理部、２０２は配送先決定部、２０３は仮想デバイス管理部、２０４は同期情報受信部、２０５はカウンタ制御部、２０６はＶＭ実行状態保存部、２０７は中断状態比較部、２０８はハイパーバイザサービス実行部、２０９は復帰状態設定部、２１０はブレークポイント設定部をそれぞれ表している。
【００４１】
また、仮想デバイス管理部２０３中の２３３、２３６、２３７はそれぞれＮＩＣ、Ｄｉｓｋ、タイマー（Ｔｉｍｅｒ）の仮想デバイスを表している。
【００４２】
なお、図３で示した物理デバイスや仮想デバイスは一例であり、物理デバイスや仮想デバイスの種類や数は任意である。
【００４３】
クローン側ハイパーバイザ２００内の各部の概要は、次の通りである。
【００４４】
物理デバイス管理部２０１は、物理デバイスを管理する。
【００４５】
配送先決定部２０２は、物理デバイスの状態の配送先を決定する。
【００４６】
仮想デバイス管理部２０３は、仮想デバイスを管理する。
【００４７】
同期情報受信部２０４は、同期情報を受信する。
【００４８】
カウンタ制御部２０５は、パフォーマンスカウンタの制御を行う。パフォーマンスカウンタとしては、プロセッサ２１内のカウンタ２１１を使用することができる。
【００４９】
ＶＭ実行状態保存部２０６は、仮想計算機（ＶＭ）の実行状態を保存する。
【００５０】
中断状態比較部２０７は、クローン側仮想計算機２５０の処理の中断時に、必要な処理を行う。
【００５１】
ハイパーバイザサービス実行部２０８は、本来のハイパーバイザサービスを実行する。
【００５２】
復帰状態設定部２０９は、クローン側仮想計算機２５０の処理への復帰時に、必要な処理を行う。
【００５３】
ブレークポイント設定部２１０は、ブレークポイントを設定する。
【００５４】
なお、サーバ計算機１とサーバ計算機２が、それぞれ、メイン側となる構成ための構成（図３）とクローン側となるための構成（図４）を兼ね備え、サーバ計算機１とサーバ計算機２とが、適宜、メインとクローンの役割を交替できるようにしても良い。
【００５５】
以下、ハイパーバイザの構成・動作を中心に説明する。
【００５６】
メイン側となるサーバ計算機１において、メイン側ハイパーバイザ１００は、該サーバ計算機１に接続された物理デバイス（１４，１５等）を管理する。また、メイン側ハイパーバイザ１００は、メイン側仮想計算機１５０に対して、仮想デバイス（１３３，１３６，１３７等）を提供する。仮想デバイスは、メイン側仮想計算機１５０から、デバイスとして認識される。
【００５７】
クローン側となるサーバ計算機１において、クローン側ハイパーバイザ２００は、該サーバ計算機２に接続された物理デバイス（２４，２５等）を管理する。また、クローン側ハイパーバイザ２００は、クローン側仮想計算機２５０に対して、仮想デバイス（２３３，２３６，２３７等）を提供する。仮想デバイスは、クローン側仮想計算機２５０から、デバイスとして認識される。
【００５８】
なお、図２や図３で示した物理デバイスや仮想デバイスは一例であり、物理デバイスや仮想デバイスの種類や数は任意である。
【００５９】
なお、ハイパーバイザの実施形態の一つとして、ハイパーバイザの機能の一部を、管理ドメインと呼ばれる特別な仮想計算機に持たせてもよい。
【００６０】
メイン側ハイパーバイザ１００は、サーバ計算機１に接続された物理デバイスの状態に係る情報のうちで、メイン側仮想計算機１５０から読める情報と、メイン側仮想計算機１５０から読めない情報とを、分別する。この分別は、配送先決定部１０２により行われる。そして、配送先決定部１０２は、前者のメイン側仮想計算機１５０から読める情報のみを、仮想デバイスの状態に反映（コピー）させる。例えば、サーバ計算機１のコンソールが、メイン側仮想計算機１５０に割当てられている場合においては、キーボード入力の情報が、仮想デバイスの状態に反映されるが、該コンソールが、メイン側仮想計算機１５０に割当てられていない場合においては、該キーボード入力の情報は、仮想デバイスの状態には反映されない。
【００６１】
本実施形態では、メイン側となる計算機１上で稼働するメイン側仮想計算機１５０の入力のコピーを、クローン側計算機２に伝え、クローン側仮想計算機２５０に対しても、メイン側仮想計算機１５０と同一の入力を与えることにより、メイン側仮想計算機１５０とクローン側仮想計算機２５０とが同一の挙動を示すよう制御する。
【００６２】
これを実現するために、メイン側ハイパーバイザ１００内の配送先決定部１０２がメイン側仮想計算機１５０の仮想デバイスへの入力と判定した入力情報（同期情報）は、メイン側仮想計算機１５０の仮想デバイスの状態に反映されるとともに、同期情報送信部１０４により、クローン側となる計算機２上のクローン側ハイパーバイザ２００に送付される。
【００６３】
この入力情報（同期情報）は、クローン側ハイパーバイザ２００の同期情報受信部２０４により、受け取られる。受け取られた入力情報は、クローン側仮想計算機２５０の仮想デバイスの状態に反映される。
【００６４】
これによって、クローン側仮想計算機２５０は、メイン側仮想計算機１５０と同一の入力データを受け取ることとなる。
【００６５】
メイン側ハイパーバイザ１００とクローン側ハイパーバイザ２００との間の仮想計算機間の入力データのコピーや、その他、仮想計算機の同期に必要な情報を含む同期情報の受け渡しは、同期情報送信部１０４と同期情報受信部２０４との間でなされる。なお、実際のデータの伝達経路は、計算機１が持つ通信装置１３、両計算機１，２を繋ぐネットワーク、計算機２の通信装置２３を通ることになる。
【００６６】
この入力データのコピーを実現するために、メイン側ハイパーバイザ１００の同期情報送信部１０４と、クローン側ハイパーバイザ２００の同期情報受信部２０４には、それぞれ、通信相手を特定するための情報が管理されている。通信相手を特定するための情報としては、例えば、相手の計算機のネットワークアドレス（例えばＩＰアドレスやポート番号など）である。また、例えば、ハイパーバイザが複数の仮想計算機を管理している場合には、該複数の仮想計算機のうちの何れの仮想計算機であるかを識別する仮想計算機の識別情報（ＩＤ）も、通信相手を特定するための情報の一部として、必要になる。なお、通信相手を特定するための情報は、仮想計算機の起動前に人手で設定するようにしても良いし、別のモジュールが自動的に設定するようにしても良い。
【００６７】
一般的に、仮想計算機は、複数の仮想デバイスを持っている。計算機１の物理デバイスの状態に係る情報のうちで、メイン側ハイパーバイザ１００の配送先決定部１０２が仮想デバイスの状態に反映させると決定した情報は、同期情報送信部１０４を介して、クローン側ハイパーバイザ２００に送られる。この情報には、反映すべき対象の仮想デバイスを特定するための仮想デバイスの識別情報（ＩＤ）と、その仮想デバイスの状態に係る情報が含まれる。
【００６８】
一般的に、ハイパーバイザは、実行中の仮想計算機の処理が、ハイパーバイザ呼び出しや割り込みなどで中断すると、その中断した要因に応じたサービスを実行した後、次に実行すべき仮想計算機を選定して、その仮想計算機に処理を渡す。本実施形態では、ハイパーバイザサービス実行部１０８，２０８が、その役割を担当する。
【００６９】
メイン側となるサーバ計算機１においては、メイン側仮想計算機１５０からメイン側ハイパーバイザ１００に制御が移る際に、ＶＭ実行状態保存部１０６にてメイン側仮想計算機１５０の実行状態を保存した後に、中断情報収集部１０７により、仮想計算機の処理が中断した要因を調査し、中断の要因に応じた同期情報（情報の内容については後述）を収集し、同期情報送信部１０４からクローン側ハイパーバイザ２００へ、該中断の要因に応じた同期情報を送信する。さらに、メイン側ハイパーバイザ１００が、次に制御を移す仮想計算機として、メイン側仮想計算機１５０を選定した場合に、復帰情報収集部１０９により、メイン側仮想計算機１５０を復帰させる際の状態を調査し、復帰時の状態に応じた同期情報（情報の内容については後述）を収集し、同期情報送信部１０４からクローン側ハイパーバイザ２００へ、該復帰時の状態に応じた同期情報を送信する。
【００７０】
クローン側となる計算機２においては、同期情報受信部２０４が受信したメイン側仮想計算機１５０の復帰の状態と、その後に再度処理が中断され、クローン側ハイパーバイザ２００に制御が移る際の状態とを利用して、復帰状態設定部２０９により、クローン側仮想計算機２５０の復帰状態の準備を行う。また、メイン側仮想計算機１５０の中断状態が割り込みであった場合に、ブレークポイント設定部２１０により、ブレークポイントを設定して、クローン側仮想計算機２５０に制御を移す。
【００７１】
さて、メイン側仮想計算機１５０の実行状態とクローン側仮想計算機２５０の実行状態とを合わせるためには、仮想デバイスの情報をコピーして、入力情報の一致を図ろうとするだけでは不十分であり、両仮想計算機に仮想デバイスの情報が取り込まれるタイミングを、一致させる必要がある。
【００７２】
具体的には、ハイパーバイザ呼び出し、例外の発生、仮想デバイスの状態に係る情報の更新、割り込みの発生などの事象（イベント）の起きる順序関係が、メイン側ハイパーバイザ１００側とクローン側ハイパーバイザ２００側とで、同一になるようにする必要がある。
【００７３】
さらに、割り込みは、両仮想計算機の実行過程の中で、同一の状態で発生する必要がある。すなわち、メイン側仮想計算機１５０とクローン側仮想計算機２５０が、仮想計算機が実行している命令列の中の同一の場所（プログラムカウンタ）で、割り込みを受付けないと、実行状態の一致を図ることができない。
【００７４】
この点について、図４と図５を参照しながら説明する。なお、図４と図５において、ＨＶ１はメイン側ハイパーバイザ、ＨＶ２はクローン側ハイパーバイザ、ＶＭ１はメイン側仮想計算機、ＶＭ２はクローン側仮想計算機をそれぞれ表す。
【００７５】
ハイパーバイザ呼び出しや例外は、プログラム中のどこで発生するか決まっている、決定的な事象であるが、割り込みは、プログラム中のどこで発生するかが分からない、非決定的な事象であるので、図４の２台のサーバ計算機を同時実行した場合に、ハイパーバイザ呼び出しや例外については、４０１のように、両サーバ計算機１，２で同じ遷移状態になるが、割り込みについては、４０２のように、異なる遷移状態になる。
【００７６】
そこで、本実施形態では、まず、図５のように、先に、メイン側となるサーバ計算機１において、メイン側仮想計算機１５０を実行し、それより少し遅延して、クローン側となるサーバ計算機２において、クローン側仮想計算機２５０を実行する。そして、メイン側となるサーバ計算機１において、メイン側仮想計算機１５０における、割り込み発生のタイミング（具体的には、基準となる時点（例えば、前回の仮想計算機への復帰の時点）からの実行命令数）を調べ、その情報を、メイン側ハイパーバイザ１００からクローン側ハイパーバイザ２００へ伝え、クローン側ハイパーバイザ２００において、ブレークポイント設定部２１０により、その情報に従って、クローン側仮想計算機２５０でも同一のタイミングで割込みが発生するように、ブレークポイントを設定して、５０２のように、同じ遷移状態にする。なお、ハイパーバイザ呼び出しや例外は、上記のように決定的な事象であるので、上記ブレークポイントの設定をせずとも、５０１のように、同じ遷移状態になる。
【００７７】
本実施形態では、メイン側仮想計算機１５０とクローン側仮想計算機２５０において、割り込みタイミングを合わせるためのカウンタの制御を、カウンタ制御部１０５とカウンタ制御部２０５のそれぞれにて行う。また、このカウンタの値に従って、ブレークポイント設定部２１０により、ブレークポイントの設定を行う。
【００７８】
さて、メイン側ハイパーバイザ１００の同期情報送信部１０４とクローン側ハイパーバイザ２００の同期情報受信部２０４は、仮想デバイスの状態に係る情報だけでなく、メイン側となる計算機１内で起きる以下の事象が起きる度に、その情報を伝達する。  
（Ａ）メイン側仮想計算機１５０が発行したハイパーバイザ呼び出し  
（Ｂ）上記ハイパーバイザ呼び出しに対応するメイン側ハイパーバイザ１００の応答  
（Ｃ）例外の捕捉  
（Ｄ）上記例外に対応するメイン側仮想計算機１５０の例外ハンドラ呼び出し  
（Ｅ）割り込みの捕捉
（Ｆ）上記割り込みに対応するメイン側仮想計算機１５０の割り込みハンドラ呼び出し
まず、メイン側となる計算機１におけるメイン側ハイパーバイザ１００の各事象に対する処理について説明する。
【００７９】
（Ａ）ハイパーバイザ呼び出しは、メイン側仮想計算機１５０が決定的に起こす事象であり、仮想計算機が外部に対して起こす出力であるため、事象の発生を、クローン側ハイパーバイザ２００に伝達すれば良い。よって、送信する同期情報には、「ハイパーバイザ呼び出しの種類」と「引数の情報」が含まれれば良い（さらに「待避されたレジスタの内容」等を送っても良い）。なお、ハイパーバイザが複数の仮想計算機を管理している場合には、メイン側仮想計算機１５０が起こすハイパーバイザ呼び出しのみが対象となり、その他の仮想計算機から発生するハイパーバイザ呼び出しは対象とならない。
【００８０】
（Ｂ）ハイパーバイザ呼び出しに対するメイン側ハイパーバイザ１００の応答を返す場合には、応答の内容が、メイン側仮想計算機１５０の入力となるため、応答の内容を、クローン側ハイパーバイザ２００に伝達すれば良い。なお、応答の情報としては、ハイパーバイザと仮想計算機の間のインタフェースの設計の仕方により様々な情報（例えば、ＣＰＵのレジスタ、スタック、ハイパーバイザと仮想計算機が共有するメモリ空間、イベントチャネルなど）が考えられる。よって、送信する同期情報には、「ハイパーバイザ呼び出しの応答情報」と、「応答経路の情報」が含まれれば良い。
【００８１】
（Ｃ）例外の捕捉は、メイン側仮想計算機１５０が決定的に起こす事象であり仮想計算機が外部に対して起こす出力であるため、事象の発生を、クローン側ハイパーバイザ２００に伝達すれば良い。よって、送信する同期情報には、「例外の内容」が含まれれば良い。なお、ハイパーバイザが複数の仮想計算機を管理している場合には、メイン側仮想計算機１５０が起こす例外のみが対象となり、その他の仮想計算機から発生する例外は対象とならない。
【００８２】
（Ｄ）例外に対応するメイン側仮想計算機１５０の例外ハンドラを呼び出す場合、ハイパーバイザとして、その例外に対する特別な処理が不要な場合は、例外ハンドラの呼び出しを、クローン側ハイパーバイザ２００に伝えれば良い。よって、送信する同期情報には、「例外ハンドラ呼び出しの実行を示す情報」が含まれれば良い。一方、ハイパーバイザとしてのその例外に対する特別な処理が必要な場合は、その処理内容を、クローン側ハイパーバイザ２００に伝えれば良い。
【００８３】
（Ｅ）計算機に発生する割り込みは、それに対応する処理の担い手が、メイン側ハイパーバイザ１００自身である場合と、メイン側仮想計算機１５０の場合と、メイン側ハイパーバイザ１００が管理する、その他（メイン側仮想計算機１５０以外）の仮想計算機の場合とがある。「メイン側仮想計算機１５０が処理する割り込み」以外の割り込みに関しては、メイン側仮想計算機１５０からは、その事象が完全に隠蔽されるため、クローン側ハイパーバイザ２００に伝達する必要はない。メイン側ハイパーバイザ１００は、メイン側仮想計算機１５０の割り込みハンドラを呼ぶ必要のある事象の情報のみを、クローン側ハイパーバイザ２００に伝達すれば良い。メイン側仮想計算機１５０の割り込みハンドラが起動される場合には、Ｉ／Ｏ機器のハードウェアが発行する割り込みの他に、例えば、ハードウェア割り込みとは独立に、ハイパーバイザや他の仮想計算機が、メイン側仮想計算機１５０に事象を伝達するために発生させるソフトウェア割り込みがある。例えば、Ｘｅｎにおけるドメイン間割り込みなどが、これに該当する。
【００８４】
さらに、クローン側仮想計算機２５０側で、同じ処理過程で割り込みによる処理の中断とハンドラ呼び出しを再現するために、割り込み位置の情報（すなわち、メイン側仮想計算機１５０の割り込みが発生した場所を特定するための情報）として、プログラムカウンタの値やパフォーマンスカウンタによる実行命令数の情報を収集する。
【００８５】
以上から、送信する同期情報には、「割り込みハンドラが起動されるメイン側仮想計算機１５０の識別情報（ＩＤ）」と「例外の情報（ベクタ番号）」、「割り込み位置の情報」が含まれていれば良い。
【００８６】
（Ｆ）（Ｅ）で補足した割り込みを処理するハンドラ呼び出しに関する情報（ベクタ番号など）を、クローン側ハイパーバイザ２００に送れば良い。
【００８７】
次に、上記した情報を送られる、クローン側となる計算機２におけるクローン側ハイパーバイザ２００の各事象に対する処理について説明する。
【００８８】
クローン側ハイパーバイザ２００は、メイン側ハイパーバイザ１００から送られてくる同期情報を待ち行列に格納し、該待ち行列の先頭の同期情報から、順次、処理をしていく。以下、待ち行列に格納された同期情報に対する処理について説明する。
【００８９】
（Ａ）同期情報がハイパーバイザ呼び出しである場合は、該ハイパーバイザ呼び出しは、メイン側仮想計算機１５０と同様に、クローン側仮想計算機２５０が決定的に起こす事象である。そこで、クローン側仮想計算機２５０に制御を移し、当該ハイパーバイザ呼び出しが発行されるのを待つ。クローン側仮想計算機２５０がハイパーバイザ呼び出しを発行したら、該ハイパーバイザ呼び出しが、同期情報に記載されたハイパーバイザ呼び出しと同じであることを、確認するだけで良い。この確認がとれたら、同期情報は、待ち行列から削除される。
【００９０】
なお、このハイパーバイザ呼び出しに対する応答は、メイン側ハイパーバイザ１００から送られてくる同期情報に含まれる「（Ｂ）ハイパーバイザ呼び出しに対する応答」の内容に従い、クローン側ハイパーバイザ２００内での独自の対応は行わない。
【００９１】
（Ｂ）同期情報がハイパーバイザ呼び出しに対するメイン側ハイパーバイザ１００の応答である場合には、メイン側ハイパーバイザ１００の応答内容を、そのまま、クローン側仮想計算機２５０へ返す準備をする。具体的には、同期情報に含まれている応答経路に、応答内容を格納する。なお、ここでは、すぐにクローン側仮想計算機２５０には制御を渡さず、この同期情報を待ち行列から削除し、次の同期情報の処理へと進む。
【００９２】
（Ｃ）同期情報が例外の捕捉である場合、該例外の捕捉は、メイン側仮想計算機１５０と同様に、クローン側仮想計算機２５０が決定的に起こす事象である。そこで、クローン側仮想計算機２５０に制御を移し、当該ハイパーバイザ呼び出しが発行されるのを待つ。クローン側仮想計算機２５０から例外によりクローン側ハイパーバイザ２００に制御が移ったら、該例外が、この同期情報に記載された例外と同一であることを、確認するだけで良い。この確認がとれたら、同期情報は、待ち行列から削除される。
【００９３】
なお、このハイパーバイザ呼び出しに対する応答は、メイン側ハイパーバイザ１００から送られてくる同期情報に含まれる「（Ｄ）例外に対する応答」を処理するまで遅延すれば良い。
【００９４】
（Ｄ）同期情報が例外ハンドラ呼び出しの場合、ハイパーバイザとして、その例外に対する特別な処理が不要な場合は、クローン側仮想計算機２５０の例外ハンドラの呼び出しを行えば良い。なお、ここでは、すぐにはハンドラを呼び出さず、この同期情報を待ち行列から削除し、次の同期情報の処理へと進む。
【００９５】
（Ｅ）同期情報が割り込みハンドラ呼び出しの場合、同期情報に含まれる割り込み位置の情報を参照して、疑似割り込みを発生させる場所を決定する。次に、プロセッサの持つブレークポイント機能や、一定命令数実行後に割り込みを発生させるパフォーマンスカウンタに、疑似割り込みポイントまでの命令数を設定するなどの処置を講じてから、クローン側仮想計算機２５０に制御を渡し、疑似割り込み地点で発生する例外を待つ。
【００９６】
（Ｆ）同期情報に示されている割り込みベクタなどの情報を参照し、割り込みハンドラの起動準備を行う。
【００９７】
以上の一連の処理をメイン側ハイパーバイザ１００とクローン側ハイパーバイザ２００とがそれぞれ協調して行うことにより、メイン側仮想計算機１５０とクローン側仮想計算機２５０への入力が完全に一致し、実行状態の同期が実現できる。
【００９８】
なお、本実施形態では、同期情報送信部１０４と同期情報受信部２０４をハイパーバイザ内にあるとしたが、ネットワーク通信に必要な通信プロトコル処理など、仮想マシン側が持つ機能を活用するために、（メイン側仮想計算機１５０やクローン側仮想計算機２５０とは異なる）管理ドメインと呼ばれる別の仮想マシンを、計算機１と計算機２上にそれぞれ配備し、同期情報送信部１０４と同期情報受信部２０４の一部をそれぞれ持たせる構成も可能である。
【００９９】
次に、メイン側となるサーバ計算機１におけるハイパーバイザであるメイン側ハイパーバイザ１００の動作手順について説明する。
【０１００】
図６に、メイン側ハイパーバイザ１００の動作手順の一例を示す。
【０１０１】
なお、図６において、ＨＶ２はクローン側ハイパーバイザ、ＶＭ１はメイン側仮想計算機、ＶＭ２はクローン側仮想計算機をそれぞれ表す。
【０１０２】
メイン側ハイパーバイザ１００において、ハイパーバイザサービス実行部１０８は、メイン側仮想計算機１５０を生成する（ステップＳ１０１）。
【０１０３】
メイン側仮想計算機１５０の生成を、クローン側ハイパーバイザ２００に通知する（ステップＳ１０２）。
【０１０４】
カウンタ制御部１０５は、パフォーマンスカウンタ（以下、カウンタ）を初期化し、実行命令数のカウントを開始し、メイン側仮想計算機１５０を起動する（ステップＳ１０３）。
【０１０５】
ここで、一旦、メイン側仮想計算機１５０内の処理に移る（ステップＳ１０４）。そして、ハイパーバイザ呼出し、例外又は割り込みが発生すると、メイン側ハイパーバイザ１００に処理が戻る。
【０１０６】
ハイパーバイザ呼出し、例外又は割り込みが発生して、メイン側ハイパーバイザ１００に処理が戻ると、メイン側ハイパーバイザ１００において、カウンタ制御部１０５は、カウンタを停止し、カウンタを退避する（ステップＳ１０５）。
【０１０７】
次に、中断情報収集部１０７にてメイン側仮想計算機１５０の処理が中断した要因を調査する。
【０１０８】
遷移の要因が、ハイパーバイザ呼出しである場合（ステップＳ１０６）、同期情報送信部１０４からクローン側ハイパーバイザ２００の同期情報受信部２０４へ、呼び出しに係る同期情報を送信し（ステップＳ１０７）、メイン側ハイパーバイザ１００内部の処理に移る（ステップＳ１１１）。
【０１０９】
遷移の要因が、例外である場合（ステップＳ１０６）、同様に、例外に係る同期情報を送信し（ステップＳ１０９）、メイン側ハイパーバイザ１００内部の処理に移る（ステップＳ１１１）。
【０１１０】
遷移の要因が、割り込みである場合（ステップＳ１０６）、メイン側仮想計算機１５０に配送される割り込みであるならば（ステップＳ１０８）、同様に、割り込みに係る同期情報を送信し（ステップＳ１１０）、メイン側ハイパーバイザ１００内部の処理に移る（ステップＳ１１１）。メイン側仮想計算機１５０に配送される割り込みでないならば（ステップＳ１０８）、ステップＳ１１０をスキップして、メイン側ハイパーバイザ１００内部の処理に移る（ステップＳ１１１）。メイン側ハイパーバイザ１００内部の処理は、ハイパーバイザサービス実行部１０８が行う。
【０１１１】
さて、ステップＳ１１１の次に、ハイパーバイザサービス実行部１０８は、制御を移す仮想計算機を決定する（ステップＳ１１２）。
【０１１２】
起動する仮想計算機が、メイン側仮想計算機１５０ではなく、他の仮想計算機である場合（ステップＳ１１３）、一旦、当該他の仮想計算機内の処理を行い（ステップＳ１１４）、その後、ステップＳ１１１のメイン側ハイパーバイザ１００内の処理に戻る。
【０１１３】
起動する仮想計算機が、メイン側仮想計算機１５０である場合（ステップＳ１１３）、ステップＳ１１５以降の処理を行う。
【０１１４】
さて、ステップＳ１１３にて、起動する仮想計算機が、メイン側仮想計算機１５０である場合に、メイン側ハイパーバイザ１００に処理が戻ると、メイン側ハイパーバイザ１００において、復帰情報収集部１０９にて、メイン側仮想計算機１５０を復帰させる際の状態を調査する。
【０１１５】
復帰時の状態が、ハイパーバイザ呼出しからの復帰である場合（ステップＳ１１５）、同期情報送信部１０４からクローン側ハイパーバイザ２００の同期情報受信部２０４へ、ハイパーバイザ呼出しの応答要求を送信し（ステップＳ１１６）、復帰情報収集部１０９にて、ハイパーバイザ呼出しの応答内容をメイン側仮想計算機１５０に返す準備を行い（ステップＳ１１７）、カウンタ制御部１０５にて、カウンタをクリアして、カウントを開始し（ステップＳ１１８）、ハイパーバイザサービス実行部１０８にて、メイン側仮想計算機１５０を復帰する（ステップＳ１１９）。以降は、上記ステップＳ１１４からの繰り返しである。
【０１１６】
復帰時の状態が、例外である場合（ステップＳ１１５）、同様に、ハンドラ呼出しに係る同期情報を送信し（ステップＳ１２１）、カウンタをクリアして、カウントを開始し（ステップＳ１２２）、メイン側仮想計算機１５０のハンドラ呼出しを行う（ステップＳ１２３）。以降は、上記ステップＳ１１４からの繰り返しである。
【０１１７】
復帰時の状態が、割り込みからの復帰である場合（ステップＳ１１５）、メイン側仮想計算機１５０に配送される割り込みであるならば（ステップＳ１２０）、上記ステップＳ１２１以降を行う。メイン側仮想計算機１５０に配送される割り込みでないならば（ステップＳ１２０）、カウンタ制御部１０５にて、退避されていたカウンタを復帰し、カウントを開始し（ステップＳ１２４）、ハイパーバイザサービス実行部１０８にて、メイン側仮想計算機１５０を復帰する（ステップＳ１２５）。以降は、上記ステップＳ１１４からの繰り返しである。
【０１１８】
次に、クローン側となるサーバ計算機２におけるハイパーバイザであるクローン側ハイパーバイザ２００の動作手順について説明する。
【０１１９】
図７に、クローン側ハイパーバイザ２００の動作手順の一例を示す。
【０１２０】
なお、図７において、ＨＶ１はメイン側ハイパーバイザ、ＶＭ１はメイン側仮想計算機、ＶＭ２はクローン側仮想計算機をそれぞれ表す。
【０１２１】
また、メイン側ハイパーバイザ１００から受信した同期情報は、同期情報バッファ（待ち行列）に格納されるものとする。
【０１２２】
クローン側ハイパーバイザ２００において、ハイパーバイザサービス実行部２０８は、メイン側ハイパーバイザ１００から、メイン側仮想計算機１５０の生成の通知を受信すると（ステップＳ２０１）、クローン側仮想計算機２５０を生成する（ステップＳ２０２）。
【０１２３】
次に、復帰状態設定部２０９は、同期情報バッファの先頭の復帰状態を取り出して検査する（ステップ２０３）。
【０１２４】
復帰時の状態が、ハイパーバイザ呼出しからの復帰である場合（ステップＳ２０４）、復帰状態設定部２０９にて、ハイパーバイザ呼出しの応答要求を準備し（ステップＳ２０５）、ステップＳ２０８に進む。
【０１２５】
復帰時の状態が、例外である場合（ステップＳ２０４）、例外ハンドラ呼出しを準備し（ステップＳ２０６）、ステップＳ２０８に進む。
【０１２６】
復帰時の状態が、割り込みからの復帰である場合（ステップＳ２０４）、同期情報に含まれるベクタ情報を参照し、割り込みハンドラ呼出しを準備し（ステップＳ２０７）、ステップＳ２０８に進む。
【０１２７】
次に、ステップＳ２０８で、中断状態比較部２０７は、同期情報バッファの先頭の中断状態を取り出して検査する（ステップ２０８）。
【０１２８】
中断状態が、割り込みである場合（ステップＳ２０９）、ブレークポイント設定部２１０にて、割り込み発生位置で停止するように、カウンタに、ブレークポイントを設定し（ステップＳ２１０）、ハイパーバイザサービス実行部２０８にて、クローン側仮想計算機２５０に制御を移す（ステップＳ２１１）。
【０１２９】
中断状態が、呼び出しからの復帰または例外である場合（ステップＳ２０９）、ステップＳ２１０をスキップして、クローン側仮想計算機２５０に制御を移す（ステップＳ２１１）。
【０１３０】
ここで、一旦、クローン側仮想計算機２５０内の処理に移る（ステップＳ２１２）。そして、クローン側仮想計算機２５０内の処理が停止すると、クローン側ハイパーバイザ２００に処理が戻る。
【０１３１】
クローン側ハイパーバイザ２００に処理が戻ると、カウンタを停止し（ステップＳ２１３）、中断状態比較部２０７にて、クローン側仮想計算機２５０の中断状態と、同期情報バッファの先頭の中断状態情報とを比較する（ステップＳ２１４）。
【０１３２】
比較の結果、所望の停止位置でない場合（ステップＳ２１５）、カウンタを再開して（ステップＳ２１６）、クローン側仮想計算機２５０内の処理に戻る（ステップＳ２１７）。
【０１３３】
比較の結果、所望の停止位置である場合（ステップＳ２１５）、クローン側ハイパーバイザ２００内部の処理に移る（ステップＳ２１７）。クローン側ハイパーバイザ２００内部の処理は、ハイパーバイザサービス実行部２０８が行う。
【０１３４】
さて、ステップＳ２１７の次に、ハイパーバイザサービス実行部２０８は、制御を移す仮想計算機を決定する（ステップＳ２１８）。
【０１３５】
起動する仮想計算機が、クローン側仮想計算機２５０ではなく、他の仮想計算機である場合（ステップＳ２１９）、一旦、当該他の仮想計算機内の処理を行い（ステップＳ２２０）、その後、ステップＳ２１７のクローン側ハイパーバイザ２００内の処理に戻る。
【０１３６】
起動する仮想計算機が、クローン側仮想計算機２５０である場合（ステップＳ２１９）、ステップＳ２０３に戻り、これまでの処理を繰り返す。
【０１３７】
以下では、クローン側仮想計算機２５０で発生する割り込みタイミングを、メイン側仮想計算機１５０で発生した割り込みタイミングに合わせるためのタイミング制御の方法について、詳しく説明する。
【０１３８】
プロセッサには、「所望の命令数が実行されたところで割り込みをかけることによって、遅延なく、処理を停止させることのできる機能」を有するプロセッサがある。このタイプのプロセッサにおいては、該機能を上記タイミング制御にそのまま利用することによって、メイン側仮想計算機１５０で割り込みが生じた場所と同じ場所で、クローン側仮想計算機２５０の実行を停止させることができる。
【０１３９】
一方、「所望の命令数が実行されたところで割り込みをかけることによって、所定の割り込みの遅延の後に、処理を停止させることのできる機能」を有するプロセッサがある。例えば、Ｉｎｔｅｌ社のＰｅｎｔｉｕｍ（登録商標）プロセッサが、これに該当する。該機能を上記タイミング制御に使った場合、所望の命令数が実行されたところで割り込みをかけると、割り込みの遅延により、実際に処理が停止する場所が少しずれてしまう。よって、このタイプのプロセッサでは、実行命令数を単純に利用しても、メイン側仮想計算機１５０で発生した割り込み場所と同じ場所で、クローン側仮想計算機２５０を停止させることができない。そこで、例えば以下のような処理を施すことにより、メイン側仮想計算機１５０とクローン側仮想計算機２５０とで実行位置を合わせることができる。
【０１４０】
Ｉｎｔｅｌ社のＰｅｎｔｉｕｍプロセッサには、実行命令数を計測するレジスタがある（このレジスタは、パフォーマンスカウンタと呼ばれる）。プロセッサの実行命令数をこのレジスタを使ってカウントする際に、このレジスタにおいてカウンタオーバーフローが生じると割り込み(Performance Monitor Interrupt)を発生させるように、設定を行うことが可能である（なお、プロセッサのモデルにより、割り込みがかけられないものもある）。
【０１４１】
例えば、メイン側仮想計算機１５０とクローン側仮想計算機２５０とで実行位置を合わせるために、１００命令実行後に割り込みを発生させるべき場合に、この割り込み機能において、カウンタの初期値に−９９をセットしてから、実行を開始したものとする。すると、１００命令実行した時点で、カウンタの値が−１から０へと変化し、これによって、オーバフローが生じて割り込みが引き起こされる。しかし、実際の割り込みの発生は多少遅延するため、実際には、“１００命令”ではなく“１００命令＋数命令”が実行された後に、割り込みがかかる。この遅延量は不定であるため、遅延を考慮して、割り込みがかかるまでの実行命令数が少なくなるよう、カウンタの初期値を設定する。例えば、メイン側仮想計算機１５０側で１００命令実行後に割り込みがかっている場合は、クローン側計算機のパフォーマンスカウンタには、−９９ではなく、例えば−９０のように、確実に手前で割り込みがかかるような値を設定する。この減算量（この例では１０命令）は、プロセッサの規格や実測による経験則などで、確実に手前で止められる値を設定すればよく、値の決定方法については問わない。
【０１４２】
次に、停止位置が所望の場所を過ぎてしまわないように、余裕を持たせて数命令手前で停止したクローン側仮想計算機２５０の停止位置を、メイン側仮想計算機１５０の割り込みが発生した位置まで進める方法について説明する。
【０１４３】
これには、幾つかの方法があるが、例えば、トレース実行状態で１命令ずつクローン側仮想計算機２５０の処理を進めて、メイン側仮想計算機１５０の停止位置と同じになるまでステップ実行を行う方法がある。他の方法としては、通常のデバックで利用される実行アドレスに対してブレークポイントを設定する方法を利用して、メイン側仮想計算機１５０の割り込みが発生したアドレスにブレークポイントを仕掛けてから、クローン側仮想計算機２５０の実行を再開させる方法がある。
【０１４４】
ブレークポイントによる割り込みでは、確実に同じアドレスでクローン側仮想計算機２５０の実行を止めることができるが、ループの中を実行中である場合、割り込みアドレスは同じであるが、まだ実行命令数がメイン側仮想計算機１５０の命令数に達していないことが考えられる。このため、ブレークポイントで停止したら、パフォーマンスカウンタの値を参照して、所望の停止位置であるかどうかを判定する必要がある。
【０１４５】
図８に、ステップ実行により所望の場所まで処理を進める場合の処理手順の一例を示す。
【０１４６】
まず、同期情報に含まれるメイン側仮想計算機１５０の実行命令数から所定の値を減算した値を算出し、その命令数だけ実行したところで、カウンタがオーバフローするように、初期値を設定する（ステップＳ３０１）。例えば、メイン側仮想計算機１５０の実行命令数がＮｍで、所定の減算数がＮａであった場合には、設定するカウンタの値Ｃを  
Ｃ＝（Ｎｍ−Ｎａ）＊（−１）  
などと設定すればよい。
【０１４７】
パフォーマンスカウンタに上記の値をセットした後に、クローン側仮想計算機２５０に制御を移す（ステップＳ３０２）。
【０１４８】
なお、パフォーマンスカウンタがオーバフローする前に、クローン側仮想計算機２５０で割り込みが発生して、クローン側仮想計算機２５０の処理が中断し、その処理をクローン側ハイパーバイザ２００が行う場合がある。その場合は、パフォーマンスカウンタのカウントを中断し、割り込み処理が終了して再びクローン側仮想計算機２５０に制御が移る際に、カウンタを再開すればよい（この他の要因による割り込みについては、非決定的であるため、図８には記載していない）。
【０１４９】
クローン側仮想計算機２５０の処理の実行中に、パフォーマンスカウンタがオーバーフローを起こして、割り込みが発生したら（ステップＳ３０３）、パフォーマンスカウンタを停止し（ステップＳ３０４）、割り込み場所のプログラムカウンタとパフォーマンスカウンタ情報を取得し、メイン側仮想計算機１５０の割り込み場所と同じであるかを比較する（ステップＳ３０５）。
【０１５０】
異なる場合は、所望の場所になるまでステップ実行を繰り返す（ステップＳ３０５，Ｓ３０６）。
【０１５１】
ステップＳ３０５で所望の場所に到達したら、クローン側仮想計算機２５０の処理を停止させて（ステップＳ３０７）、次の同期情報に従い、イベントをクローン側仮想計算機２５０に伝達する。
【０１５２】
図９に、ステップ実行により所望の場所まで処理を進める場合の処理手順の他の例を示す。
【０１５３】
まず、同期情報に含まれるメイン側仮想計算機１５０の実行命令数から所定の値を減算した値を算出し、その命令数だけ実行したところで、カウンタがオーバフローするように、初期値を設定する（ステップＳ４０１）。
【０１５４】
パフォーマンスカウンタに上記の値をセットした後に、クローン側仮想計算機２５０に制御を移す（ステップＳ４０２）。
【０１５５】
クローン側仮想計算機２５０の処理の実行中に、パフォーマンスカウンタがオーバフローを起こして、割り込みが発生したら（ステップ４０３）、パフォーマンスカウンタを停止し（ステップＳ４０４）、割り込み場所のプログラムカウンタとパフォーマンスカウンタ情報を取得し、メイン側仮想計算機１５０の割り込み場所と同じであるかを比較する（ステップＳ４０５）。
【０１５６】
異なる場合は、所望の場所になるまで、Ｓ４０５，Ｓ４０６，Ｓ４０７，Ｓ４０８，Ｓ４０４のループ処理を繰り返す。
【０１５７】
すなわち、ステップＳ４０５で異なる場合は、まだ所望の場所に到達していないので、同期情報に含まれるメイン側仮想計算機１５０の割り込み場所のプログラムカウンタの情報を元に、クローン側仮想計算機２５０のアドレスにブレークポイントを設定する（ステップＳ４０５，Ｓ４０６）。このブレークポイントは、ＣＰＵのデバック用のレジスタで停止位置を指定する方法や、メモリ内にブレークポイント用の命令を挿入する方法があるが、どのような方法でも構わない。
【０１５８】
ブレークポイントを設定したら、パフォーマンスカウンタのカウントを再開させて、クローン側仮想計算機２５０に制御を移し（ステップＳ４０７）、ブレークポイントに到達するのを待つ。ブレークポイントに到達したら（ステップＳ４０８）、パフォーマンスカウンタを停止させて（ステップＳ４０４）、停止場所が所望の場所かどうかの判定を行う（ステップＳ４０５）。
【０１５９】
ステップＳ４０５で所望の場所に到達したら、クローン側仮想計算機２５０の処理を停止させて（ステップＳ４０９）、次の同期情報に従い、イベントをクローン側仮想計算機２５０に伝達する。
【０１６０】
なお、ブレークポイントを設定してクローン側仮想計算機２５０に制御を移した後に、ブレークポイントではない他の要因で割り込みが発生する場合があるが、この場合も、割り込み処理から復帰するまで、パフォーマンスカウンタのカウントを中断させればよい。
【０１６１】
以上の方法により、メイン側仮想計算機１５０において非決定的な割り込みにより処理が中断した場所と同じ場所で、クローン側仮想計算機２５０における処理を停止させることが可能になる。この状態で、メイン側と同じ割り込みベクタをクローン側仮想計算機２５０内で呼べば、クローン側仮想計算機２５０でも、同じ場所で割り込み処理が起動されることになる。
【０１６２】
以上のように本実施形態によれば、独立した２台の計算機上で稼働する仮想計算機の実行状態が同一になり、二重化が達成される。このため、メイン側仮想計算機の稼働する計算機が、故障により停止した場合にでも、クローン側仮想計算機が、同じ処理を継続でき、これによって、故障を隠蔽することができる。このように、本実施形態により、仮想計算機の可用性を向上させることができる。
【０１６３】
なお、以上の各機能は、ソフトウェアとして記述し適当な機構をもったコンピュータに処理させても実現可能である。  
また、本実施形態は、コンピュータに所定の手順を実行させるための、あるいはコンピュータを所定の手段として機能させるための、あるいはコンピュータに所定の機能を実現させるためのプログラムとして実施することもできる。加えて該プログラムを記録したコンピュータ読取り可能な記録媒体として実施することもできる。
【０１６４】
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【図面の簡単な説明】
【０１６５】
【図１】本発明の一実施形態に係る高可用システムの概略構成例を示す図
【図２】メイン側となるサーバ計算機におけるハイパーバイザの機能ブロックの構成例を示す図
【図３】クローン側となるサーバ計算機におけるハイパーバイザの機能ブロックの構成例を示す図
【図４】仮想計算機の処理に対する割り込みのタイミングに関する制御について説明するための図
【図５】仮想計算機の処理に対する割り込みのタイミングに関する制御について説明するための図
【図６】メイン側となるサーバ計算機におけるハイパーバイザの動作手順の一例を示すフローチャート
【図７】クローン側となるサーバ計算機におけるハイパーバイザの動作手順の一例を示すフローチャート
【図８】クローン側仮想計算機が割り込みタイミングを合わせるための処理手順の一例を示すフローチャート
【図９】クローン側仮想計算機が割り込みタイミングを合わせるための処理手順の他の例を示すフローチャート
【符号の説明】
【０１６６】
１，２…サーバ計算機、１１，２１…プロセッサ、１２，２２…メモリ、１３，２３…通信装置、１４，１５，２４，２５…デバイス、１６，２６…ディスク、１００…メイン側ハイパーバイザ、１０１，２０１…物理デバイス管理部、１０２，２０２…配送先決定部、１０３，２０３…仮想デバイス管理部、１０４…同期情報送信部、１０５，２０５…カウンタ制御部、１０６，２０６…仮想計算機実行状態保存部、１０７…中断情報収集部、１０８，２０８…ハイパーバイザサービス実行部、１０９…復帰情報収集部、１１１，２１１…カウンタ、１３３，１３６，１３７，２３３，２３６，２３７…仮想デバイス、１５０…メイン側仮想計算機、２００…クローン側ハイパーバイザ、２０４…同期情報受信部、２０７…中断状態比較部、２０９…復帰状態設定部、２１０…ブレークポイント設定部、２５０…クローン側仮想計算機
【図１】
0004468426.tif 000002
【図２】
0004468426.tif 000003
【図３】
0004468426.tif 000004
【図４】
0004468426.tif 000005
【図５】
0004468426.tif 000006
【図６】
0004468426.tif 000007
【図７】
0004468426.tif 000008
【図８】
0004468426.tif 000009
【図９】
0004468426.tif 000010