在virtualbox中,分配多个虚拟核心时会发生什么?

在virtualbox中,分配多个虚拟核心时会发生什么?,virtualbox,Virtualbox,如果我使用Oracle的virtualbox,并且我为虚拟机分配了多个虚拟核心,那么实际的核心是如何分配的?它是在虚拟机中同时使用真实内核还是使用模拟内核的东西?您的问题几乎就像在问:操作系统如何确定在哪个内核上运行给定的进程/线程?你的计算机一直在做这种决定——它运行的进程/线程远远多于可用的内核。这个具体的答案本质上是相似的,但也取决于来宾计算机的配置方式,以及您的硬件可以提供哪些支持来加速虚拟化过程-因此,这个答案肯定不是确定的,我不会真正涉及主机如何安排代码的执行,但让我们来研究两个相对

如果我使用Oracle的virtualbox,并且我为虚拟机分配了多个虚拟核心,那么实际的核心是如何分配的?它是在虚拟机中同时使用真实内核还是使用模拟内核的东西?

您的问题几乎就像在问:操作系统如何确定在哪个内核上运行给定的进程/线程?你的计算机一直在做这种决定——它运行的进程/线程远远多于可用的内核。这个具体的答案本质上是相似的,但也取决于来宾计算机的配置方式,以及您的硬件可以提供哪些支持来加速虚拟化过程-因此,这个答案肯定不是确定的,我不会真正涉及主机如何安排代码的执行,但让我们来研究两个相对简单的案例:

第一种是完全虚拟化的机器-这是一种没有启用或启用最小加速的机器。提供给来宾的硬件是完全虚拟化的,即使许多CPU指令只是简单地传递并直接在CPU上执行。在这种情况下,来宾VM的行为或多或少类似于主机上运行的任何进程:CPU资源由操作系统调度(显然,在这种情况下是主机),进程/线程可以在允许它们运行的任何内核上运行。默认值通常是任何可用的内核,尽管可能会出现一些优化,以尝试在同一个内核上保持进程,从而使L1/L2缓存更有效,并最小化上下文切换。通常,在这些情况下,您将只为来宾操作系统分配一个CPU,这将大致转化为主机上运行的单个进程

在稍微复杂一点的场景中,虚拟机配置了所有可用的CPU虚拟化加速选项。在英特尔语言中,这些被称为VT-x for AMD,它是AMD-V。这些主要支持特权指令,通常需要一些二进制翻译/捕获来保护主机和来宾。因此,主机操作系统会失去一点可见性。包括硬件加速的MMU支持(这样就可以直接访问内存页表,而无需虚拟化软件的跟踪),并且可视性会进一步下降。最终,尽管它的行为基本上仍与第一个示例相同:它是一个在主机上运行的进程,并相应地进行了调度——只是您可以想到为每个虚拟CPU分配了一个线程来运行指令(或传递指令)

值得注意的是,虽然您可以(在适当的硬件支持下)为来宾分配比您现有的更多的虚拟内核,但这不是一个好主意。通常,这会导致性能下降,因为客户机可能会对CPU造成重击,并且无法正确地调度所请求的资源,即使CPU没有被完全占用。我将此作为一个场景提出,它与多线程程序有某些相似之处,多线程程序产生的线程(实际上很忙)远远多于可用于运行它们的空闲CPU核。您的性能通常会比使用较少的线程来完成工作时更差

在极端情况下,VirtualBox甚至支持资源——尽管只有少数操作系统正确支持它:Windows 2008数据中心版和某些Linux内核。同样的规则通常适用于将一个客户CPU核心视为主机逻辑核心上的进程/线程的情况,但是实际上,由主机和硬件本身决定哪个逻辑核心将用于虚拟核心


话虽如此,你的问题是VirtualBox实际上是如何分配这些资源的。。。好吧,我还没有深入研究代码,所以我当然不能肯定地回答,但根据我的经验,它通常按照描述的方式运行。如果您真的很好奇,可以尝试在Task Manager中标记VirtualBox VBoxSvc.exe和相关进程,并选择“Set Affinity”(设置关联性)选项,将它们的执行限制在单个CPU上,然后查看这些设置是否得到遵守。这可能取决于如果主持人尊重这些设置,您可以使用的硬件协助级别,因为客人可能并没有真正作为这些设置的一部分运行。

您的问题很有趣。我在AMD x86_64处理器上使用VBox 4.0.4,我为VM实例激活了两个虚拟核(Linux Red hat 64位),但根据文档“VirtualBox最多可以为每个虚拟机提供32个虚拟CPU”中的说明,只有一个虚拟核被激活。我来回答这个问题。