プロセス仮想化の流れ

ここでは Visual Studio で C++ プロジェクトをコンパイルする際に、Incredibuild がどのようにプロセスを仮想化しているかを順を追ってみていきます。

  • プロセスの全体像を把握しやすいように詳細は省略しています。

  • 下の例では C++ プロジェクトのコンパイルに Visual Studio を使用していますが、ほかのコンパイラでも基本的な流れは変わりません。

  1. Visual Studio (VS) のビルドでは、Incredibuild が VS コマンド (DevEnv や MSBuild など) を実行して、VS にソリューションのビルドをリクエストします。VS コマンドが実行されて Incredibuild から受け取ったソリューションのビルド準備が整うと、VS プロセスに DevEnv や MSBuild が注入されます。Incredibuild は VS プロセスの呼び出しと OS 間の中継役として、OS に対するすべての呼び出しを監視して処理方法を決定します。

  2. ビルド コマンドの一部としてコンパイル処理 (cl.exe) が実行されます。cl.exe を実行するために VS では「Create Process」コマンドが実行されます。Incredibuild はこの命令が OS に届く前にインターセプトします。Incredibuild は cl.exe をリモートマシンでの実行が事前に定義されたプロセスとして OS に達する前にインターセプトし、ダミー プロセスが作成されたことを VS に通知します。

  3. 次に Incredibuild は Coordinator に (シングルコア上の) Helper Agent を使って cl.exe を実行するようにリクエストします。

  4. 複数の Helper Agent が接続されている Coordinator はネットワークの最も強力な Helper (コア) を提供します。

  5. Coordinator が Initiator マシンと Helper Agent をつなぎます。

  6. これで Initiator と Helper が Coordinator なしで直接通信できるようになりました(Helper と Initiator 両方のマシンに Incredibuild Agent のインストールが必要です)。

  7. Initiator マシンから Helper マシンにコンパイラを転送します。

  8. Initiator Agent が Helper Agent に cl.exe の実行をリクエストします。

  9. Helper Agent が cl.exe を実行すると、Incredibuild の仮想化レイヤーをプロセスに再び注入し、cl.exe が OS に送信する呼び出しをすべて監視します。

  10. Helper マシンで処理が行われます。cl.exe は OS に様々な呼び出しやリクエストを送信しますが、ファイル システム関連のリクエストは (cl.exe が要求するファイルがリモートマシン上になく) OS が直接実行できないので、Incredibuild の仮想化システムに転送されます。例えば、cl.exe が送信した「Open File」リクエストはプロセス仮想化システムに届きます。プロセス仮想化システムには要求されたファイルがリモートマシンにはなく、プロセスを開始したマシンにあることが知らされます。

  11. Helper Agent が Initiator Agent にファイルをリクエストします。

  12. リクエストされたファイルが Initiator マシンのファイル システムから、リモート ディレクトリ内の Incredibuild キャッシュにコピーされます。

  13. プロセス仮想化システムが cl.exe に要求されたファイルのパスを含むパラメーターに出力先を切り替えます。

  14. プロセス仮想化システムは cl.exe がリクエストしたファイルのオリジナル パスではなく、キャッシュ内のファイルのパスを OS に伝えます。レジストリの呼び出し、DLL の読み込み、実行ファイルの実行など、ほかのファイル システムでも同じプロセスが行われます。仮想化環境ではプロセスの StdOut、StdErr、StdIn も同様に処理されます。

  15. Incredibuild のプロセス仮想化システムでは Initiator マシンに複数の Helper からコアを供給することでローカルマシンだけでは想像できない高速化を実現します。