"オリジナル仮想マシンから1つまたは複数のクローン仮想マシンに分岐させて分岐する状態を考察するためのコンピュータに実装される方法であって、前記オリジナル仮想マシン上の実行用のアプリケーションコードを受け取ることであって、前記アプリケーションコードは、前記仮想マシンの2つまたはそれ以上の可能な状態をもたらす少なくとも1つの分岐を含み、前記受け取ったアプリケーションコードを含む前記オリジナル仮想マシンを実行することと、前記仮想マシンの2つまたはそれ以上の可能な状態をもたらす前記オリジナル仮想マシン上で稼働する前記アプリケーションコード内の分岐を識別することと、1つまたは複数のクローン仮想マシンを作成することであって、前記クローン仮想マシンは、前記オリジナル仮想マシンの現在の状態を複製し、次に、それぞれが前記分岐の1つの経路を処理して、作成された当該クローン仮想マシンにおける後続の状態を探索するものであり、前記識別された分岐の異なる経路を実行するために、各クローン仮想マシンをセットアップすることと、前記識別された分岐の少なくとも2つの経路を並列して探索するために、前記オリジナル仮想マシンおよびクローン化仮想マシンを実行することと、前記クローン化仮想マシンから少なくとも1つの実行結果を受け取ることを含み、前述の方法が少なくとも1つのプロセッサにより実行される、方法。前記アプリケーションコードを受け取ることが、前記マシンの前記状態を変化させ、かつ、ランタイムで評価される条件に基づく分岐を含む、アプリケーションコードを受け取ることを含む、請求項1に記載の方法。前記オリジナル仮想マシンを実行することが、同じ物理リソースを共有する複数の仮想マシンの実行を指示するハイパーバイザを含む、請求項1に記載の方法。前記オリジナル仮想マシンを実行することが、所定の閾値を超えて前記仮想マシンを変化させる可能性がある分岐が識別されるまで前記オリジナル仮想マシンを実行することと、前記クローン化仮想マシンが、前記オリジナル仮想マシンインスタンスの外部の任意のリソースに影響を与えることになるかどうかを判定することを含む、請求項1に記載の方法。前記分岐を識別することが、コード解析ツールを使用して前記分岐を自動的に識別することを含む、請求項1に記載の方法。前記分岐を識別することが、前記アプリケーションが複数の可能な状態に分岐するであろう場所を示す情報を、前記アプリケーションコードから受け取ることを含む、請求項1に記載の方法。前記分岐を識別することが、2つまたはそれ以上の分岐経路を識別するアプリケーションプログラミングインターフェースAPIの起動を受け取ることであって、前記起動によりシステムが前記仮想マシンをクローン化し、かつ、前記経路を並列して実行することが可能であることを含む、請求項1に記載の方法。クローン仮想マシンを作成することが、仮想ハードウェアを識別する1つまたは複数の仮想マシン仕様をセットアップすることと、前記オリジナル仮想マシンのメモリの状態をコピーすることと、前記オリジナル仮想マシンにアタッチされた1つまたは複数のディスクをコピーすることとを含む、請求項1に記載の方法。前記クローン仮想マシンを作成することが、前記オリジナル仮想マシンの実行を中断することと、前記仮想マシンに関連する1つまたは複数の物理マシンファイルをコピーすることとを含む、請求項1に記載の方法。各クローンをセットアップすることが、各クローンがどの経路を探索する責任があるのかについての情報を用いて前記クローンをセットアップすることと、次に、前記クローンおよびオリジナル仮想マシンそれぞれにその割り当てられた経路を探索させるために、クローンおよびオリジナル仮想マシンそれぞれを実行することとを含む、請求項1に記載の方法。各クローンをセットアップすることが、前記クローン仮想マシンが実行するであろうソフトウェアコードを識別することと、前記クローン仮想マシンの命令ポインタ及びレジスタの状態を、特定の場所に設定することとを含む、請求項1に記載の方法。少なくとも1つの実行結果を受け取ることが、前記クローン化仮想マシンが到達した状態の標示を受け取ることを含む、請求項1に記載の方法。仮想マシンの分岐および並列実行のためのコンピュータシステムであって、以下のコンポーネント内で具現化されるソフトウェア命令を実行するべく構成されるプロセッサおよびメモリと、2つまたはそれ以上の仮想マシンに物理コンピュータ装置のリソースを割り当て、かつ、仮想マシンをクローン化するためのサポートを提供するハイパーバイザコンポーネントと、物理マシン上でのリソース使用と、オリジナル仮想マシンおよびクローン化仮想マシンを含む2つまたはそれ以上の仮想マシン間のリソース分離と、のスケジューリングを提供するスケジューリングコンポーネントと、2つまたはそれ以上の仮想マシン間に1つまたは複数の通信のチャネルを提供するVM通信コンポーネントと、1つまたは複数のクローン仮想マシンにおいて後続の状態を評価するために、ソフトウェアコードを実行するオリジナル仮想マシンを分岐させるための候補である、現在の状態と、前記ソフトウェアコードの1つまたは複数の前記後続の状態を識別する、分岐識別コンポーネントと、状態情報を前記オリジナル仮想マシンからコピーして、同様の状態を有する1つまたは複数のクローン仮想マシンを作成する、状態クローニングコンポーネントと、各作成された前記クローン仮想マシンを開始させ、かつ、各クローンが追跡する実行の分岐を識別することにより、前記分岐を実行するVM分岐コンポーネントと、各クローン仮想マシンおよび前記オリジナル仮想マシンの動作を調整して、不要な分岐の廃棄または分岐結果の統合を可能にするクローン調整コンポーネントと、各仮想マシンが生成する結果を処理し、その結果を前記クローン調整コンポーネントに提供する結果処理コンポーネントとを備える、システム。前記VM通信コンポーネントが、前記オリジナル仮想マシンから調整情報を受け取り、調整命令を1つまたは複数のクローン仮想マシンに提供する、請求項13に記載のシステム。前記分岐識別コンポーネントは、前記ソフトウェアコードを解析することにより前記ハイパーバイザを介して潜在的な分岐を自動的に識別する、請求項13に記載のシステム。本明細書において、開始状態のセットアップに投じられる時間を活用しつつ、複雑な状態遷移の並列実行を可能にする状態分岐システムについて説明する。システムは、ハイパーバイザを修正することにより、仮想マシンレベルでの分岐を可能にする。仮想マシンレベルでの分岐を可能にすることにより、状態分岐システムでは、仮想マシンにおける特定の条件または状態のセットアップを可能にし、仮想マシンの並列インスタンスへのコピーおよび分岐がなされ種々の可能な後続の状態が探索される。より大きくかつより複雑な評価に対して問題が起こることが多く、特に、マシンの状態がこれらの評価により劇的に影響を受ける場合である。結果が予測できない大規模な状態変化の検出または通知があると、状態分岐システムはハイパーバイザに命令して、実行中の仮想マシンを1つまたは複数の別々の仮想マシンにコピーさせる。そして、システムでは、2つまたはそれ以上の仮想マシンオリジナルおよびコピー間の分岐のブランチングbranchingによって、同様の開始ポイントからの異なる状態を探索することを可能にする。実行が次の状態に到達すると、システムは、調整を行ってどのコピー単数または複数が実行を継続するのかを判定する。従って、状態分岐システムでは、コンピュータシステムの状態を実質的に修正する複雑な状態変化をより速く探索することを可能にする。この要約は、以下の発明を実施するための形態でさらに述べる概念を選択して簡略化した形式で紹介するために提供するものである。この要約は、請求の主題の重要な特徴または主要な特徴を特定することを意図しておらず、請求の主題の範囲を制限するものとして使用されることも意図していない。本明細書において、開始状態のセットアップに投じられる時間を活用しつつ、複雑な状態遷移の並列実行を可能にする状態分岐システムについて説明する。システムは、ハイパーバイザを修正することにより仮想マシンレベルでの分岐を可能にする。ハイパーバイザは、物理マシンのリソース例えば、プロセッサ、メモリ、ディスク、およびネットワークを共有する1つまたは複数の仮想マシンプロセスを管理する。仮想マシンの全てが同じ物理マシン上で稼働するが、それぞれが、他の仮想マシンのことを知らずにおりかつ分離されている。仮想マシンレベルでの分岐を可能にすることにより、状態分岐システムでは、仮想マシンにおける特定の条件または状態のセットアップを可能にし、仮想マシンの並列インスタンスへのコピーおよび分岐がなされ異なる可能な後続の状態が探索される。より大きくかつより複雑な評価に対して問題が起こることが多く、特に、マシンの状態がこれらの評価により劇的に影響を受ける場合である。一例としてファジングがあり、仮想マシン内のオペレーティングシステム全体を分岐させることが可能であることで、ソフトウェア開発者は、ファジングされる次の反復のセットアップに費やす時間を劇的に減少させることができるようになり、また、ファジングされる可能な実行経路がより速く探索されるようになる。結果が予測できない大規模な状態変化の検出または通知があると、状態分岐システムはハイパーバイザに命令して、実行中の仮想マシンを1つまたは複数の別々の仮想マシンにコピーさせる。そして、システムでは、2つまたはそれ以上の仮想マシンオリジナルおよびコピー間の分岐のブランチングによって、同様の開始ポイントからの異なる状態を探索することを可能にする。いくつかの実施形態において、アプリケーションは、ハイパーバイザを呼び出して、ハイパーバイザに既存の仮想マシンの状態をスポーンさせ、かつ、複製したコピー単数または複数を新しい仮想マシンにスポーンさせるようにすることができる。そして、システムは、コピーにその決定木の調整をさせて重ならないようにする。実行が次の状態に到達すると、システムは、調整を行ってどのコピー単数または複数が実行を継続するのかを判定する。いくつかの場合、次の重要な状態変化によってプロセスが繰り返されるまで、システムは、大まかに複数の仮想マシンに分岐し、いくつかの状態を探索し、そして、結果を組み合わせてオリジナル仮想マシンに戻すことができる。いくつかの実施形態において、状態分岐システムは、ハイパーバイザおよびオペレーティングシステム両方の修正に依存して、仮想マシンレベルの分岐を可能にする。オペレーティングシステムは、分岐が望ましいのはいつであるかを検出する能力を有する。これには、多くの潜在的なトリガが含まれてよく、例えば、ファーストチャンス例外通知、アプリケーション要求、ユーザモードセカンドチャンス例外、などがある。操作にはまた、API、または、分岐インスタンスごとにどの決定ポイントを修正すべきであるかをアプリケーションが特定するための他の手段が含まれてよい。ハイパーバイザは修正されて、コマンドをエクスポーズしてホストまたはゲストのオペレーティングシステムが既存のゲストオペレーティングシステムのインスタンスの複製を要求することを許可する。ハイパーバイザはまた、ゲストオペレーティングシステムの実行を凍結することが可能であり、任意のハードウェア割り込みがゲストオペレーティングシステム上で実行されることを防ぐ。加えて、ハイパーバイザは、メモリ管理装置MMUに命令して、新しい分岐インスタンスについてゲスト操作メモリ割当て全体の複製を行わせる。いくつかの場合、システムは、全てのメモリを複製しなくともよく、ハイパーバイザが提供する分岐サポートのレベルに応じて、むしろいくつかのデータページのみを複製し、場合によっては実行可能なページは含まれない。このように、ホストまたはゲストの操作のどちらかが、いつ決定ポイントが到達されるかを判定し、これは、分岐経路を並列して評価することの利点であり、また、仮想マシンレベルでの分岐をハイパーバイザおよび/またはオペレーティングシステムに要求する。従って、状態分岐システムでは、コンピュータシステムの状態を実質的に修正する複雑な状態変化をより速く探索することを可能にする。図1は、一実施形態における、状態分岐システムのコンポーネントを例示するブロック図である。システム100には、ハイパーバイザコンポーネント110、スケジューリングコンポーネント120、VM通信コンポーネント130、分岐識別コンポーネント140、状態クローニングコンポーネント150、VM分岐コンポーネント160、クローン調整コンポーネント170、および、結果処理コンポーネント180が含まれる。これらのコンポーネントのそれぞれについて、本明細書においてさらに詳細に説明する。ハイパーバイザコンポーネント110は、2つまたはそれ以上の仮想コンピュータ装置間に物理コンピュータ装置のリソースを割り当てる。今日、多くのデータセンタで、仮想マシンを使用して、複数のプロダクションアプリケーションを単一のサーバ上で稼働させることを可能にし、各仮想マシンが仮想環境内にあるため、各アプリケーションはマシンを排他的に使用していると想定している。それよりむしろ、アプリケーションは典型的には、仮想マシンを排他的に使用するが、物理リソースを共有する。仮想マシンは、アプリケーションに、中央処理装置CPU速度、メモリサイズ、ディスク容量、ネットワーク帯域幅などの保障される量のハードウェアリソースを提供する。ハイパーバイザは、複数の仮想マシンが同一のコンピュータ上で隣り合って稼働することを可能にする商品ハードウェアで広く利用可能である例えば、Xen、Hyper-V、およびVMWare。ハイパーバイザは、CPU、メモリ、ディスク、および、ネットワークなどの物理リソースへのアクセスを多重化するスケジューリングすることもある。ハイパーバイザは、CPUおよびI/Oリソース双方のためのスケジューラを提供し、2つまたはそれ以上の仮想マシン間に全てのリソースの固定のパーティションを提供することができる。これは、多くの方法で、例えば、ハードリアルタイムスケジューリングアルゴリズムを使用して、行うことができる。スケジューリングコンポーネント120は、物理マシン上でのリソース使用のスケジューリング、及び、オリジナル仮想マシンおよびクローン化仮想マシンを含む2つまたはそれ以上の仮想マシン間のリソース分離する機能を提供する。スケジューリングコンポーネント120は、ハイパーバイザ内で動作してよく、また、仮想マシン分離を提供して、各仮想マシンが、リソース利用可能性について仮想マシンに対して与えられる任意の保証が満たされる方法で物理マシンリソースを使用することができるようにしてよい。例えば、物理マシンが2GHzのプロセッサを有し、2つの仮想マシンそれぞれがプロセッサの時間の内、同等の特定の部分を保証されている場合、スケジューリングコンポーネント120は、各仮想マシンが物理マシンのプロセッサ時間の二分の一を使用する状態になることを保証することができる。スケジューリングコンポーネント120は、物理マシンのメモリ、ディスク空間、ネットワーク帯域幅、および他のリソースの同様の分割を提供可能である。VM通信コンポーネント130は、2つまたはそれ以上の仮想マシン間に1つまたは複数の通信のチャネルを提供する。VM相互の通信には様々な技術が存在し、例えば、共有物理メモリ、ハイパーバイザを呼び出すハイパーコール、物理ディスク上の共通の場所におけるファイルの格納、などが含まれる。VM通信コンポーネント130は、オリジナル仮想マシンからの調整情報を受け取ること、また、調整命令を1つまたは複数のクローン仮想マシンに与えることができる。調整情報により、確実に、各仮想マシンが異なる分岐を進み、複数の可能な状態を評価するようにできる。ハイパーバイザは、共有される通信チャネルの管理、および、仮想マシンに対するセキュリティまたは他の制約の実施、を行ってもよい。オリジナル仮想マシンは、クローンの作成、および、それらの間の活動の調整のための、ハイパーバイザ内のサポートを活用してもよい。分岐識別コンポーネント140は、現在の状態と、ソフトウェアコードを実行するオリジナル仮想マシンを分岐させるための候補である、ソフトウェアコードの1つまたは複数の後続の状態と、を識別して、1つまたは複数のクローン仮想マシンにおける後続の状態を評価する。分岐識別コンポーネント140は、ソフトウェアコードを分析することにより潜在的な分岐を自動的に識別してよく、または、アプリケーションによりどこで分岐すべきかを指示されてもよい。今日、分岐の自動識別は、CPUと同様に発生し、そこでは解析エンジンは、次に来る命令ストリーム内で複数のステップを検証すること、および、命令、機能、または、他の挙動であって、マシンの状態を実質的に変えてしまうものを識別すること、ができる。手動識別は、ソフトウェア開発者により、テスト、または、特定の場所における分岐を要求する他のアプリケーション、をプログラミングして発生させることができる。例えば、テストは、数テストに共通の状態をセットアップし、そして、ホストオペレーティングシステムに通知して、分岐を要求し、各テストが追跡する分岐経路を実行することができる。状態クローニングコンポーネント150は、状態情報をオリジナル仮想マシンからコピーして、同様の状態を有する1つまたは複数のクローン仮想マシンを作成する。コピーでは、メモリ全体、および、オリジナル仮想マシンの他の仮想ハードウェアをコピーしてよく、または、各クローンが追跡するであろう分岐の状態の探索に使用されるサブセットのみを選択してもよい。例えば、テストは、開くことに長時間を要する種々のタイプの多数のオペレーティングシステムのハンドルを閉じてもよい。オリジナル仮想マシンは、ハンドル全てを開く作業を実行することができ、一方、クローン仮想マシンはそれぞれ特定のタイプのハンドルを閉じて種々の条件をテストする。本例では、各クローン仮想マシンは、別個の状態を追跡するが、ハンドル、または、より一般的には仮想マシン上で稼働するテストアプリケーション、に関連する状態のコピーを必要とするだけであって、全ての状態情報または他のアプリケーションに関連する状態のコピーを必要としない。VM分岐コンポーネント160は、各作成されたクローン仮想マシンを開始させ、かつ、各クローンが追跡する実行の分岐を識別することにより、分岐を実行する。例えば、分岐識別コンポーネント140が、ソフトウェアコードに上がってくる5個の可能な経路であって、それぞれが結果として実質的に異なる状態をもたらす経路、を識別する場合、テストアプリケーションは状態クローニングコンポーネント150に指示して4つのクローンを作成させてよく、その場合、オリジナル仮想マシンは状態の内の1つを追跡し、一方、4つのクローン仮想マシンは残りの4つの状態を追跡する。VM分岐コンポーネント160は、命令ポインタおよび他のマシン状態を、分岐を取り巻く場所および状態に直接設定することなどにより、各クローン仮想マシンに該マシンが考察するであろう分岐を通知する。そして、VM分岐コンポーネント160は、分岐の状態を探索するために各仮想マシンに実行させる。クローン調整コンポーネント170は、各クローン仮想マシンおよびオリジナル仮想マシンの動作を調整して、不要な分岐の廃棄または分岐結果の統合を可能にする。異なる分岐を実行する目的は、実行がどこで終了するのかを発見することである。多くの場合、ソフトウェアコードは、いくつかの分岐の内の1つを追跡し、分岐の成立に基づき異なる結果を伴うが最終的には共通の場所で終了し得る。従って、分岐後の短い期間に大幅に分岐するコードを実行するが、後に共通の場所で収束して結果を考察することは一般的である。クローン調整コンポーネント170は、テストまたは他のアプリケーションコードに、種々の状態を考察するためにいくつかの作業を行わせるべく複数のクローン仮想マシンを送り出すが、各クローン仮想マシンの結果を考察することにより、かつ、状態の探索が完了する時にオリジナル仮想マシンに実行を戻すことにより、周期を完了させる。これは、今日、CPUがいくつかの分岐を投機的に実行して、結局は成立しなかった分岐をフラッシュすることと同様であるが、仮想マシンレベルでもっと広いスケールで状態分岐システム100により応用される。結果処理コンポーネント180は、各仮想マシンが生成する結果を処理し、その結果をクローン調整コンポーネント170に提供する。各仮想マシン、すなわちオリジナルおよびクローンは、単純な数値、またはテキストの結果、または仮想マシンに対して発生するさらなる状態変化などの複雑な結果を含む様々な結果を生成することができる。一例として、アンチウィルスプログラムは、悪意のあるコードを探すためにスキャンされているコンピュータ装置上で見つかるいくつかの識別されたソフトウェアコードモジュールを実行して、そのコードモジュールがコンピュータ装置に対して何らかの害をなすかどうかを判定しようとする。アンチウィルスプログラムは、オリジナルコンピュータ装置の特徴の全てを有するクローン仮想マシンにおいて各ソフトウェアコードモジュールをスポーンすることができ、その結果は、ソフトウェアコードがクローンに対して成す任意の変化である。アンチウィルスプログラムは、結果をスキャンして、何らかの害がある例えば、重要なファイルを削除する、連絡先にスパムを送信するかどうかを判定することができ、かつ、真偽値をオリジナルのアプリケーションに提供して有害な結果が見つかったかどうかを示すことができる。これにより、各クローンは、何らかの方法でクローン仮想マシンの状態を混乱させてしまう可能性があるが、特定の結果が得られた後にアンチウィルスプログラムにより廃棄される。別の例として、システムを使用する組込み装置を、ネットワークの接続を確認pingして何らかの複雑な動作を実行すべきかまたどのように実行すべきかを判定するように、設計することが可能である。この分岐により、高レイテンシ要求がなされていても、装置は物理装置のアイドルな処理パワーを使用することができる。恐らく、これには、センサまたはアンテナアレイの再較正する計算を伴い、組込み装置は、ネットワーク応答を受け取る前に可能な計算を開始することができる。状態分岐システムが実装されるコンピュータ装置には、中央処理装置、メモリ、入力装置例えば、キーボードおよびポインティングデバイス、出力装置例えば、表示装置、および記憶装置例えば、ディスクドライブまたは他の不揮発性記憶媒体が含まれてよい。メモリおよび記憶装置は、システムを実装するまたは有効にするコンピュータ実行可能命令例えば,ソフトウェアが符号化されてよいコンピュータ可読記憶媒体である。加えて、データ構造およびメッセージ構造は、記憶されているか、又は、通信リンク上の信号などのデータ伝送媒体を介して伝送されてもよい。インターネット、ローカルエリアネットワーク、ワイドエリアネットワーク、2地点間ダイアルアップ接続、携帯電話ネットワーク、などの種々の通信リンクを使用することができる。システムの実施形態は種々の動作環境において実装されてよく、該動作環境には、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドまたはラップトップの装置、マルチプロセッサシステム、マイクロプロセッサベースのシステム、プログラマブル家庭用電子機器、デジタルカメラ、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、上記のシステムまたは装置のいずれかを含む分散コンピュータ環境、セットトップボックス、システムオンチップSOC、などが含まれる。コンピュータシステムは、携帯電話、携帯情報端末PDA、スマートフォン、パーソナルコンピュータ、プログラマブル家庭用電子機器、デジタルカメラ、などとしてよい。システムについて、1つまたは複数のコンピュータまたは他の装置により実行されるプログラムモジュールなどのコンピュータ実行可能命令の一般的文脈で説明することができる。一般的に、プログラムモジュールには、特定のタスクを実行、または、特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれる。典型的には、プログラムモジュールの機能性は、種々の実施形態において所望の通りに組み合わせまたは分散されてよい。図2は、一実施形態における、オリジナル仮想マシンから1つまたは複数のクローン仮想マシンへ分岐して分岐の状態を考察する、状態分岐システムの処理を例示するフロー図である。ブロック210にて開始され、システムは、オリジナル仮想マシン上での実行するためのアプリケーションコードを受け取り、それにおいて、アプリケーションコードには、仮想マシンの状態を2つまたはそれ以上の可能な状態とさせる少なくとも1つの分岐が含まれる。システムは、マシンの状態を変化させるテストまたは他のアプリケーションコードを受け取ってよく、また、分岐は、ランタイム時に評価される条件に基づき発生してよい。システムは、オリジナル仮想マシンの状態を実質的に変えてしまう分岐を識別し、かつ、1つまたは複数のクローン仮想マシンを並列して実行して分岐から導かれる経路を評価する。ブロック220へ続き、システムは、受け取ったアプリケーションコードを含むオリジナル仮想マシンを実行する。例えば、システムは、ハイパーバイザ内で動作し、同じ物理リソースを共有する複数の仮想マシンの実行を指示することができる。システムは、分岐が、仮想マシンの状態を大幅に変化させてしまう可能性があると識別されるまで、オリジナル仮想マシンを実行する。例えば、分岐は、ファイルの削除、長時間の計算の実行、大量のデータの作成、または、状態を変化させる他の動作の実行、を行うかもしれない。ブロック230へ続き、システムは、オリジナル仮想マシン上で稼働するアプリケーションコード内の、仮想マシンの2つまたはそれ以上の可能な状態をもたらす分岐を識別する。例えば、システムは、従来技術において周知のコード分析ツールを使用してソフトウェアコード内の分岐する経路を発見することにより、分岐を自動的に識別することができる。多くの静的およびランタイムの分析ツールが、ソフトウェアコードを、バイナリおよび/またはソースコードのレベルで調査し、アプリケーションの状態における重要な分岐する位置を識別する。いくつかの実施形態において、システムにより、アプリケーションは、アプリケーションが複数の可能な状態に分岐するであろう場所を示すことができるようになる。例えば、テストアプリケーションは、2つまたはそれ以上の分岐経路を識別するオペレーティングシステムAPIを起動して、システムが仮想マシンをクローン化し、経路を並列して実行できるようにすることができる。ブロック240へ続き、システムは、1つまたは複数のクローン仮想マシンを作成するが、当該マシンは、オリジナル仮想マシンの現在の状態を複製して、次に、分岐の1つの経路を処理して作成されるクローン仮想マシンにおける後続の状態を探索する。クローン化には、仮想ハードウェアを識別する仮想マシンの仕様のセットアップ、オリジナル仮想マシンのメモリの状態のコピー、オリジナル仮想マシンにアタッチされたディスクのコピー、などが含まれてよい。仮想化ソフトウェアには、仮想マシンを単一のファイルに記憶するものがあり、このファイルには、任意の組込みファイルシステム例えばマイクロソフト商標のVirtualPCおよびHyper-Vで使用されるVHDファイルが含まれる。システムは、オリジナル仮想マシンの実行を中断し、仮想マシンに関連する1つまたは複数のファイルをコピーすることにより、仮想マシンをクローン化してもよい。ブロック250へ続き、システムは、各クローン仮想マシンをセットアップして、識別された分岐の異なる経路を実行する。クローンがオリジナルの完全なクローンであれば、該クローンは、オリジナルが次に行うのと同じことを行うであろう。しかし、状態分岐システムの目的の1つは、各クローンに分岐の異なる経路を並列して追跡させることである。従って、システムは、各クローンがどの経路を探索する責任があるのかについての情報を用いて該クローンをセットアップし、次に、クローンとオリジナルそれぞれを実行して、該クローンとオリジナルにその割り当てられた経路を探索させる。各クローンのセットアップには、仮想マシンが実行するであろうソフトウェアコードの識別、特定の場所への命令ポインタ及びレジスタの状態の設定、などが含まれてよい。ブロック260へ続き、システムは、オリジナル仮想マシンおよびクローン化仮想マシンを実行して、識別された分岐の少なくとも2つの経路を並列して探索する。分岐の特定の経路がマシン状態を大幅に変えてしまう場合、その分岐を実行する仮想マシンのみが影響を受けることになる。その一方、オリジナル仮想マシンは、クローン化仮想マシンを実行して、オリジナル仮想マシンの状態に影響を与えることなく分岐経路についての情報を集める効果を判定するべく待ってもよい。アプリケーションコードが、条件が分岐経路の成立を満たさないと判定する場合、その経路に関する仮想マシンを単に廃棄することが可能であり、オリジナル仮想マシンは継続可能である。いくつかの場合、システムは、クローン仮想マシンを選択して、主要な仮想マシンすなわち、オリジナル仮想マシンの役割を引き継ぐとして継続させ、オリジナル仮想マシンを終了してもよい。ブロック270へ続き、システムは、クローン化仮想マシンから少なくとも1つの実行結果を受け取る。その結果として、クローン化仮想マシンより到達される状態、交差VM通信チャネルを介してクローン化仮想マシンから通信される情報、クローン化仮想マシンにより実行される分岐経路を実行することにより生成される出力、などを示すことができる。オリジナル仮想マシンは、実行結果を使用して、次に何をすべきかを判定すること、または、オリジナル仮想マシンが処理を続けるであろう結果をもたらす仮想マシンを選択することができる。クローン化仮想マシンが並列して実行されるため、システムが、オリジナル仮想マシン内で各分岐を試すよりも早く結果に到達することが期待できる。ブロック270の後、これらのステップは完了する。図3は、一実施形態における、1つまたは複数のクローン仮想マシンを出て実行を収束させてオリジナル仮想マシンに戻す、状態分岐システムの処理を例示するフロー図である。ブロック310にて開始され、システムは、オリジナル仮想マシン内のアプリケーションコードの分岐を前もって検出すること、かつ、各分岐経路を実行するクローン化仮想マシンをスポーンすることにより作成された、第1のクローン化仮想マシンを選択する。後に続く繰り返しにおいて、システムは次のクローン化仮想マシンを選択する。ブロック320へ続き、システムは、選択されたクローン化仮想マシンが、同マシンが割り当てられていた分岐経路の実行を完了したことを検出する。いくつかの場合、分岐経路は、より大きな本体部分のコードの内の小さなサブセクションを表すことができ、すなわち、サブセクションは、結果又は状態変更をもたらし、ある意味においては、より大きなコード本体の外部の結果を決定するために、分岐の実行を隔離することは有益となる。クローン化仮想マシンのセットアップ中、システムは、クローン化仮想マシンが分岐経路の実行を完了するであろう時点で、命令例えば、中止または割り込みまたは他の標示を挿入してもよい。ハイパーバイザまたは他のコードが命令を監視または検出して、クローン化仮想マシンの完了を検出することが可能である。ブロック330へ続き、システムは、クローン化仮想マシンの実行の結果状態を識別する。結果には、数値結果、クローン化仮想マシンにより生成されるデータ、クローン化仮想マシンに対する状態変化、などが含まれてよい。システムは、クローン化仮想マシンをオリジナル仮想マシンと比較して、クローン化仮想マシンが実行した分岐経路を探索することにより生成される変化を識別することができる。オリジナル仮想マシンが、分岐により投機的に実行される経路を採用すると決定すると、オリジナル仮想マシンは、選択されたクローン化仮想マシンの状態の相違または識別された結果をコピーすることが可能である。決定ブロック340へ続き、システムは、現在の分岐に関連するクローン化仮想マシンがまだ存在するかどうかを判定する。存在する場合、システムは、ブロック310へループして次のクローン化仮想マシンを選択し、そうでない場合、システムは、各クローン化仮想マシンが処理された後にブロック350へ続く。ブロック350へ続き、システムは、オリジナル仮想マシン上で稼働するアプリケーションコードにおける1つまたは複数の条件に基づき、成立させる分岐を選択する。いくつかの実施形態において、クローン化仮想マシンは、オリジナル仮想マシンが採用し得る分岐経路を投機的に実行するための投機的実行エンジンとして動作する。オリジナル仮想マシンが、どのパスを成立させるか判断するために、全ての条件が評価されたポイントまで実行した後に、オリジナル仮想マシンは、分岐の内の1つを正しい分岐として選択し、他を廃棄することが可能である。他の実施形態において、クローン化仮想マシンは、オリジナル仮想マシンにより全てが使用される累積結果を表してよいが、それは、結果により早く到達するために並列して実行される。そのような場合、オリジナル仮想マシンは、各クローン化仮想マシンから結果を受け取り、任意のさらなる処理を受け取った結果に対して実行し、クローン化仮想マシンが完了した後にも処理を継続する。ブロック360へ続き、システムは、識別された結果状態を、選択された分岐を実行したクローン化仮想マシンからコピーする。このように、オリジナル仮想マシンは、個々のクローン化仮想マシンが実行する並列実行により恩恵を受ける。どの分岐を成立させようと、オリジナル仮想マシンは、各分岐のテストによる影響を受けず、また、先行するコードが完了した後に分岐を引き続き実行するべく待つ必要もない。むしろ、先行するコードがオリジナル仮想マシンにおいて完了し、一方で、クローン化仮想マシンはそれぞれ分岐の内の1つを実行し、また、選択された仮想マシンは、結果をオリジナル仮想マシンに、準備が整い次第また、オリジナル仮想マシン自身で結果を達成することができる前に提供する。ブロック370へ続き、システムは、クローン化仮想マシンからのコピーした結果を使用して、オリジナル仮想マシンの実行を継続する。いくつかの実施形態において、システムは、オリジナル仮想マシンを廃棄し、かつ、選択されたクローン化仮想マシンを介して実行を継続してよい。システムは、成立させなかった分岐経路を表す任意のクローン化仮想マシンを廃棄またはフラッシュすることが可能である。ブロック370の後、これらのステップは完了する。図4は、一実施形態における、状態分岐システムによる分岐経路の並列処理を例示するタイムライン図である。タイムラインの第1の列410は、本明細書に記載されるオリジナル仮想マシンの処理を表す。従来のシステムでは、オリジナル仮想マシンまたは物理マシンは、処理の全てを実行することになる。オリジナル仮想マシンは、オリジナル仮想マシンが実行中のアプリケーションコード内の分岐450に遭遇する前に、1つまたは複数のタスク440を処理する。分岐前の何らかのポイントで、オリジナル仮想マシンが分岐を識別して、分岐の潜在経路を並列して実行する2つのクローン化仮想マシンをスポーンする。第2の行420は、第1のクローン化仮想マシンの処理を表し、第3の行430は第2のクローン化仮想マシンの処理を表す。オリジナル仮想マシンが分岐前タスク440を完了する一方、第1のクローン化仮想マシンが第1の分岐経路460に関連するコードを実行し、第2のクローン化仮想マシンが第2の分岐経路470に関連するコードを並列して実行する。オリジナル仮想マシンは分岐450に到達すると、オリジナル仮想マシンの現在の状態および分岐450の任意の条件に基づき採用すべき分岐の経路を判定する。オリジナル仮想マシンは、判定を勝ち抜いた分岐を選択し、結果480をオリジナル仮想マシンにコピーする。そして、オリジナル仮想マシンは実行を継続し、クローン化仮想マシンを廃棄する。このように、クローン化仮想マシンは、オリジナル仮想マシンの将来の状態を並列して準備し、オリジナル仮想マシンを各分岐経路の評価時に関与していた侵略的な状態変化から分離する。いくつかの実施形態において、状態分岐システムは、デバイスドライバテストのためのフレームワークを提供する。デバイスドライバテストは、不正確に操作すると、オペレーティングシステムのカーネル空間においてデッドロックしてしまう状態変化および物理ハードウェアを伴うために、困難であることが多い。状態分岐システムにより、物理ハードウェアの状態変化を仮想化することが可能になるため、並列して動作する複数のクローン仮想マシンが、種々の潜在的なハードウェア入力の結果および対応するドライバ応答を評価できる。これにより、デバイスドライバソフトウェアコードのより速くよりロバストな開発が容易にされる。いくつかの実施形態において、状態分岐システムは、分岐経路を探索する追加の仮想マシンをスポーンするための閾値を判定する。仮想マシンの作成とセットアップには、時間およびリソース使用の点である程度のコストが発生する。小さな分岐については、クローン化仮想マシンのセットアップに伴う時間は、該マシンから得られる恩恵に値する価値はないかもしれない。従って、システムは、クローン化仮想マシンを使用することの恩恵に関する閾値を判定して、トレードオフにより実行時間が最終的に節約される、または、他のポジティブな結果がもたらされる場合に限り、新しいクローン化仮想マシンをスポーンしてもよい。アプリケーションは、アプリケーションに固有の考察事項に基づく閾値を設定または調整することができてよい。同様に、いくつかの実施形態において、状態分岐システムは、分岐経路を探索するクローン化仮想マシンを使用することの恩恵を評価する際に、クローン化仮想マシンが、クローン化仮想マシンの外部の任意のリソースに影響を与えるすなわち、外部のまたはリンクされる物理装置にコマンドを発行する、ネットワーク上にパケットを送信する、などかどうかを考慮してもよい。いくつかの実施形態において、状態分岐システムは、オリジナル仮想マシンとは異なる物理マシン上にクローン化仮想マシンをスポーンする。仮想マシンは、物理マシン間の容易な移動に良好に適しており、システムは、クローン化仮想マシンのいくつかまたは全てを分離した物理マシン上で実行することにより、種々の分岐経路の探索を、他の物理マシンに任せてもよい。クローン化仮想マシンは、必要に応じて、ネットワークまたは物理マシン間の他の通信チャネルを介して、オリジナル仮想マシンと通信することができる。いくつかの実施形態において、状態分岐システムは、分岐経路を探索するクローン化仮想マシンを使用する機会を検出する際に、ハイパーバイザからの通知を提供する。ハイパーバイザは、仮想マシンにおける各実行中の処理の監視、および、並列して、分離した仮想マシンが分岐経路に対して備えることができるインスタンスの自動的な検出、を行うことが可能である。そのような場合、ハイパーバイザがクローン化仮想マシンをスポーンすることをアプリケーションが意図するかどうかの標示をアプリケーションが登録することおよびそれに応答することが可能である、というアプリケーション通知をハイパーバイザは提供することができる。いくつかの実施形態において、状態分岐システムは、仮想マシン上で稼働するアプリケーションの種々の状態に戻す効果を備える、新しい形式のデバッグを提供する。システムは、クローン化仮想マシンの形式でアプリケーションの実行時の種々のポイントで、チェックポイントを作成する。各クローン化仮想マシンは、アプリケーションの状態を特定の時間ポイントにおいて表し、アプリケーションに対して発生する任意の後続の変化から分離される。これにより、ソフトウェア開発者は、問題が発生する前または発生中の1つまたは複数の時間ポイントにおいて、デバッガをアタッチして、アプリケーションの状態を検査することができる。いくつかの実施形態において、状態分岐システムは、種々のタスクを実行するための同様のアルゴリズムを比較するためのA-Bテストを提供する。例えば、システムは、オペレーティングシステムのページングまたはスケジューリングアルゴリズムを、それぞれを別個のクローン化仮想マシンにおいて、管理する処理の同様セットを用いてセットアップすること、そして、各クローン化仮想マシンを並列して実行して、どちらのアルゴリズムアがより良い結果を提供するかを、実行速度、または他の要因の観点から、判定することにより、テストすることができる。今日、そのようなテストを再び稼働させることで、順次新しい状態が導入される。テストハーネスが毎回同じ状態をセットアップしようと試みても、常に何らかの変化があり比較を困難にする。状態分岐システムを使用すると、各テストは既知のクローン化状態で開始され、予想外の状態変化による影響が少ない状態で、結果を比較することが可能である。上記より、状態分岐システムの特定の実施形態が例示の目的で本明細書に記載されるが、本発明の精神および範囲から逸脱することなく種々の修正がなされてよいことは理解されるであろう。従って、本発明は添付の請求の範囲による場合を除いて制限されない。"