実行の再現を目的とした決定論的仮想マシン(VM)を構築する際、開発者は根本的な課題に直面します。それは、いかにして時間を一貫して表現するかという点です。標準的な壁時計の時間は、リプレイには適していません。なぜなら、プログラムの2つの地点間で経過する時間は、ホストのCPU負荷、キャッシュの状態、その他の実行中のプロセスといった外部要因に依存するためです。もしゲストプログラムの意思決定が現時点の時間に依存している場合、ホストの壁時計を使用すると、実行のたびにプログラムの挙動が異なってしまい、決定論という核心的な要件を損なうことになります。

この問題を解決するために、Rewind VMはホストの時計ではなく、ゲストの命令ストリームを通じた進捗を測定するメカニズムを利用しています。単純な命令カウントを使用することも考えられますが、Rewindの著者はこれが信頼できないことを実証しています。単純なループを含むテストでは、ハードウェアカウンターが、ゲストプログラム自体からは見えないネットワークパケット、プロセッサ間割り込み(IPI)、ページフォールトなどの外部イベントを捉えてしまったため、命令カウントが変動しました。対照的に、条件分岐カウンターはゲストの内部ロジックに基づいてのみインクリメントされるため安定しており、「決定論的な時間」のより信頼できる代替指標となります。

Rewindの時計が、実行された命令よりも条件分岐を選択していることを示す「よそ見をする彼氏」のミーム。
Rewindの時計は、決定論を維持するために生の命令カウントよりも条件分岐を優先します。fzakaria.com

このミームは、生の命令カウントの代わりに条件分岐を時間の主要な指標として使用する選択を説明しています。

割り込みの可視性に対する命令カウントの限界を示す「Panik Kalm Panik」のミーム。
このミームは、割り込みなどの外部イベントを捉えてしまうため、命令カウントが信頼できない理由を強調しています。fzakaria.com

この視覚資料は、なぜ生の命令カウントが決定論的な時間の代替指標として機能しないのかという技術的な理由を説明しています。

Rewindには、この測定のための2つの主要なモードがあります。「エグジット時間」と「カウンター時間」です。エグジット時間は、ゲストがシステムコールを実行したときにのみ時計を進め、すべての内部計算を瞬時として扱います。これは単純ですが、すべての作業を同じ時間スライスに詰め込んでしまうため、タイムアウトや特定のレースコンディションに関連するバグの再現に失敗する可能性があります。一方、カウンター時間は、ゲストが条件分岐を完了するたびに1ナノ秒を進め、現実世界をより正確に近似します。カウンター時間は依然として実際のホストの壁時計とは異なります(例:ホストで14.2秒かかったタスクを11.7秒と測定するなど)、しかしその一貫性により、同じプログラムはあらゆるリプレイにおいて常に同じ結果を生成することが保証されます。

「もし時間が単に分岐を数えているだけだと言ったら?」というテキストが含まれた「マトリックスのモルフィアス」のミーム。
Rewindのカウンター時間の核心的なメカニズムを要約した概念的なミーム。fzakaria.com

この画像は、ゲストの内部ロジックを通じて進捗を測定するというRewind VMのアプローチの要約として機能します。