虚拟核心(超线程)的两个线程可以运行不同的操作系统进程吗?

Posted

技术标签:

【中文标题】虚拟核心(超线程)的两个线程可以运行不同的操作系统进程吗?【英文标题】:Can the two threads of a virtual core (hyperthreading) be running different OS processes? 【发布时间】:2017-06-11 02:04:45 【问题描述】:

我从另一个答案 (Performance difference for multi-thread and multi-process) 中找到以下引用:

接下来,您可以拥有“超线程”的 CPU,它可以运行(在 至少)一个核心上的两个线程非常快速 - 但不是进程(因为 “超线程”线程不能使用不同的地址空间) -- 又一个线程可以在性能方面取胜的例子。

这是准确的吗?一个虚拟核心(超线程)的两个线程不能运行不同的操作系统进程?

在超线程机器上,如果我的程序架构使用“主管”进程使用套接字与之通信的“工作”进程,那么通过将这些工作进程移动到主管进程中,我可能会看到性能提升:线程(保持套接字和其他所有内容相同)?

【问题讨论】:

【参考方案1】:

问题的第一部分可以快速回答,如果相同,您可以在系统上进行测试。

在我的带有英特尔 CPU 的旧 Windows 系统上,我可以通过任务管理器将不同程序(或进程)的关联设置到内核的 2 个 HT 中的每一个上,看看它们实际上都会在那里运行。

关于工人和主管的第二个问题,通过让他们处于同一进程中,您可以获得小的性能提升(至少在 Linux 上)。这是因为当您进行任务切换时,您还需要设置页表(intel CR3-register),并且在任务切换期间代码看起来像这样:

if (newProcess != oldProcess)
  CR3 = new page table

设置 CR3 有效地使 TLB 无效,因为页表不同。结果是 CPU 必须执行页表遍历才能找到正确的翻译。在 64 位 cpu 上,页面遍历通常需要 5 次内存遍历,成本从 5*TLB 2 访问(每个 ~3 个周期)到 5 * 内存访问(每个 ~300 个周期)不等。

【讨论】:

以上是关于虚拟核心(超线程)的两个线程可以运行不同的操作系统进程吗?的主要内容,如果未能解决你的问题,请参考以下文章

CPU的核进程和线程

CPU的核心数、线程数的关系和区别

CPU的核心数、线程数的关系和区别

使用逻辑线程运行程序

CPU的“核心数”、“线程数”的关系和区别分别是啥?

perl线程和模块