Linux 虚拟CPU如何映射到物理内核?

Linux 虚拟CPU如何映射到物理内核?,linux,multithreading,virtualbox,vmware,virtualization,Linux,Multithreading,Virtualbox,Vmware,Virtualization,我正在用Java编写一个计算密集型多线程程序,该程序将在虚拟化环境中运行,我不知道来宾操作系统上的CPU设置数量将如何影响程序的性能 本质上,问题是来宾操作系统CPU如何映射到主机CPU核心?假设我将来宾操作系统上的CPU计数设置为1,即使我在四核机器上运行,这到底意味着什么?我可以推测至少有两种情况发生: 我的单个虚拟内核绑定到一个特定的物理内核,因此来宾基本上是在单个内核上运行的 虚拟CPU没有硬绑定/分配到物理核心。因此,每当来宾操作系统上的任何进程需要启动一个新线程时,它都可以被分派到任

我正在用Java编写一个计算密集型多线程程序,该程序将在虚拟化环境中运行,我不知道来宾操作系统上的CPU设置数量将如何影响程序的性能

本质上,问题是来宾操作系统CPU如何映射到主机CPU核心?假设我将来宾操作系统上的CPU计数设置为1,即使我在四核机器上运行,这到底意味着什么?我可以推测至少有两种情况发生:

我的单个虚拟内核绑定到一个特定的物理内核,因此来宾基本上是在单个内核上运行的

虚拟CPU没有硬绑定/分配到物理核心。因此,每当来宾操作系统上的任何进程需要启动一个新线程时,它都可以被分派到任何物理核心执行:四个线程中的任何一个,如我的示例所示

后一种情况意味着来宾操作系统运行在多核环境中,即使它认为它只有一个核。我的意思是像cat/proc/cpuinfo这样的命令只报告一个内核


我问的是一般性的问题,但如果VirtualBox和VMWare在这方面存在特殊的差异,并且您碰巧了解它们,我将非常感谢您的分享

> P>我可能是错的,但我认为虚拟CPU对应于虚拟机在任何给定时间可以在主机上运行的最大线程数。

实际上,在大多数情况下,只要使用硬件而不是类似的东西,就会发生在什么地方。

就主机操作系统而言,虚拟机每个虚拟核心只有一个CPU线程。可能还有其他用于I/O等的线程,但这些线程独立于虚拟核心计数,是仿真器的一部分,对来宾操作系统完全不可见

最终的结果是,在单个核心VM上,所有来宾线程在每个特定时刻都将在同一CPU上运行—来宾线程在容器线程中批处理在一起,并且对主机操作系统不单独可见

也就是说,除非您将emulator线程的类型设置为一个或多个特定的物理CPU内核,否则主机OS调度程序可能会每隔几秒钟将线程定期迁移到不同的内核,就像任何其他进程一样