(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B1)
(11)【特許番号】
(24)【登録日】2022-11-24
(45)【発行日】2022-12-02
(54)【発明の名称】ソフトウェア実体間のイベントの決定的再現
(51)【国際特許分類】
G06F 11/34 20060101AFI20221125BHJP
【FI】
G06F11/34
【外国語出願】
(21)【出願番号】P 2022118477
(22)【出願日】2022-07-26
【審査請求日】2022-08-29
(32)【優先日】2021-07-29
(33)【優先権主張国・地域又は機関】US
【早期審査対象出願】
(73)【特許権者】
【識別番号】522183858
【氏名又は名称】アペックス.エーアイ,インコーポレイテッド
【氏名又は名称原語表記】APEX.AI,INC.
(74)【代理人】
【識別番号】100121728
【氏名又は名称】井関 勝守
(74)【代理人】
【識別番号】100165803
【氏名又は名称】金子 修平
(74)【代理人】
【識別番号】100170900
【氏名又は名称】大西 渉
(72)【発明者】
【氏名】ペンル,ミヒャエル
(72)【発明者】
【氏名】タミシエ,アルバン
(72)【発明者】
【氏名】シャレム,ミーシャ
【審査官】武田 広太郎
(56)【参考文献】
【文献】特開2001-154881(JP,A)
【文献】特開2012-38019(JP,A)
【文献】米国特許出願公開第2005/0091026(US,A1)
【文献】特表2022-507142(JP,A)
【文献】特表2007-510992(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 11/7
G06F 11/28 - 11/36
(57)【特許請求の範囲】
【請求項1】
システム内の複数のソフトウェア実体をグラフの節、イベントを前記グラフの辺として表現することができ、少なくとも1つのハードウェアプロセッサを使用して、
前記システム内の
前記複数のソフトウェア実体間のイベントの記録を
決定的に再現する方法であって、前記記録内の1つまたは複数のイベントの各々について、
前記イベントを再現するステップと、
前記イベントによって刺激されている
前記複数のソフトウェア実体
のいずれかを待ち行列に入れるステップと、
前記待ち行列が空になるまで、
前記待ち行列の先頭にあるソフトウェア実体を削除して実行するステップと、
前記実行されたソフトウェア実体の出力しているすべてのイベントを再現するステップと、
前記実行されたソフトウェア実体の出力した前記再現されたイベントによって刺激されている
前記複数のソフトウェア実体
のいずれかを前記待ち行列に入れるステップと、
を含
み、
ソフトウェア実体を前記待ち行列に入れる各ステップは、
前記ソフトウェア実体が前記待ち行列内のいかなる位置にも既に存在しない場合、前記ソフトウェア実体を前記待ち行列に挿入することと、
前記ソフトウェア実体が前記待ち行列内のある位置に既に存在する場合、前記ソフトウェア実体の複製を前記待ち行列に挿入しないことと、を含む方法。
【請求項2】
イベントを再現する各ステップは、
前記複数のソフトウェア実体の1つまたは複数に前記イベントを表すメッセージを送信するステップを含む、請求項1に記載の方法。
【請求項3】
前記ソフトウェア実体を前記待ち行列に挿入することは、前記ソフトウェア実体を前記待ち行列の最後尾に挿入することを含む、請求項
1に記載の方法。
【請求項4】
前記ソフトウェア実体を前記待ち行列に挿入することは、前記ソフトウェア実体を前記待ち行列の前記先頭に挿入することを含む、請求項
1に記載の方法。
【請求項5】
前記少なくとも1つのハードウェアプロセッサを使用して、前記複数のソフトウェア実体のいずれの実行中にもイベントは再現されないことを保証するステップをさらに含む、請求項1に記載の方法。
【請求項6】
前記少なくとも1つのハードウェアプロセッサを使用して、前記複数のソフトウェア実体の他のいずれの実行中にもソフトウェア実体は実行されないことを保証することをさらに含む、請求項1に記載の方法。
【請求項7】
前記システムは車両のサブシステムである、請求項1に記載の方法。
【請求項8】
前記システムはロボットのサブシステムである、請求項1に記載の方法。
【請求項9】
その中に格納された命令を有する非一時的コンピュータ可読媒体であって、前記命令は、プロセッサによって実行されると、
システム内の複数のソフトウェア実体をグラフの節、イベントを前記グラフの辺として表現することができ、前記プロセッサが
前記システム内の
前記複数のソフトウェア実体間のイベントの記録を
決定的に再現する方法であって、前記記録内の1つまたは複数のイベントの各々について、
前記イベントを再現するステップと、
前記イベントによって刺激されている
前記複数のソフトウェア実体
のいずれかを待ち行列に入れるステップと、
前記待ち行列が空になるまで、
前記待ち行列の先頭にあるソフトウェア実体を削除して実行するステップと、
前記実行されたソフトウェア実体の出力しているすべてのイベントを再現するステップと、
前記実行されたソフトウェア実体の出力した前記再現されたイベントによって刺激されている
前記複数のソフトウェア実体
のいずれかを前記待ち行列に入れるステップと、によってシステム内の
前記複数のソフトウェア実体間のイベントの記録を
決定的に再現する方法を行わせ
、
ソフトウェア実体を前記待ち行列に入れる各ステップは、
前記ソフトウェア実体が前記待ち行列内のいかなる位置にも既に存在しない場合、前記ソフトウェア実体を前記待ち行列に挿入することと、
前記ソフトウェア実体が前記待ち行列内のある位置に既に存在する場合、前記ソフトウェア実体の複製を前記待ち行列に挿入しないことと、を含む、非一時的コンピュータ可読媒体。
【請求項10】
システム内の複数のソフトウェア実体をグラフの節、イベントを前記グラフの辺として表現することができ、少なくとも1つのハードウェアプロセッサを使用して、
前記システム内の
前記複数のソフトウェア実体間のイベントの記録を
決定的に再現する方法であって、前記記録内の1つまたは複数のイベントの各々について、
前記イベントを再現するステップと、
前記イベントによって刺激されている
前記複数のソフトウェア実体
のいずれかを実行するステップと、
前記実行されたソフトウェア実体のいずれかの出力しているすべてのイベントを待ち行列に入れるステップと、
前記待ち行列が空になるまで、
前記待ち行列の先頭にあるイベントを削除して再現するステップと、
前記待ち行列の前記先頭から削除された前記再現されたイベントによって刺激されている
前記複数のソフトウェア実体
のいずれかを実行するステップと、
前記待ち行列の前記先頭から削除された前記再現されたイベントによって刺激された前記実行されたソフトウェア実体のいずれかによって出力されているすべてのイベントを待ち行列に入れるステップと、を含
み、
イベントを前記待ち行列に入れる各ステップは、
前記イベントが前記待ち行列内のいかなる位置にも既に存在しない場合、前記イベントを前記待ち行列に挿入することと、
前記イベントが前記待ち行列内のある位置に既に存在する場合、前記イベントの複製を前記待ち行列に挿入しないことと、を含む、
前記システム内の
前記複数のソフトウェア実体間のイベントの記録を
決定的に再現する方法。
【請求項11】
イベントを再現する各ステップは、
前記複数のソフトウェア実体の1つまたは複数に前記イベントを表すメッセージを送信するステップを含む、請求項
10に記載の方法。
【請求項12】
前記待ち行列の前記先頭から削除された前記イベントによって刺激されるかまたは前記再現されたイベントによって刺激される、
前記複数のソフトウェア実体
のいずれかを実行するステップは、前記
複数のソフトウェア実体
の前記いずれかを並列に実行するステップを含む、請求項
10に記載の方法。
【請求項13】
前記システムは車両のサブシステムである、請求項
10に記載の方法。
【請求項14】
前記システムはロボットのサブシステムである、請求項
10に記載の方法。
【発明の詳細な説明】
【技術分野】
【0001】
本明細書に説明する実施形態は、一般に、データの再現に向けられ、より詳細には、ソフトウェア実体間のイベント(例えば、データ通信)の決定的再現に向けられる。
【背景技術】
【0002】
(関連技術の説明)
ロボット工学または自動車システムを開発するために使用される多くのフレームワークは、システム内のソフトウェア実体間のデータ通信を記録しかつ再現する機能を提供する。このようなフレームワークの例としては、限定されないが、ロボットオペレーティングシステム(ROS)、自動車データおよび時間トリガーフレーム(ADTF)、および拡張通信抽象化レイヤ(eCAL)が含まれる。
【0003】
再現されるデータは、実システムにおける入力の記録であっても、実システムを刺激するために生成された合成データであってもよい。このようなデータを再現してシステムを刺激することは、データが記録されたシステムの特定の状態(例えば、自律または半自律車両が経験した特定の状況)のデバッグ、特定の状況(例えば、実世界で見つけることが困難なコーナーケース)を分析する能力に関するシステムのテスト、再現可能なテスト(例えば、与えられた入力を処理する際に、システムのソフトウェアの各反復が事前に定義された方法で反応するかどうかをチェックする継続的統合パイプラインで実行されるテスト)の確立、システムの特定の部分のためのソフトウェア開発の加速(例えば、完全なシステムを実行する代わりに、システムの特定の部分に関連する特定のデータ、例えば、車両内の気象応答システムのための夜間の雨を表すデータなどを選択することができる)および/または同種のことに有用であり得る。
【0004】
多くの場合、単一のソフトウェア実体のデータのみを再現することから、数百のソフトウェア実体を有する巨大システムのすべてのデータを再現することまで、異なるレベルの再現が可能である。通常、ソフトウェア実体間のデータ通信の記録中のメッセージは、記録内で発生した順に再現される。メッセージにタイムスタンプが含まれている場合は、時系列でメッセージを再現するのにタイムスタンプを使用することができる。多くの場合、再現速度は実時間に対して遅くしたり速くしたりすることができる。
【0005】
データを再現する際、1つまたは複数のソフトウェア実体を、1つまたは並列の実行スレッドで実行できるように刺激することができる。しかし、データが再現されるハードウェア環境は、データが記録されたハードウェア環境と異なる場合がある。例えば、車両に搭載された電子制御ユニット(ECU)から記録されたデータを、開発者のノートパソコンやクラウドベース環境で再現することがある。このようなハードウェア環境の違いや、開発環境のソフトウェアが記録環境のソフトウェアよりも変化している可能性があるため、再現時の実行時動作が記録時の実行時動作と異なる可能性がある。また、同一オペレーティングシステム上で動作するバックグラウンドタスクが再現中のタスクのタイミングに影響を与えるなど、種々の再現間での実行時動作が異なる可能性がある。この非決定的な実行時動作により、ソフトウェア実体の実行順序のばらつき、再現の開始に対するソフトウェア実体の実行の開始点および終了点のばらつき、再現の開始に対するソフトウェア実体がメッセージを出力または消費するタイミングのばらつき、再現されたメッセージに関してソフトウェア実体が処理する入力のばらつき、他のソフトウェア実体が送信するメッセージに関してソフトウェア実体が処理する入力のばらつき、ソフトウェア実体の出力におけるばらつき、などが発生する可能性がある。これらすべてのばらつきの結果として、再現の結果は再生成不可能である。このような再現の非決定的な実行時動作は、ソフトウェア実体の数や実行の並列スレッドの数が増えるにつれて増加する。
【0006】
さらに、ロボティクスや最新の自動車アプリケーションに典型的に見られるデータ駆動型の実行では、純粋な時間駆動型のアプリケーションに通常存在するよりも多くの非決定性が生じる。これは、ソフトウェア実体によって、さまざまなタイミングでメッセージが送信されるためである。その結果、これらのメッセージを受信し、刺激を受けたソフトウェア実体は、さまざまな開始時刻に実行を開始することになる。多くの場合、受信側のソフトウェア実体の実行が開始されると、複数の送信側ソフトウェア実体からのメッセージ群が通信ミドルウェアから消費される。上記のような非決定性の結果、このメッセージ群は不定であり、したがって、これらのメッセージからソフトウェア実体が生成する出力もまた不定である。
【0007】
その結果、従来のフレームワークでは、再現性のあるテストを確立することは不可能ではないにせよ、困難である。この困難さは、テスト対象のシステムがマルチコアプロセッサで実行されるソフトウェア実体のグラフを実装している場合、さらに増大する。つまり、この場合、ハードウェア環境における高度な技術や効率化が、再現の再生成可能性を阻害し得る。
【発明の概要】
【0008】
したがって、ソフトウェア実体の数、実行のスレッドの数、およびマルチコアプロセッサの使用状況に関係なく、全てのハードウェア環境について再生成可能であり且つ適し得るイベントの決定的再現を提供するシステム、方法、および非一時的コンピュータ読取可能媒体が開示される。
【0009】
第1の実施形態では、少なくとも1つのハードウェアプロセッサを使用して、システム内の複数のソフトウェア実体間のイベントの記録を再現する方法であって、記録内の1つまたは複数のイベントの各々について、以下を含む方法が開示される。イベントを再現するステップと、イベントによって刺激されるすべてのソフトウェア実体を待ち行列に入れるステップと、待ち行列が空になるまで、待ち行列の先頭にあるソフトウェア実体を削除して実行するステップと、実行されたソフトウェア実体の出力したすべてのイベントを再現するステップと、実行されたソフトウェア実体の出力した再現されたイベントによって刺激されるすべてのソフトウェア実体を待ち行列に入れるステップと、である。イベントを再現する各ステップは、イベントを表すメッセージを送信するステップを含んでもよい。本方法は、少なくとも1つのハードウェアプロセッサを使用して、複数のソフトウェア実体のいずれかの実行中にいかなるイベントも再現されないことを保証するステップをさらに含んでもよい。本方法は、少なくとも1つのハードウェアプロセッサを使用して、複数のソフトウェア実体のうちの任意の他のいずれかの実行中にいかなるソフトウェア実体も実行されないことを保証することをさらに含んでもよい。システムは、車両またはロボットのサブシステムであってもよい。
【0010】
ソフトウェア実体を待ち行列に入れる各ステップは、ソフトウェア実体が待ち行列内のいかなる位置にも既に存在しない場合、ソフトウェア実体を待ち行列に挿入することと、ソフトウェア実体が待ち行列内のある位置に既に存在するとき、ソフトウェア実体の複製を待ち行列に挿入しないことと、を含んでいてもよい。ソフトウェア実体を待ち行列に挿入することは、待ち行列の最後尾にソフトウェア実体を挿入することを含んでもよい。あるいは、ソフトウェア実体を待ち行列に挿入することは、ソフトウェア実体を待ち行列の先頭に挿入することを含んでもよい。
【0011】
ソフトウェア実体を待ち行列に入れる各ステップは、ソフトウェア実体が待ち行列内のある位置に既に存在するか否かに関係なく、ソフトウェア実体を待ち行列に挿入することを含んでいてもよい。ソフトウェア実体を待ち行列に挿入することは、ソフトウェア実体を待ち行列の最後尾に挿入することを含んでいてもよい。また、ソフトウェア実体を待ち行列に挿入することは、ソフトウェア実体を待ち行列の先頭に挿入することを含んでいてもよい。
【0012】
第2の実施形態において、少なくとも1つのハードウェアプロセッサを使用して、システム内の複数のソフトウェア実体間のイベントの記録を再現する方法であって、記録内の1つまたは複数のイベントの各々について、以下を含む方法が開示される。イベントを再現するステップと、イベントによって刺激されるすべてのソフトウェア実体を実行するステップと、実行されたソフトウェア実体のいずれかの出力するすべてのイベントを待ち行列に入れるステップと、待ち行列が空になるまで、待ち行列の先頭にあるイベントを削除して再現するステップと、待ち行列の先頭から削除された再現されたイベントによって刺激されるすべてのソフトウェア実体を実行するステップと、待ち行列の先頭から削除された再現されたイベントによって刺激された実行されたソフトウェア実体のいずれかによって出力されるすべてのイベントを待ち行列に入れるステップと、である。イベントを再現する各ステップは、イベントを表すメッセージを送信することを含んでいてもよい。イベントを待ち行列に入れる各ステップは、イベントが待ち行列内のいかなる位置にも既に存在しない場合、イベントを待ち行列に挿入することと、イベントが待ち行列内のある位置に既に存在する場合、イベントの複製を待ち行列に挿入しないことと、を含んでもよい。あるいは、イベントを待ち行列に入れる各ステップは、イベントが待ち行列内のある位置に既に存在するか否かに関係なく、イベントを待ち行列に挿入することを含んでいてもよい。待ち行列の先頭から削除されたイベントによって刺激されるかまたは再現されたイベントによって刺激される、すべてのソフトウェア実体を実行するステップは、すべてのソフトウェア実体を並列に実行するステップを含んでもよい。システムは、車両またはロボットのサブシステムであってもよい。
【0013】
これらの方法は、サーバなどのプロセッサベースのシステムの実行可能なソフトウェアモジュール、および/または非一時的コンピュータ可読媒体に格納された実行可能な命令で具現化することができる。
【図面の簡単な説明】
【0014】
本発明の詳細は、その構造および動作の両方に関して、同様の部品に同様の参照数字を付している添付図面の研究によって部分的に得ることができる。
【
図1】
図1は、一実施形態による、本明細書に記載した処理(プロセス)の1つまたは複数が実行され得る、例示的な処理システムを示す。
【
図2】
図2は、一実施形態による、再現されるシステム動作を表す、例示的なグラフを示す。
【
図3】
図3は、第1の実施形態による、刺激されたソフトウェア実体を待ち行列に入れることによってデータを再現するためのアルゴリズムを示す。
【
図4A】
図4Aは、実施形態による、アルゴリズムの第1の実施形態についての待ち行列に入れる戦略の変形例を示す。
【
図4B】
図4Bは、実施形態による、アルゴリズムの第1の実施形態についての待ち行列に入れる戦略の変形例を示す。
【
図4C】
図4Cは、実施形態による、アルゴリズムの第1の実施形態についての待ち行列に入れる戦略の変形例を示す。
【
図5】
図5は、第2の実施形態による、イベントを待ち行列に入れることによってデータを再現するためのアルゴリズムを示す。
【
図6A】
図6Aは、実施形態による、アルゴリズムの第2の実施形態についての待ち行列に入れる戦略の変形例を示す。
【
図6B】
図6Bは、実施形態による、アルゴリズムの第2の実施形態についての待ち行列に入れる戦略の変形例を示す。
【
図6C】
図6Cは、実施形態による、アルゴリズムの第2の実施形態についての待ち行列に入れる戦略の変形例を示す。
【発明を実施するための形態】
【0015】
一実施形態では、ソフトウェア実体間のイベントの決定的再現のためのシステム、方法、および非一時的コンピュータ可読媒体が開示される。この説明を読んだ後、当業者には、様々な代替の実施形態および代替のアプリケーションにおいて本発明を実施する方法が明らかになるであろう。しかしながら、本発明の様々な実施形態が本明細書で説明されても、これらの実施形態は、例および説明のためにのみ提示され、限定するものでないことが理解されよう。かくして、様々な実施形態についてのこの詳細な説明は、添付の特許請求の範囲が規定する本発明の範囲または広がりを制限するものと解釈されるべきではない。
【0016】
(1.システムの概要)
図1は、本明細書に説明する様々な実施形態に関連して使用され得る例示的な有線または無線システム100を示すブロック図である。例えば、システム100は、本明細書に説明する(例えば、本明細書に記載する1つもしくは複数のソフトウェア実体、コーディネータ、または他のソフトウェアモジュールを記憶および/または実行するための)機能、プロセス、または方法の1つもしくは複数として、またはそれらと関連して使用することができる。システム100は、サーバ、従来のパーソナルコンピュータ、ロボットもしくは車両内の制御システム、または任意の他のプロセッサ対応装置であり得る。当業者には明らかなように、他のコンピュータシステムおよび/またはアーキテクチャを使用することもできる。
【0017】
システム100は、好ましくは、1つまたは複数のプロセッサ110を含む。プロセッサ110は、中央処理装置(CPU)を含んでもよい。追加のプロセッサ、例えば、画像処理ユニット(GPU)、入力/出力を管理する補助プロセッサ、浮動小数点数学演算を実行する補助プロセッサ、信号処理アルゴリズムの高速実行に適したアーキテクチャを有する特殊用途マイクロプロセッサ(例えば、デジタル信号プロセッサ)、主処理システムに従属するスレーブプロセッサ(例えば、バックエンドプロセッサ)、デュアルもしくはマルチプロセッサシステム用の追加マイクロプロセッサもしくはコントローラ、および/またはコプロセッサなどが提供されてもよい。そのような補助プロセッサは、別個のプロセッサであってもよいし、プロセッサ110と統合されてもよい。システム100と共に使用され得るプロセッサの例は、限定されないが、「Pentium(登録商標)」プロセッサ、「Core i7」プロセッサ、および「Xeon(登録商標)」プロセッサを含み、これらはすべて、カリフォルニア州サンタクララのインテル社から入手可能である。
【0018】
プロセッサ110は、好ましくは、通信バス105に接続される。通信バス105は、システム100の記憶装置と他の周辺部品との間の情報転送を容易にするためのデータチャネルを含んでもよい。さらに、通信バス105は、データバス、アドレスバス、および/または制御バス(図示せず)を含む、プロセッサ110との通信に使用される信号のセットを提供してもよい。通信バス105は、例えば、業界標準アーキテクチャ(ISA)、拡張業界標準アーキテクチャ(EISA)、マイクロチャネルアーキテクチャ(MCA)、周辺部品相互接続(PCI)ローカルバス、「IEEE488」汎用インタフェースバス(GPIB)、「IEEE696/S-100」、および/または同種のものを含む米国電気電子学会(IEEE)によって広められた標準などの任意の標準または非標準バスアーキテクチャから構成されてもよい。
【0019】
システム100は、好ましくは、主メモリ115を含み、また、二次メモリ120を含んでもよい。主メモリ115は、本明細書で論ずる1つ以上の機能および/またはモジュールなど、プロセッサ110上で実行されるプログラムのための命令およびデータの記憶装置を提供する。メモリに記憶され、プロセッサ110によって実行されるプログラムは、限定されないが、「C/C++」、「Java」、「JavaScript」、「Perl」、「Visual Basic」、「.NET」などを含む任意の適切な言語に従って記述および/またはコンパイルすることができるのを理解するべきである。主メモリ115は、典型的には、動的ランダムアクセスメモリ(DRAM)および/または静的ランダムアクセスメモリ(SRAM)のような半導体ベースのメモリである。他の半導体ベースのメモリ種は、例えば、同期ダイナミックランダムアクセスメモリ(SDRAM)、ラムバス動的ランダムアクセスメモリ(RDRAM)、強誘電体ランダムアクセスメモリ(FRAM)、および読み取り専用メモリ(ROM)等が含まれる。
【0020】
二次メモリ120は、任意に、内部媒体125および/または取り外し可能媒体130を含んでもよい。取り外し可能媒体130は、任意の周知の方法で読み取られ、かつ/または書き込まれる。取り外し可能記憶媒体130は、例えば、磁気テープドライブ、コンパクトディスク(CD)ドライブ、デジタル多用途ディスク(DVD)ドライブ、他の光学ドライブ、フラッシュメモリドライブ、および/または同種のものであってよい。
【0021】
二次メモリ120は、そこに格納されているコンピュータ実行可能コード(例えば、開示されたソフトウェアモジュール)および/または他のデータを有する非一時的コンピュータ読取可能媒体である。二次メモリ120に格納されたコンピュータソフトウェアまたはデータは、プロセッサ110による実行のために主メモリ115に読み込まれる。
【0022】
別の実施形態では、二次メモリ120は、コンピュータプログラムまたは他のデータもしくは命令をシステム100にロードすることを可能にするための他の同様の手段を含んでもよい。そのような手段は、例えば、ソフトウェアおよびデータを外部記憶媒体145からシステム100に転送することを可能にする通信インタフェース140を含んでもよい。外部記憶媒体145の例は、外部ハードディスクドライブ、外部光学ドライブ、外部光磁気ドライブ、および/または同種のものを含んでもよい。二次メモリ120の他の例は、プログラム可能読み取り専用メモリ(PROM)、消去可能なプログラム可能読み取り専用メモリ(EPROM)、電気的に消去可能な読み取り専用メモリ(EEPROM)、およびフラッシュメモリ(EEPROMと同様のブロック指向メモリ)などの半導体ベースのメモリであり得る。
【0023】
上述したように、システム100は、通信インタフェース140を含んでもよい。通信インタフェース140は、システム100と外部装置(例えば、プリンタ)、ネットワーク、または他の情報源との間でソフトウェアおよびデータを転送することを可能にする。例えば、コンピュータソフトウェアまたはデータは、通信インタフェース140を介して、ネットワークサーバから1つもしくは複数のネットワーク(例えば、インターネットを含む)上をシステム100に転送されてもよい。通信インタフェース140の例としては、内蔵ネットワークアダプタ、ネットワークインタフェースカード(NIC)、パーソナルコンピュータメモリカード国際協会(PCMCIA)ネットワークカード、カードバスネットワークアダプタ、無線ネットワークアダプタ、ユニバーサルシリアルバス(USB)ネットワークアダプタ、モデム、無線データカード、通信ポート、赤外線インタフェース、「IEEE1394」ファイアワイヤ、システム100とネットワークまたは別のコンピュータ装置とをインタフェース可能なその他の任意の装置が含まれる。通信インタフェース140は、好ましくは、イーサネット「IEEE802」規格、ファイバチャネル、デジタル加入者線(DSL)、非同期デジタル加入者線(ADSL)、フレームリレー、非同期転送モード(ATM)、統合デジタルサービスネットワーク(ISDN)、個人通信サービス(PCS)、伝送制御プロトコル/インターネットプロトコル(TCP/IP)、シリアルラインインターネットプロトコル/ポイントプロトコル(SLIP/PPP)など業界周知のプロトコル基準を実装するが、カスタム化された、または標準外のインタフェースプロトコルを実装してもよい。
【0024】
通信インタフェース140を介して転送されるソフトウェアおよびデータは、一般に、電気通信信号155の形態である。これらの信号155は、通信チャネル150を介して通信インタフェース140に提供されてもよい。実施形態において、通信チャネル150は、有線もしくは無線ネットワーク、または任意の様々な他の通信リンクであってもよい。通信チャネル150は、信号155を搬送し、いくつか例を挙げると、ワイヤもしくはケーブル、光ファイバ、従来の電話回線、セルラー電話リンク、無線データ通信リンク、無線周波数(「RF」)リンク、もしくは赤外線リンクを含む、様々な有線または無線通信手段を使用して実装することができる。
【0025】
コンピュータ実行可能コード(例えば、1つもしくは複数のソフトウェアモジュールからなるコンピュータプログラム)は、主メモリ115および/または二次メモリ120に格納される。コンピュータ実行可能コードは、通信インタフェース140を介して受信され、主メモリ115および/または二次メモリ120に格納することも可能である。このようなコンピュータ実行可能コードが実行されると、システム100は、本明細書の他の箇所で説明したような開示された実施形態の様々な機能を実行することができる。
【0026】
本明細書では、「コンピュータ可読媒体」という用語は、コンピュータ実行可能コードおよび/または他のデータをシステム100にまたはシステム100内に提供するために使用される任意の非一時的コンピュータ可読記憶媒体を指すために使用される。そのような媒体の例としては、主メモリ115、二次メモリ120(内部メモリ125、取り外し可能媒体130、および外部記憶媒体145を含む)、および通信インタフェース140と通信可能に結合されている任意の周辺装置(ネットワーク情報サーバまたは他のネットワーク装置を含む)が挙げられる。これらの非一時的なコンピュータ可読媒体は、実行可能なコード、プログラミング命令、ソフトウェア、および/または他のデータをシステム100に提供するための手段である。
【0027】
ソフトウェアを用いて実装される実施形態では、ソフトウェアは、コンピュータ可読媒体に格納され、取り外し可能媒体130、入力/出力(I/O)インタフェース135、または通信インタフェース140によってシステム100にロードすることができる。このような実施形態では、ソフトウェアは、電気通信信号155の形態でシステム100にロードされる。ソフトウェアは、プロセッサ110によって実行されるとき、好ましくは、プロセッサ110に、本明細書の他の場所で説明されるプロセスおよび機能のうちの1つまたは複数を実行させる。
【0028】
実施形態において、I/Oインタフェース135は、システム100の1つもしくは複数の部品と、1つもしくは複数の入力および/または出力装置との間のインタフェースを提供する。入力装置の例は、限定されないが、センサ、キーボード、タッチスクリーンまたは他のタッチセンシティブ装置、カメラ、生体感知装置、コンピュータマウス、トラックボール、ペン系のポインティング装置、および/または同種のものを含む。出力装置の例としては、限定されないが、他の処理装置、陰極線管(CRT)、プラズマディスプレイ、発光ダイオード(LED)ディスプレイ、液晶ディスプレイ(LCD)、プリンタ、真空蛍光ディスプレイ(VFD)、表面伝導電子エミッタディスプレイ(SED)、電界放出ディスプレイ(FED)、および/または同種のものが挙げられる。場合によっては、タッチパネルディスプレイ(例えば、スマートフォン、タブレット、または他のモバイル装置)の場合など、入力装置と出力装置とが組み合わされることがある。
【0029】
システム100は、音声ネットワークおよび/またはデータネットワークを介した無線通信を容易にする任意の無線通信部品も含むこともできる。無線通信部品は、アンテナシステム170と、無線システム165と、およびベースバンドシステム160とを含む。システム100において、無線周波数(RF)信号は、無線システム165の管理の下、アンテナシステム170によって空中で送受信される。
【0030】
一実施形態において、アンテナシステム170は、1つまたは複数のアンテナと、アンテナシステム170に送信および受信信号経路を提供するために切り換え機能を実行する1つまたは複数のマルチプレクサ(図示せず)とを含み得る。受信経路において、受信RF信号は、マルチプレクサから、受信RF信号を増幅し増幅された信号を無線システム165に送信する低雑音増幅器(図示せず)に結合され得る。
【0031】
別の実施形態では、無線システム165は、様々な周波数で通信するように構成された1つまたは複数の無線機を含むことができる。一実施形態において、無線システム165は、復調器(図示せず)と変調器(図示せず)とを1つの集積回路(IC)に組み合わせることができる。また、復調器と変調器とは、別個の部品であってもよい。受信経路において、復調器は、ベースバンド受信オーディオ信号を残してRF搬送波信号を剥ぎ取り、これは、無線システム165からベースバンドシステム160に送信される。
【0032】
受信信号に音声情報が含まれている場合、ベースバンドシステム160は、その信号を復号化し、アナログ信号に変換する。そして、信号を増幅し、スピーカーに送る。また、ベースバンドシステム160は、マイクロフォンからアナログオーディオ信号を受信する。これらのアナログオーディオ信号は、ベースバンドシステム160によってデジタル信号に変換され、符号化される。ベースバンドシステム160はまた、送信のためにデジタル信号を符号化し、無線システム165の変調器部分に経路化されるベースバンド送信オーディオ信号を生成する。変調器は、ベースバンド送信オーディオ信号をRF搬送波信号と混合し、アンテナシステム170に経路化され、電力増幅器(図示せず)を通過することができるRF送信信号を生成する。電力増幅器は、RF送信信号を増幅し、それをアンテナシステム170に経路化し、そこで信号は送信のためにアンテナポートへ切り換えられる。
【0033】
ベースバンドシステム160はまた、プロセッサ110と通信可能に結合されている。プロセッサ110は、データ記憶領域である115および120にアクセスすることができる。プロセッサ110は、好ましくは、主メモリ115または二次メモリ120に格納することができる命令(すなわち、開示されたアプリケーションなどのコンピュータプログラム、またはソフトウェアモジュール)を実行するように構成されている。コンピュータプログラムは、ベースバンドプロセッサ160から受信されて、主メモリ110もしくは二次メモリ120に格納されるか、または受信時に実行されることも可能である。このようなコンピュータプログラムが実行されると、システム100は、開示された実施形態の様々な機能を実行することができる。
【0034】
(2.プロセスの概要)
次に、ソフトウェア実体間のイベントの決定的再現のためのプロセスの実施形態について詳細に説明する。説明するプロセスは、例えば、コンピュータプログラムまたはソフトウェアパッケージとして、1つまたは複数のハードウェアプロセッサ(例えば、プロセッサ110)によって実行される1つまたは複数のソフトウェアモジュールにおいて具現化することができることを理解するべきである。説明するプロセスは、ソースコード、オブジェクトコード、および/またはマシンコードで表される命令として実装することもできる。これらの命令は、ハードウェアプロセッサ110によって直接実行してもよいし、あるいは、オブジェクトコードとハードウェアプロセッサ110との間で動作する仮想マシンによって実行することもできる。
【0035】
あるいは、説明するプロセスは、ハードウェア部品(例えば、汎用プロセッサ、集積回路(IC)、特定用途向け集積回路(ASIC)、デジタル信号プロセッサ(DSP)、フィールドプログラマブルゲートアレイ(FPGA)もしくは他のプログラマブル論理装置、個別ゲートもしくはトランジスタ論理など)、ハードウェア部品の組み合わせ、またはハードウェアおよびソフトウェア部品の組み合わせとして実装することができる。ハードウェアとソフトウェアとの交換可能性を明確に示すために、様々な例示的な構成要素、ブロック、モジュール、回路、およびステップを、その機能性の観点から一般的に本明細書で説明する。このような機能をハードウェアとして実装するか、ソフトウェアとして実装するかは、システム全体に課される特定の用途および設計上の制約に依存する。熟練者であれば、特定のアプリケーションごとに様々な方法で説明した機能を実装することができるが、そのような実装の決定は、本発明の範囲から逸脱する原因となると解釈すべきではない。さらに、部品、ブロック、モジュール、回路、またはステップ内の機能のグループ化は、説明を容易にするためのものである。特定の機能またはステップは、本発明から逸脱することなく、1つの部品、ブロック、モジュール、回路、またはステップから別のものに移動させることができる。
【0036】
さらに、本明細書で説明するプロセスは、サブプロセスの特定の配置および順序で例示されているが、各プロセスは、より少ない、より多い、または異なるサブプロセスと、サブプロセスの異なる配置および/または順序とで実施され得る。さらに、サブプロセスを特定の順序で説明または図示している場合でも、他のサブプロセスの完了に依存しない任意のサブプロセスは、その他の独立したサブプロセスの前、後、または並行して実行してもよいことを理解するべきである。
【0037】
(2.1.はじめに)
ソフトウェア実体間で記録されたイベントのすべての再現が同じ結果を導くことを保証するアルゴリズムの実施形態が開示される。ソフトウェア実体の内部状態などの特定の態様が再現されない場合、再現の結果は、データが記録されたシステムの結果と異なる可能性がある。しかし、固定された計算を行い、(例えば、他のソフトウェア実体との)固定されたインタフェースおよび接続を有するソフトウェア実体の固定されたセットについては、任意の再現が再生成可能であろう。これにより、再現を実行するシステムのハードウェア環境および実行時動作に依存しない、再現可能なテストが可能となる。
【0038】
一実施形態では、この再現性は、再現されたイベントによって刺激されるソフトウェア実体の入力と実行順序とを制御するコーディネータを使用することによって達成される。非決定性は、ソフトウェア実体が実行されている間、ソフトウェア実体にメッセージが送信されないことを保証し、ソフトウェア実体が実行される画定された順序があることを保証することによって、回避することができる。これは、(1)コーディネータに実行準備が整ったソフトウェア実体を待ち行列に入れさせ、一度に一つのソフトウェア実体のみが実行され、複数のソフトウェア実体が刺激されたときにソフトウェア実体が実行される画定された順序があることを保証するか、(2)コーディネータに再現(例えば、送信または転送)準備が整ったイベントを待ち行列に入れさせ、並列に実行するソフトウェア実体の出力するイベントが他のソフトウェア実体に送信される画定された順序があり、ソフトウェア実体が実行されている間はいかなるイベントも送信されないこと保証することによって実装することができる。
【0039】
一実施形態において、ソフトウェア実体は、単一のシステム100上で(例えば、1つまたは複数のマルチコアプロセッサを含み得る、1つまたは複数のプロセッサ110によって)実行することができ、または(例えば、有線または無線通信を介して)互いに通信する複数のシステム100にわたって分散されてもよい。さらに、コーディネータは、ソフトウェア実体の1つまたは複数またはすべてと同じシステム100上で実行するソフトウェアモジュールであってもよいし、ソフトウェア実体が実行されるシステムまたはシステム100とは別の、かつそれらと(例えば、有線通信または無線通信を介して)通信するシステム100上で実行するものであってもよい。いずれにせよ、コーディネータが、開示されたアルゴリズムに従って、入力イベントを用いて、ソフトウェア実体を刺激する。
【0040】
アルゴリズムは、再現されるデータに記録されたイベントによって刺激されるソフトウェア実体に作用する。これらのイベントは、他のソフトウェア実体によって送信されたメッセージの受信を含んでよいし、タイマイベント(例えば、タイマの満了)であってもよい。ソフトウェア実体の刺激は、入力イベント(例えば、メッセージ)を処理するためのソフトウェア実体の1つまたは複数のモジュールを実行することを含み、これは、他のソフトウェア実体に送信されて消費される追加のイベント(例えば、メッセージ)を潜在的に生成し(例えば、刺激されたソフトウェア実体から他のソフトウェア実体にメッセージを送信することによる)、それによって他のソフトウェア実体が刺激されて、さらなるソフトウェア実体が刺激される追加のイベントを生成する、等々と続いていく可能性がある。
【0041】
一実施形態において、コーディネータは、イベントをいつ再現(例えば、送信)するか、および/またはソフトウェア実体をいつ実行する(すなわち、刺激する入力イベントを処理する)かについて制御する。例えば、コーディネータは、実行中のソフトウェア実体によって出力されるすべてのイベントを横取りし、それらのイベントが実行中のソフトウェア実体によって他のソフトウェア実体に送信されないようにすることができる。その後、コーディネータは、アルゴリズムに従って選択した時間にそれらのイベントを再現(例えば、送信)することができる。さらに、またはあるいは、コーディネータはソフトウェア実体と通信して、ソフトウェア実体がいつ実行する(例えば、待機している入力イベントを処理する)かを制御してもよい。このように、コーディネータは、ソフトウェア実体がアルゴリズムに従って選択した時間にのみ実行するように保証することができる。
【0042】
システム内の動作または刺激のパターンは、ソフトウェア実体を節、イベントを辺とするグラフとして視覚的に表現することができる。
図2は、実施形態による、再現されるシステムの動作を表す、グラフの例を示す。この例示的なグラフは、システム250において記録されたデータ200を再現するためのアルゴリズムの種々の実施形態間の差異を説明するために、本明細書で利用される。簡単のために、ソフトウェア実体を単に「実体[数字]」と参照し、イベントを単に「イベント[文字]」と参照することにする。この例では、記録200は、実体1と実体2とに入力されるイベントAで始まる。実体1はイベントAによって刺激されてイベントBとイベントCとを出力し、実体2はイベントAによって刺激されてイベントDを出力し、イベントBは実体3を刺激してイベントEを出力し、イベントCとDとは実体4を刺激してイベントFを出力し、実体5はイベントB、D、E、Fによって刺激されるがイベントを出力しない(またはイベントを出力するがイベントは記録200に記録されないか再現されない)。
【0043】
各ソフトウェア実体は、1つまたは複数の入力に基づいて個別的な機能を実行するように構成されているソフトウェアモジュールを含んでもよいことを理解されたい。例として、記録された、かつ/または再現中に刺激されているソフトウェア実体は、ロボットまたは車両(例えば、自律または半自律車両)のセンサシステムまたは制御システムを駆動してもよい。非限定的な一例として、実体1および実体2は、それぞれが別々のセンサから、点群からなるメッセージを受信する別々のフィルタであってもよい。実体1および実体2は、それぞれ、無駄な情報またはノイズを除去するためにそれぞれの点群を前処理し、前処理された点群をそれぞれイベントCおよびイベントDとして出力することができる。実体4は、イベントCおよびイベントDの点群を合成点群に融合するためにセンサ融合を実行し、合成点群をイベントFとして出力することができる。実体5は、イベントF(例えば、合成点群を含むメッセージ)を受信し、合成点群にクラスタリングを適用してもよい。この場合、システム250は、自律車両の運転システムにおける知覚システムの一部を表すことができる。自律車両の運転システムなどの完全なシステムは、種々の機能(例えば、点群の処理、速度および他の車両情報の取得、オブジェクトリストの管理など)を表す多くのそのようなサブシステムを含み、各サブシステムは多くのソフトウェア実体を含み、多くのイベントを発生させ得ることを理解されたい。再現は、システム全体、またはシステム内の関心のある部分(例えば、1つまたは複数のサブシステム)のみに対して実行することができる。
【0044】
(2.2.アルゴリズムの第1の実施形態)
図3は、第1の実施形態による、刺激されたソフトウェア実体を待ち行列に入れることによってデータを再現するためのアルゴリズム300を示す。アルゴリズム300は、ソフトウェア実体の実行とイベントの再現(例えば、ソフトウェア実体へのイベントの送信)とを調整し、かつ刺激されたソフトウェア実体の待ち行列を管理するコーディネータによって実行することができることを理解されたい。コーディネータは、ソフトウェア実体を実行するシステム250と同一か、またはそれと通信するシステム100の1つまたは複数のプロセッサ110によって実行することができる。
【0045】
最初は、コーディネータは、再現されるシステム内のソフトウェア実体およびイベント(例えば、通信ミドルウェアを介して送信されるメッセージ)への接続を含む、再現されるシステムのトポロジーを学習することができる。すなわち、コーディネータは、
図2の例で可視化したようなシステムのグラフを取り込むことができる。ソフトウェア実体の特定は、コーディネータに入力される、またはコーディネータによってアクセスされる構成ファイルから取得または構築し得る。あるいは、コーディネータは、任意の適切なメカニズムを使用して、再現されるシステムからこの情報を照会してもよい。同様に、各ソフトウェア実体に入力されるイベントおよび/または各ソフトウェア実体によって出力されるイベントも、構成ファイルから取得するか、または再現されるシステムから照会し得る。
【0046】
サブプロセス310において、アルゴリズム300は、再現する次のイベントがあるか否かを決定する。再現する次のイベントがある場合(すなわち、サブプロセス310において「Yes」)、アルゴリズム300は、サブプロセス320において次のイベントを再現する。そうでなければ、再現する次のイベントがない場合(すなわち、サブプロセス310において「No」)、アルゴリズム300は終了してもよい。したがって、アルゴリズム300は、再現すべきイベントがなくなるまで、任意の初期イベントおよび再現中にソフトウェア実体によって出力される任意のイベントを含む、記録200の各イベントを再現することを理解されたい。
【0047】
サブプロセス320において、アルゴリズム300は、次のイベントを再現する。イベントを再現することは、イベントを入力として消費する任意のソフトウェア実体に、イベントをメッセージとして送信または転送することを含み得る。イベントは、イベントを消費する特定のソフトウェア実体に送信するか、またはすべてのソフトウェア実体にブロードキャストし、ソフトウェア実体がイベントを消費するか否かを自ら決定することができる。いずれの場合も、任意のイベントは、1つのソフトウェア実体によって消費されてもよいし、複数のソフトウェア実体によって消費されてもよいし、どのソフトウェア実体によっても消費されなくてもよい。イベントを消費するソフトウェア実体は、入力としてそのイベントによって「刺激」される。
【0048】
サブプロセス330において、アルゴリズム300は、サブプロセス320で再現されたイベントによって刺激されたすべてのソフトウェア実体(もしあれば)を待ち行列に追加する。これは、実際のソフトウェア実体を待ち行列に追加することを必要としないことを理解されたい。むしろ、ソフトウェア実体が待ち行列に追加または挿入されるとして本明細書で論じられるとき、これは、ソフトウェア実体の識別子またはソフトウェア実体への参照が待ち行列に追加または挿入される状況を包含する。刺激されたソフトウェア実体は、様々な戦略に従って待ち行列に追加することができる。これらの戦略のうちのいくつかについて、第1の実施形態の変形例として、
図4A~4Cを参照しながら、以下で議論する。重要な点は、待ち行列が、複数の再現にわたって再生成可能な刺激されたソフトウェア実体の順序付けを提供することである。また、場合によっては、サブプロセス320において再現されるイベントはいかなるソフトウェア実体も刺激せず、その結果、サブプロセス330において待ち行列にいかなるソフトウェア実体も挿入されない場合があることを理解されたい。
【0049】
サブプロセス340において、アルゴリズム300は、待ち行列が空であるかどうか、または逆に、待ち行列に残っている刺激されたソフトウェア実体があるかどうかを決定する。待ち行列が空(すなわち、サブプロセス340において「Yes」)である場合、アルゴリズム300はサブプロセス310に戻り、記録200に任意のイベントが残っているか否かを決定する。そうでなければ、少なくとも1つの刺激されたソフトウェア実体が待ち行列に残っている(すなわち、サブプロセス340において「No」である)場合、アルゴリズム300は、サブプロセス350において、待ち行列内の次のソフトウェア実体を実行する。
【0050】
サブプロセス350において、待ち行列の次のソフトウェア実体は、待ち行列から除去され、実行される。特に、ソフトウェア実体は、サブプロセス320で入力として再現されたイベントを処理するために実行される。例えば、ソフトウェア実体は、入力イベントを表すメッセージ内のデータを解析し、そのデータを処理して、ゼロ、1、または複数の出力イベントを生成することができる。各出力イベントは、1つまたは複数の他のソフトウェア実体に送信される別のメッセージとして表すことができる。コーディネータは、入力イベントを使用してソフトウェア実体を呼び出すか、または他の方法でトリガすることにより、システム250内の任意の所与のソフトウェア実体の実行を制御することができ、応答として出力イベントを受信することができる。
【0051】
サブプロセス360において、アルゴリズム300は、サブプロセス350で実行されたソフトウェア実体によって出力されたイベント(もしあれば)のすべてを、1つまたは複数の他のソフトウェア実体に送信する。具体的には、例えば、これらのイベントは、1つもしくは複数の他のソフトウェア実体に転送することができ、または複数のソフトウェア実体(例えば、システム250内のすべてのソフトウェア実体)にブロードキャストすることができる。次に、アルゴリズム300は、サブプロセス330に戻り、サブプロセス360で送信されたイベントによって刺激された任意のソフトウェア実体を待ち行列に入れる。場合によっては、サブプロセス350において実行されるソフトウェア実体は、イベントを出力せず、その結果、サブプロセス360において送信されるイベントがないことを理解されたい。
【0052】
まとめると、アルゴリズム300によって表されるこの第1の実施形態では、実行される(すなわち、再現されたイベントによって刺激された)ソフトウェア実体は、待ち行列に入れられる。ソフトウェア実体が待ち行列に入れられる順序は、同一の順序がすべての再現で再現される限り、様々な戦略に従って実施することができる。あるソフトウェア実体が実行されると、他のソフトウェア実体に送信されそれを刺激する追加イベントを出力し得る。刺激された各ソフトウェア実体は、選択された戦略に従って待ち行列に追加される。待ち行列が空になると、コーディネータは記録から次のイベントの再現をトリガする。ソフトウェア実体は、第1のイベントによる事前の刺激の結果として既に待ち行列に入っている間に、第2のイベントによって再び刺激された場合、ソフトウェア実体を待ち行列に再び挿入する(すなわち、第1のイベントに対し1回目を実行し、第2のイベントのために2回目を実行する)か、またはソフトウェア実体が一度に待ち行列内の単一の位置にのみ存在するように再び挿入することをしない(すなわち、1回のみ実行し、第1のイベントと第2のイベントとの両方を同時に処理する)かのいずれかをできる。
【0053】
アルゴリズム300において待ち行列にソフトウェア実体を追加するための戦略の変形例を、
図4A~4Cに示す。しかし、これらの戦略は非限定的な例であり、他の戦略が可能であることを理解されたい。
【0054】
(2.2.1.第1実施形態の第1の変形例)
図4Aは、待ち行列に入れる戦略の第1の変形例による、アルゴリズム300の動作を示す。この第1の変形例では、コーディネータ400は、ソフトウェア実体が待ち行列410内の別の位置に既に存在するか否かに関係なく、新たに刺激された各ソフトウェア実体を待ち行列410の最後尾に挿入する。したがって、各イベントは、そのイベントによって刺激されるすべてのソフトウェア実体の待ち行列に入れることおよび実行することをもたらす。したがって、コーディネータ400は、以下のように記録200を再現する。
【0055】
(1)初めに、イベントAを記録200から再現する(例えば、サブプロセス320)。つまり、コーディネータ400は、イベントAを送信し、イベントAは、実体1と実体2とを刺激する。したがって、コーディネータ400は、待ち行列410に、実体1と実体2とを挿入する(例えば、サブプロセス330)。本明細書で説明する、イベントが再現される各例において、コーディネータ400によってイベントは再現することができることを理解されたい。あるいは、イベントは、コーディネータ400の支援なしに(例えば、通常の動作中にそうであるように、イベントを出力するソフトウェア実体の単なる実行によって)再現されてもよい。
【0056】
(2)次に、コーディネータ400は、待ち行列410の先頭から、実体1を実行する(例えば、サブプロセス350)。この実行の結果、実体1は、イベントBとイベントCとを出力し、再現される(例えば、サブプロセス360)。つまり、イベントBとイベントCとは、メッセージとして送信される。イベントBは、実体3と実体5とを刺激する。イベントCは、実体4を刺激する。したがって、コーディネータ400は、待ち行列410の最後尾に、実体3、実体5、および実体4を挿入する(例えば、サブプロセス330)。
【0057】
(3)次に、コーディネータ400は、待ち行列410の先頭から、実体2を実行する(例えば、サブプロセス350)。この実行の結果、実体2は、イベントDを出力し、再現される(例えば、サブプロセス360)。つまり、イベントDがメッセージとして送信される。イベントDは、実体4と実体5とを刺激する。したがって、コーディネータ400は、待ち行列410の最後尾に、実体4と実体5とを挿入する(例えば、サブプロセス330)。
【0058】
(4)次に、コーディネータ400は、待ち行列410の先頭から、実体3を実行する(例えば、サブプロセス350)。この実行の結果、実体3は、イベントEを出力し、再現される(例えば、サブプロセス360)。つまり、イベントEは、メッセージとして送信される。イベントEは、実体5を刺激する。したがって、コーディネータ400は、待ち行列410の最後尾に、実体5を挿入する(例えば、サブプロセス330)。
【0059】
(5)次に、コーディネータ400は、待ち行列410の先頭から、実体5を実行する(例えば、サブプロセス350)。この実体5の実行では、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0060】
(6)次に、コーディネータ400は、待ち行列410の先頭から、実体4を実行する(例えば、サブプロセス350)。この実行の結果、実体4は、イベントFを出力し、再現される(例えば、サブプロセス360)。つまり、イベントFは、メッセージとして送信される。イベントFは、実体5を刺激する。したがって、コーディネータ400は、待ち行列410の最後尾に、実体5を挿入する(例えば、サブプロセス330)。
【0061】
(7)次に、コーディネータ400は、待ち行列410の先頭から、実体4を実行する(例えば、サブプロセス350)。この実行の結果、実体4は、イベントFを出力し、再現される(例えば、サブプロセス360)。つまり、イベントFは、メッセージとして送信される。イベントFは、実体5を刺激する。したがって、コーディネータ400は、待ち行列410の最後尾に、実体5を挿入する(例えば、サブプロセス330)。
【0062】
(8)次に、コーディネータ400は、待ち行列410の先頭から、実体5を実行する(例えば、サブプロセス350)。この実体5の実行では、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0063】
(9)次に、コーディネータ400は、待ち行列410の先頭から、実体5を実行する(例えば、サブプロセス350)。この実体5の実行では、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0064】
(10)次に、コーディネータ400は、待ち行列410の先頭から、実体5を実行する(例えば、サブプロセス350)。この実体5の実行では、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0065】
(11)次に、コーディネータ400は、待ち行列410の先頭から、実体5を実行する(例えば、サブプロセス350)。この実体5の実行では、イベントは出力されない。したがって、待ち行列410への挿入は行われない。さらに、この実行後、待ち行列410は空(例えば、サブプロセス340で「Yes」)であり、記録200にイベントは残っていない(例えば、サブプロセス310で「No」である)。したがって、コーディネータ400は、記録200の再現を完了した(例えば、プロセス300は終了する)。
【0066】
(2.2.2.第1の実施形態の第2の変形例)
図4Bは、待ち行列に入れる戦略の第2の変形例による、アルゴリズム300の動作を示す。この第2の変形例では、コーディネータ400は、ソフトウェア実体が待ち行列410の別の位置に既に存在しない限り、新たに刺激された各ソフトウェア実体を待ち行列410の最後尾に挿入し、既に存在する場合、待ち行列410のソフトウェア実体を重複させないように待ち行列410にソフトウェア実体を挿入しない。したがって、コーディネータ400は、以下のように記録200を再現する。
【0067】
(1)初めに、イベントAを記録200から再現する(例えば、サブプロセス320)。つまり、コーディネータ400は、イベントAを送信し、イベントAは、実体1と実体2とを刺激する。したがって、コーディネータ400は、待ち行列410に、実体1と実体2とを挿入する(例えば、サブプロセス330)。
【0068】
(2)次に、コーディネータ400は、待ち行列410の先頭から、実体1を実行する(例えば、サブプロセス350)。この実行の結果、実体1は、イベントBとイベントCとを出力し、再現される(例えば、サブプロセス360)。つまり、イベントBとイベントCは、メッセージとして送信される。イベントBは、実体3と実体5とを刺激する。イベントCは、実体4を刺激する。したがって、コーディネータ400は、待ち行列410の最後尾に、実体3、実体5、および実体4を挿入する(例えば、サブプロセス330)。
【0069】
(3)次に、コーディネータ400は、待ち行列410の先頭から、実体2を実行する(例えば、サブプロセス350)。この実行の結果、実体2は、イベントDを出力し、再現される(例えば、サブプロセス360)。つまり、イベントDがメッセージとして送信される。イベントDは、実体4と実体5とを刺激する。しかし、実体4と実体5とは、待ち行列410に既に存在する。したがって、待ち行列410への挿入は行われない。
【0070】
(4)次に、コーディネータ400は、待ち行列410の先頭から、実体3を実行する(例えば、サブプロセス350)。この実行の結果、実体3は、イベントEを出力し、再現される(例えば、サブプロセス360)。つまり、イベントEは、メッセージとして送信される。イベントEは、実体5を刺激する。しかし、実体5は、待ち行列410に既に存在する。したがって、待ち行列410への挿入は行われない。
【0071】
(5)次に、コーディネータ400は、待ち行列410の先頭から、実体5を実行する(例えば、サブプロセス350)。この実体5の実行では、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0072】
(6)次に、コーディネータ400は、待ち行列410の先頭から、実体4を実行する(例えば、サブプロセス350)。この実行の結果、実体4は、イベントFを出力し、再現される(例えば、サブプロセス360)。つまり、イベントFは、メッセージとして送信される。イベントFは、実体5を刺激する。したがって、コーディネータ400は、待ち行列410の最後尾に実体5を挿入する(例えば、サブプロセス330)。
【0073】
(7)次に、コーディネータ400は、待ち行列410の先頭から、実体5を実行する(例えば、サブプロセス350)。この実体5の実行では、イベントは出力されない。したがって、待ち行列410への挿入は行われない。さらに、この実行後、待ち行列410は空(例えば、サブプロセス340で「Yes」)であり、記録200にイベントは残っていない(例えば、サブプロセス310で「No」である)。したがって、コーディネータ400は、記録200の再現を完了した(例えば、プロセス300は終了する)。
【0074】
(2.2.3.第1の実施形態の第3の変形例)
図4Cは、待ち行列に入れる戦略の第3の変形例による、アルゴリズム300の動作を示す。この第3の変形例では、コーディネータ400は、ソフトウェア実体が待ち行列410の別の位置に既に存在しない限り、新たに刺激された各ソフトウェア実体を待ち行列410の先頭に挿入し、既に存在する場合、待ち行列410内のソフトウェア実体を重複させないように待ち行列410にソフトウェア実体を挿入しない。したがって、コーディネータ400は、以下のように記録200を再現する。
【0075】
(1)初めに、イベントAを記録200から再現する(例えば、サブプロセス320)。つまり、コーディネータ400は、イベントAを送信し、イベントAは、実体1と実体2とを刺激する。したがって、コーディネータ400は、待ち行列410に、実体1と実体2とを挿入する(例えば、サブプロセス330)。
【0076】
(2)次に、コーディネータ400は、待ち行列410の先頭から、実体1を実行する(例えば、サブプロセス350)。この実行の結果、実体1は、イベントBとイベントCとを出力し、再現される(例えば、サブプロセス360)。つまり、イベントBとイベントCとは、メッセージとして送信される。イベントBは、実体3と実体5とを刺激する。イベントCは、実体4を刺激する。したがって、コーディネータ400は、待ち行列410の先頭に、実体3、実体5、および実体4を挿入する(例えば、サブプロセス330)。
【0077】
(3)次に、コーディネータ400は、待ち行列410の先頭から、実体3を実行する(例えば、サブプロセス350)。この実行の結果、実体3は、イベントEを出力し、再現される(例えば、サブプロセス360)。つまり、イベントEは、メッセージとして送信される。イベントEは、実体5を刺激する。しかし、実体5は、待ち行列410に既に存在する。したがって、待ち行列410への挿入は行われない。
【0078】
(4)次に、コーディネータ400は、待ち行列410の先頭から、実体5を実行する(例えば、サブプロセス350)。この実体5の実行では、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0079】
(5)次に、コーディネータ400は、待ち行列410の先頭から、実体4を実行する(例えば、サブプロセス350)。この実行の結果、実体4は、イベントFを出力し、再現される(例えば、サブプロセス360)。つまり、イベントFは、メッセージとして送信される。イベントFは、実体5を刺激する。したがって、コーディネータ400は、待ち行列410の先頭に実体5を挿入する(例えば、サブプロセス330)。
【0080】
(6)次に、コーディネータ400は、待ち行列410の先頭から、実体5を実行する(例えば、サブプロセス350)。この実体5の実行では、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0081】
(7)次に、コーディネータ400は、待ち行列410の先頭から、実体2を実行する(例えば、サブプロセス350)。この実行の結果、実体2は、イベントDを出力し、再現される(例えば、サブプロセス360)。つまり、イベントDがメッセージとして送信される。イベントDは、実体4と実体5とを刺激する。したがって、コーディネータ400は、待ち行列410の先頭に実体4と実体5とを挿入する(例えば、サブプロセス330)。
【0082】
(8)次に、コーディネータ400は、待ち行列410の先頭から、実体4を実行する(例えば、サブプロセス350)。この実行の結果、実体4は、イベントFを出力し、再現される(例えば、サブプロセス360)。つまり、イベントFは、メッセージとして送信される。イベントFは、実体5を刺激する。しかし、実体5は、待ち行列410に既に存在する。したがって、待ち行列410への挿入は行われない。
【0083】
(9)次に、コーディネータ400は、待ち行列410の先頭から、実体5を実行する(例えば、サブプロセス350)。この実体5の実行では、イベントは出力されない。したがって、待ち行列410への挿入は行われない。さらに、この実行後、待ち行列410は空(例えば、サブプロセス340で「Yes」)であり、記録200にイベントは残っていない(例えば、サブプロセス310で「No」である)。したがって、コーディネータ400は、記録200の再現を完了した(例えば、プロセス300は終了する)。
【0084】
(2.3.アルゴリズムの第2の実施形態)
図5は、第2の実施形態による、イベントを待ち行列に入れることによってデータを再現するためのアルゴリズム500を示す。アルゴリズム500は、ソフトウェア実体の実行とイベントの再現(例えば、ソフトウェア実体へのイベントの送信)とを調整し、かつ出力されたイベントの待ち行列を管理するコーディネータによって実行することができることを理解されたい。コーディネータは、ソフトウェア実体を実行するシステム250と同一か、またはそれと通信するシステム100の1つまたは複数のプロセッサ110によって実行することができる。アルゴリズム300に関して上述したように、コーディネータは、再現されるシステムのトポロジーを学習することができる。
【0085】
サブプロセス510において、アルゴリズム500は、再現する次のイベントがあるか否かを決定する。再現する次のイベントがある場合(すなわち、サブプロセス510において「Yes」)、アルゴリズム500は、サブプロセス520において次のイベントを再現する。そうでなければ、再現する次のイベントがない場合(すなわち、サブプロセス510において「No」)、アルゴリズム500は終了してもよい。サブプロセス510は、サブプロセス310と類似または同一であってよく、したがって、本明細書において重複して説明されない。サブプロセス310の任意の説明は、サブプロセス510に等しく適用することができ、逆もまた同様であることを理解されたい。
【0086】
サブプロセス520において、アルゴリズム500は、次のイベントを再現する。サブプロセス520は、サブプロセス320と類似または同一であってよく、したがって、本明細書において重複して説明されない。サブプロセス320の任意の説明は、サブプロセス520に等しく適用することができ、その逆もまた同様であることを理解されたい。
【0087】
サブプロセス530において、アルゴリズム500は、サブプロセス520で再現されたイベントによって刺激されているすべてのソフトウェア実体(もしあれば)を実行する。ゼロ、1つ、または複数のソフトウェア実体が、サブプロセス520で再現されたイベントによって刺激される可能性があることを理解されたい。特に、イベントを消費する各ソフトウェア実体は、イベントを入力として処理するように実行される。例えば、ソフトウェア実体は、入力イベントを表すメッセージ内のデータを解析し、そのデータを処理して、1つまたは複数の出力イベントを生成することができる。これらの各出力イベントは、1つまたは複数の他のソフトウェア実体に送信される別のメッセージとして表すことができる。サブプロセス530において、刺激されたソフトウェア実体は、並列または直列に実行されてもよい。コーディネータは、入力イベントを使用してソフトウェア実体を呼び出すか、または他の方法でトリガすることにより、システム250内の任意の所与のソフトウェア実体の実行を制御することができ、応答として出力イベントを受信することができる。
【0088】
サブプロセス540において、アルゴリズム500は、サブプロセス530において実行されたソフトウェア実体によって出力されたすべてのイベント(もしあれば)を待ち行列に追加する。これは、実際のイベント(例えば、メッセージ)を待ち行列に追加することを必要としないことを理解されたい。むしろ、イベントが待ち行列に追加または挿入されるとして本明細書で論じられるとき、これは、イベントの識別子またはイベントへの参照が待ち行列に追加または挿入される状況を包含する。イベントは、様々な戦略に従って待ち行列に追加することができる。これらの戦略のうちのいくつかについて、第2の実施形態の変形例として、
図6A~
図6Cを参照しながら、以下で議論する。重要な点は、待ち行列が、出力されたイベントの再生成可能な順序付けを提供することである。また、場合によっては、サブプロセス530で実行されるソフトウェア実体はいかなるイベントも出力せず、その結果、サブプロセス540において待ち行列にいかなるイベントも挿入されない場合があることを理解されたい。
【0089】
サブプロセス550において、アルゴリズム500は、待ち行列が空であるかどうか、または逆に、待ち行列に残っているイベントがあるかどうかを決定する。待ち行列が空(すなわち、サブプロセス550において「Yes」)である場合、アルゴリズム500はサブプロセス510に戻り、記録中に任意のイベントが残っているか否かを決定する。そうでなければ、少なくとも1つのイベントが待ち行列に残っている(すなわち、サブプロセス550において「No」である)場合、アルゴリズム500は、サブプロセス560において、待ち行列内の次のイベントを削除し、その次のイベントを再現する(例えば、イベントを表すメッセージを1つまたは複数のソフトウェア実体に送信することによって)。具体的には、例えば、イベントは、1つまたは複数のソフトウェア実体に転送することができ、または複数のソフトウェア実体にブロードキャストすることができる。次に、アルゴリズム500は、サブプロセス530に戻り、サブプロセス560で送信されたイベントによって刺激された任意のソフトウェア実体を実行する。
【0090】
まとめると、アルゴリズム500によって表されるこの第2の実施形態では、ソフトウェア実体によって出力されるイベントは、待ち行列に入れられる。イベントが待ち行列に入れられる順序は、同一の順序がすべての再現で再現される限り、様々な戦略に従って実施することができる。待ち行列からのイベントが送信されるとき、イベントによって刺激されるすべてのソフトウェア実体は、並行して実行されてもよく、刺激されたソフトウェア実体によって出力されたイベントは、選択された戦略に従って待ち行列に入れられる。一実施形態において、すべてのソフトウェア実体の実行は、待ち行列から次のイベントを再現(送信)する(例えば、サブプロセス520または560において)前に完了されなければならない(例えば、サブプロセス530)。イベントを送信するとき、戦略に応じて、一度に単一のイベントのみを転送するか、またはソフトウェア実体の実行によって生成されるすべてのイベントを一度に転送するかのいずれかである。待ち行列が空になると、コーディネータは記録から次のイベントの再現をトリガする。
【0091】
アルゴリズム500において、待ち行列にイベントを追加するための戦略の変形例を、
図6A~6Cに示す。しかし、これらの戦略は非限定的な例であり、他の戦略が可能であることを理解されたい。
【0092】
(2.3.1.第2の実施形態の第1の変形例)
図6Aは、待ち行列に入れる戦略の第1の変形例による、アルゴリズム500の動作を示す。この第1の変形例では、コーディネータ400は、新たに出力された各イベントを待ち行列410の最後尾に挿入し、一度に1つのイベントのみを送信する。したがって、コーディネータ400は、以下のように記録200を再現する。
【0093】
(1)初めに、イベントAを記録200から再現する(例えば、サブプロセス520)。つまり、コーディネータ400は、イベントAを送信し、イベントAは、実体1と実体2とを刺激する。その結果、実体1と実体2とが実行され(例えば、サブプロセス530)、まとめて、イベントB、イベントC、およびイベントDを出力する。したがって、コーディネータ400は、待ち行列410に、イベントB、イベントC、およびイベントDを挿入する(例えば、サブプロセス540)。
【0094】
(2)次に、待ち行列410の先頭から、イベントBを再現する(例えば、サブプロセス560)。つまり、イベントBがメッセージとして送信される。イベントBは、実体3と実体5とを刺激する。したがって、コーディネータ400は、待ち行列410の最後尾に、イベントEを挿入する(例えば、サブプロセス540)。
【0095】
(3)次に、待ち行列410の先頭から、イベントCを再現する(例えば、サブプロセス560)。つまり、イベントCがメッセージとして送信される。イベントCは、実体4を刺激する。その結果、実体4が実行され(例えば、サブプロセス530)、イベントFを出力する。したがって、コーディネータ400は、待ち行列410の最後尾にイベントFを挿入する(例えば、サブプロセス540)。
【0096】
(4)次に、待ち行列410の先頭から、イベントDを再現する(例えば、サブプロセス560)。つまり、イベントDがメッセージとして送信される。イベントDは、実体4と実体5とを刺激する。その結果、実体4と実体5とが実行され(例えば、サブプロセス530)、まとめて、イベントFを出力する。したがって、コーディネータ400は、待ち行列410の最後尾にイベントFを挿入する(例えば、サブプロセス540)。
【0097】
(5)次に、待ち行列410の先頭から、イベントEを再現する(例えば、サブプロセス560)。つまり、イベントEがメッセージとして送信される。イベントEは、実体5を刺激する。その結果、実体5が実行される(例えば、サブプロセス530)が、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0098】
(6)次に、待ち行列410の先頭から、イベントFを再現する(例えば、サブプロセス560)。つまり、イベントFがメッセージとして送信される。イベントFは、実体5を刺激する。その結果、実体5が実行される(例えば、サブプロセス530)が、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0099】
(7)次に、待ち行列410の先頭から、イベントFを再現する(例えば、サブプロセス560)。つまり、イベントFがメッセージとして送信される。イベントFは、実体5を刺激する。その結果、実体5が実行される(例えば、サブプロセス530)が、イベントは出力されない。したがって、待ち行列410への挿入は行われない。さらに、この実行後、待ち行列410は空(例えば、サブプロセス550で「Yes」)であり、記録200にイベントは残っていない(例えば、サブプロセス510で「No」である)。したがって、コーディネータ400は、記録200の再現を完了した(例えば、プロセス500は終了する)。
【0100】
(2.3.2.第2の実施形態の第2の変形例)
図6Bは、待ち行列に入れる戦略の第2の変形例による、アルゴリズム500の動作を示す。この第2の変形例では、コーディネータ400は、新たに出力された各イベントを待ち行列410の先頭に挿入し、一度に1つのイベントのみを再現(例えば、送信)する。したがって、コーディネータ400は、以下のように記録200を再現する。
【0101】
(1)初めに、イベントAを録画200から再現する(例えば、サブプロセス520)。つまり、コーディネータ400は、イベントAを送信する。イベントAは、実体1と実体2とを刺激する。その結果、実体1と実体2とが実行され(例えば、サブプロセス530)、まとめて、イベントB、イベントC、およびイベントDを出力する。したがって、コーディネータ400は、待ち行列410にイベントB、イベントC、およびイベントDを挿入する(例えば、サブプロセス540)。
【0102】
(2)次に、待ち行列410の先頭から、イベントBを再現する(例えば、サブプロセス560)。つまり、イベントBがメッセージとして送信される。イベントBは、実体3と実体5とを刺激する。したがって、コーディネータ400は、待ち行列410の先頭に、イベントEを挿入する(例えば、サブプロセス540)。
【0103】
(3)次に、待ち行列410の先頭から、イベントEを再現する(例えば、サブプロセス560)。つまり、イベントEがメッセージとして送信される。イベントEは、実体5を刺激する。その結果、実体5が実行される(例えば、サブプロセス530)が、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0104】
(4)次に、待ち行列410の先頭から、イベントCが再現される(例えば、サブプロセス560)。つまり、イベントCがメッセージとして送信される。イベントCは、実体4を刺激する。その結果、実体4が実行され(例えば、サブプロセス530)、イベントFを出力する。したがって、コーディネータ400は、待ち行列410の先頭にイベントFを挿入する(例えば、サブプロセス540)。
【0105】
(5)次に、待ち行列410の先頭から、イベントFを再現する(例えば、サブプロセス560)。つまり、イベントFはメッセージとして送信される。イベントFは、実体5を刺激する。その結果、実体5が実行される(例えば、サブプロセス530)が、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0106】
(6)次に、待ち行列410の先頭から、イベントDを再現する(例えば、サブプロセス560)。つまり、イベントDがメッセージとして送信される。イベントDは、実体4と実体5とを刺激する。その結果、実体4と実体5とが実行され(例えば、サブプロセス530)、まとめて、イベントFを出力する。このように、コーディネータ400は、待ち行列410の先頭にイベントFを挿入する(例えば、サブプロセス540)。
【0107】
(7)次に、待ち行列410の先頭から、イベントFを再現する(例えば、サブプロセス560)。つまり、イベントFはメッセージとして送信される。イベントFは、実体5を刺激する。その結果、実体5が実行される(例えば、サブプロセス530)が、イベントは出力されない。したがって、待ち行列410への挿入は行われない。さらに、この実行後、待ち行列410は空(例えば、サブプロセス550で「Yes」)であり、記録200にイベントは残っていない(例えば、サブプロセス510で「No」である)。したがって、コーディネータ400は、記録200の再現を完了した(例えば、プロセス500が終了する)。
【0108】
(2.3.3.第2の実施形態の第3の変形例)
図6Cは、待ち行列に入れる戦略の第3の変形例による、アルゴリズム500の動作を示す。この第3の変形例では、コーディネータ400は、新たに出力された各イベントを待ち行列410の先頭に挿入し、所与のソフトウェア実体によって出力されたすべてのイベントを同時に再現(例えば、送信)する。したがって、コーディネータ400は、以下のように記録200を再現する。
【0109】
(1)初めに、イベントAを記録200から再現する(例えば、サブプロセス520)。つまり、コーディネータ400は、イベントAを送信し、イベントAは、実体1と実体2とを刺激する。その結果、実体1と実体2とが実行される(例えば、サブプロセス530)。したがって、コーディネータ400は、待ち行列410に、イベントB+CとイベントDとを挿入する(例えば、サブプロセス540)。注目すべきは、イベントBとCとは、共に単一のソフトウェア実体(すなわち、実体1)によって出力されたので、待ち行列410の単一の位置に集合イベントとして追加されることである。
【0110】
(2)次に、待ち行列410の先頭から、イベントB+Cを再現する(例えば、サブプロセス560)。つまり、イベントBとイベントCとがメッセージとして同時に送信される。イベントBは、実体3と実体5とを刺激し、イベントCは、実体4を刺激する。その結果、実体3、実体4、および実体5が実行される(例えば、サブプロセス530)。実体3はイベントEを出力し、実体4はイベントFを出力し、実体5はイベントを出力しない。したがって、コーディネータ400は、待ち行列410の先頭に、イベントEとイベントFとを挿入する(例えば、サブプロセス540)。
【0111】
(3)次に、待ち行列410の先頭からイベントEを再現する(例えば、サブプロセス560)。つまり、イベントEがメッセージとして送信される。イベントEは、実体5を刺激する。その結果、実体5が実行されるが(例えば、サブプロセス530)、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0112】
(4)次に、待ち行列410の先頭から、イベントFを再現する(例えば、サブプロセス560)。つまり、イベントFがメッセージとして送信される。イベントFは、実体5を刺激する。その結果、実体5が実行されるが(例えば、サブプロセス530)、イベントは出力されない。したがって、待ち行列410への挿入は行われない。
【0113】
(5)次に、待ち行列410の先頭から、イベントDを再現する(例えば、サブプロセス560)。つまり、イベントDがメッセージとして送信される。イベントDは、実体4と実体5とを刺激する。その結果、実体4と実体5とが実行される(例えば、サブプロセス530)。実体4はイベントFを出力し、実体5はイベントを出力しない。したがって、コーディネータ400は、待ち行列410の先頭に、イベントFを挿入する(例えば、サブプロセス540)。
【0114】
(6)次に、待ち行列410の先頭から、イベントFを再現する(例えば、サブプロセス560)。つまり、イベントFはメッセージとして送信される。イベントFは、実体5を刺激する。その結果、実体5が実行されるが(例えば、サブプロセス530)、イベントは出力されない。したがって、待ち行列410への挿入は行われない。さらに、この実行後、待ち行列410は空(例えば、サブプロセス550で「Yes」)であり、記録200にイベントは残っていない(例えば、サブプロセス510で「No」である)。したがって、コーディネータ400は、記録200の再現を完了した(例えば、プロセス500が終了する)。
【0115】
開示された実施形態の上記説明は、当業者であれば誰でも本発明を製造または使用できるようにするために提供されたものである。これらの実施形態に対する様々な変更は、当業者には容易に明らかであり、本明細書に説明した一般原理は、本発明の精神または範囲から逸脱することなく他の実施形態に適用することが可能である。かくして、本明細書に提示した説明および図面は、本発明の現在好ましい実施形態を表し、それゆえ、本発明によって広く企図される主題の代表であることが理解されるであろう。さらに、本発明の範囲は当業者にとって明白となり得る他の実施形態を完全に包含するとともに、本発明の範囲は限定されないことが理解されよう。
【0116】
本明細書において、「A、B、またはCの少なくとも1つ」、「A、B、またはCの1つ以上」、「A、B、およびCの少なくとも1つ」、「A、B、およびCの1つ以上」、「A、B、C、またはそれらの任意の組み合わせ」等の組み合わせは、A、B、および/またはCの任意の組み合わせを含み、またAの倍数、Bの倍数、またはCの倍数のいずれを含んでもよい。具体的には、「A、B、またはCの少なくとも1つ」、「A、B、またはCの1つ以上」、「A、B、およびCの少なくとも1つ」、「A、B、およびCの1つ以上」、「A、B、C、またはそれらの任意の組み合わせ」等の組み合わせは、Aのみ、Bのみ、Cのみ、AかつB、AかつC、BかつC、またはAかつBかつCであってよく、かかる任意の組み合わせにはその構成要素A、B、および/またはCの1つ以上が含まれてよい。例えば、AとBとの組み合わせは、1つのAと複数のB、複数のAと1つのB、または複数のAと複数のBを含んでよい。
【要約】 (修正有)
【課題】ソフトウェア実体間のイベントの決定的な再現のためのシステム及び方法を提供する。
【解決手段】方法は、再現する次のイベントがあるか否かを決定し、再現する次のイベントがない場合510No、終了し、再現する次のイベントがある場合510Yes、次のイベントを再現し520、再現したイベントによって刺激されているすべてのソフトウェア実体を実行する530。ソフトウェア実体は、入力イベントを表すメッセージ内のデータを解析し、そのデータを処理して、1つまたは複数の出力イベントを生成する。方法はさらに、実行されたソフトウェア実体によって出力されたすべてのイベントを待ち行列に追加し540、待ち行列が空であるかどうか又は待ち行列に残っているイベントがあるかどうかを決定する550。少なくとも1つのイベントが待ち行列に残っている場合550No、待ち行列内の次のイベントを削除し、その次のイベントを再現する560。
【選択図】
図5