进程虚拟化流程

本节详细描述了在 VisualStudio 执行 C++ 项目编译时,如何将 Incredibuild 架构用于进程虚拟化。

  • 这是一个简单、通俗的解释。它忽略了进程中的很多细节。

  • 在此分步说明中,Visual Studio 用于执行 C++ 项目的必要编译。但是,这些步骤与您决定使用的任何其他 compiler 的步骤基本相同。

  1. 在 Visual Studio 构建中,Incredibuild 执行 VS 命令(比如 DevEnv 或 MSBuild 命令),并要求 VS 构建一个解决方案。当 VS 命令运行且 VS 进程准备好构建 Incredibuild 传递给它的解决方案时,Incredibuild 会将 DevEnv 或 MSBuild 注入到 VS 进程中,并充当 VS 进程发出的调用与操作系统之间的中介器。它会监控对操作系统的所有调用并决定如何处理。

  2. 作为构建命令的一部分,构建运行编译进程 (cl.exe)。当 VS 运行 cl.exe 进程(编译进程)时,VS 运行 Create Process 命令,该命令在到达操作系统之前被 Incredibuild 拦截。Incredibuild 将 cl.exe 检测为在远端机器上运行的预定义进程,并且不允许此进程到达操作系统;相反,它告诉 VS 已经创建了一个虚拟进程。

  3. Incredibuild 不是让 cl.exe 进程在操作系统上运行,而是向 Coordinator 组件请求一个可以运行编译进程的 Helper Agent(在单核上)。

  4. Coordinator 连接了许多 Helper Agent,它带来了一个可用的且是目前网络中最强大的 Helper(内核)。

  5. Coordinator 将 Helper Agent 连接至启动机器。

  6. 启动机器和 Helper 机器相互间直接通信,而无需 Coordinator 的帮助。应注意的是,Incredibuild Agent 同时安装在 Helper 机器和启动机器上。

  7. compiler 从启动机器传输到 Helper 机器。

  8. 启动机器上的 Incredibuild Agent 向 Helper 机器上的 Incredibuild Agent 发送运行 cl.exe 的请求。

  9. 当 Helper 机器上的 Incredibuild Agent 运行 cl.exe 时,Incredibuild Virtualization 层再次注入到用以监控 cl.exe 发送到操作系统的所有调用的进程。

  10. Helper 机器上正在进行处理。cl.exe 发送很多调用并向操作系统功发送请求。但是,每个文件系统相关请求都会发送至 Incredibuild Virtualization,因为它无法由操作系统直接执行,这是因为 cl.exe 所请求的文件不在远端机器上。例如,当 cl.exe 发送一个 Open File 请求时,该请求转至 Incredibuild Virtualization,它知道需要打开的文件不在远端机器上,而是在发起此进程执行的启动机器上。

  11. Helper 机器上的 Incredibuild Agent 向启动机器上的 Incredibuild Agent 请求带来文件。

  12. 所请求的文件从启动机器的文件系统复制到专用远程目录的 Incredibuild 缓存中。

  13. Incredibuild Virtualization 将重定向到包含cl.exe请求打开的文件路径的参数。

  14. IncredBuild Virtualization 为操作系统提供缓存中的文件路径,而不是 cl.exe 请求打开的文件的原始路径地址。相同的虚拟化技术也应用于其他文件系统事件,比如 Registry 调用、DLL 加载和可执行文件的运行。虚拟化环境以类似的方式处理进程的 StdOut、StdErr 和 StdIn。

  15. Incredibuild Virtualization 利用很多 Helpers 来显著加快进程并为启动机器提供数百个内核,以供其加速自己的进程,而不是仅仅使用其本地机器上的内核。