进程虚拟化流程
本节详细描述了在 VisualStudio 执行 C++ 项目编译时,如何将 Incredibuild 架构用于进程虚拟化。
-
这是一个简单、通俗的解释。它忽略了进程中的很多细节。
-
在此分步说明中,Visual Studio 用于执行 C++ 项目的必要编译。但是,这些步骤与您决定使用的任何其他 compiler 的步骤基本相同。
-
在 Visual Studio 构建中,Incredibuild 执行 VS 命令(比如 DevEnv 或 MSBuild 命令),并要求 VS 构建一个解决方案。当 VS 命令运行且 VS 进程准备好构建 Incredibuild 传递给它的解决方案时,Incredibuild 会将 DevEnv 或 MSBuild 注入到 VS 进程中,并充当 VS 进程发出的调用与操作系统之间的中介器。它会监控对操作系统的所有调用并决定如何处理。
-
作为构建命令的一部分,构建运行编译进程 (cl.exe)。当 VS 运行 cl.exe 进程(编译进程)时,VS 运行 Create Process 命令,该命令在到达操作系统之前被 Incredibuild 拦截。Incredibuild 将 cl.exe 检测为在远端机器上运行的预定义进程,并且不允许此进程到达操作系统;相反,它告诉 VS 已经创建了一个虚拟进程。
-
Incredibuild 不是让 cl.exe 进程在操作系统上运行,而是向 Coordinator 组件请求一个可以运行编译进程的 Helper Agent(在单核上)。
-
Coordinator 连接了许多 Helper Agent,它带来了一个可用的且是目前网络中最强大的 Helper(内核)。
-
Coordinator 将 Helper Agent 连接至启动机器。
-
启动机器和 Helper 机器相互间直接通信,而无需 Coordinator 的帮助。应注意的是,Incredibuild Agent 同时安装在 Helper 机器和启动机器上。
-
compiler 从启动机器传输到 Helper 机器。
-
启动机器上的 Incredibuild Agent 向 Helper 机器上的 Incredibuild Agent 发送运行 cl.exe 的请求。
-
当 Helper 机器上的 Incredibuild Agent 运行 cl.exe 时,Incredibuild Virtualization 层再次注入到用以监控 cl.exe 发送到操作系统的所有调用的进程。
-
Helper 机器上正在进行处理。cl.exe 发送很多调用并向操作系统功发送请求。但是,每个文件系统相关请求都会发送至 Incredibuild Virtualization,因为它无法由操作系统直接执行,这是因为 cl.exe 所请求的文件不在远端机器上。例如,当 cl.exe 发送一个 Open File 请求时,该请求转至 Incredibuild Virtualization,它知道需要打开的文件不在远端机器上,而是在发起此进程执行的启动机器上。
-
Helper 机器上的 Incredibuild Agent 向启动机器上的 Incredibuild Agent 请求带来文件。
-
所请求的文件从启动机器的文件系统复制到专用远程目录的 Incredibuild 缓存中。
-
Incredibuild Virtualization 将重定向到包含cl.exe请求打开的文件路径的参数。
-
IncredBuild Virtualization 为操作系统提供缓存中的文件路径,而不是 cl.exe 请求打开的文件的原始路径地址。相同的虚拟化技术也应用于其他文件系统事件,比如 Registry 调用、DLL 加载和可执行文件的运行。虚拟化环境以类似的方式处理进程的 StdOut、StdErr 和 StdIn。
-
Incredibuild Virtualization 利用很多 Helpers 来显著加快进程并为启动机器提供数百个内核,以供其加速自己的进程,而不是仅仅使用其本地机器上的内核。