pos*_*n12 0 cpu clockspeed multi-core core threads
如果我的 CPU 的额定频率为 2GHz,并且有 4 个内核支持 8 个线程,那么所有 8 个线程都以额定时钟速度运行吗?或者它们每个都以 1GHz 的速度运行,因为线程数是内核数的两倍?
首先,内核没有“拥有”线程。线程是进程的属性。进程和线程是操作系统创建的东西,CPU 对它们没有直接的概念。声称其产品具有“四核八线程”的广告商使用了误导性术语。
您的内核有一个或两个逻辑处理器。就操作系统而言,逻辑处理器 (LP) 是可以运行线程的东西。如果您在固件设置中禁用了超线程,或者您的 CPU 不支持 HT,则每个内核有一个 LP。如果支持 HT,则每个内核有两个 LP。(未来的 x86/x64 处理器可能会在每个内核上实现两个以上的 LP。)
典型的 Windows 系统中的进程在任何给定时间可能有数百到数千个线程。您可以在任务管理器的“详细信息”选项卡(在 Windows 7 及更早版本中称为“进程”选项卡)中查看每个进程中的线程数 - 只需启用“线程”列。
大多数 Windows 系统中的绝大多数线程大部分时间都在“等待”某些事情:它们在等待 I/O 完成、它们在等待计时器到期、它们在等待页面错误得到解决。正在等待的线程 - Unix 和 Linux 使用术语“阻塞” - 不会尝试使用 CPU 时间,并且在它们等待的任何事情发生之前都不使用任何时间。
大多数不等待的线程要么是“正在运行”,这意味着它们实际上是在逻辑处理器上执行,要么是“就绪”,这意味着它们将运行,但此时所有 LP 都忙于其他线程。(除了 Ready、Running 和 Wait,这里还有一些其他状态不感兴趣。)
接下来的一切只涉及“正在运行”的线程。
如果您没有启用 HT,或者如果您启用了 HT 但非等待线程的数量不高于内核数量,那么性能应该与禁用 HT 相同。大多数现代操作系统,包括 Windows,尝试每个内核只使用一个 LP,直到运行线程多于 LP。(通常)将两个线程放入一个内核的 LP 而让两个 LP 在另一个内核中处于空闲状态是没有意义的。操作系统在这方面并不总是 100% 成功,但大多数时候它们都做得很好。
如果一个内核中的两个 LP 都在运行线程,那么这两个线程完成的“计算”工作的总和可能会更大一些……通常是 40% 到 60%……比如果您只有一个内核操作系统在两个线程之间进行时间切片。并且完成的总工作量几乎肯定会比每个线程单独在一个内核上运行时少一些。
请注意,正在运行的线程(就操作系统而言)可能会在其 LP 中停滞。这种情况的一个常见情况是线程访问了尚未位于 CPU L1 缓存中的 RAM。将所需的数据从外层缓存,或从 RAM 带入 L1 缓存需要时间。在此期间,线程可能在其指令流中没有任何进展,但 Windows 不知道这一点。CPU 固件可能会利用这段时间在内核中的其他 LP 中做一些工作。或者它可能会为等待 RAM 内容的线程执行一些乱序工作。操作系统完全不知道这些事情,只是将线程报告为“正在运行”,并继续累积其“已使用的 CPU 时间”,即使它在“停顿”期间可能没有取得任何进展。
所以...我们可以通过超线程一次运行两个线程,一个内核中的每个 LP 上运行一个线程。但这并不意味着每个内核现在都有两个内核的计算资源(“执行单元”),也不意味着时钟速度在两个 LP 之间分配。
超线程利用了这样一个事实,即大多数线程不会一直充分利用内核的所有执行单元。事实上,这种情况非常罕见……这就是为什么 HT 可以做得和它一样好的原因。HT 允许第二个线程与第一个线程同时存在于处理器中,理想情况下,第二个线程可以使用第一个线程不使用的执行单元。这是在 CPU 的微码中实现的。
事实上,CPU 固件中“第一”和“第二”线程之间确实没有区别;它不会选择给予一个比另一个更多的关注。固件只是试图让尽可能多的 CPU 执行单元保持忙碌,尽可能多地完成工作。超线程只是给它两个指令流同时工作,从而更多地使用更多的 CPU 执行单元。
CPU 固件甚至根本不知道操作系统将什么视为线程,也根本不知道“线程上下文切换”。它只知道它有两个不同的指令流要处理,每个指令流都有自己的一组指令指针、堆栈指针和许多其他架构寄存器的值。有时,由于固件未知的原因,操作系统会出现并更改所有这些内容(线程上下文切换)。
HT 没有做的另一件事是实现操作系统线程优先级概念的任何部分。因此,如果您在单个 HT 内核的 LP 中有两个线程,并且操作系统认为这些线程具有不同的优先级,则 CPU 中的 HT 固件不会知道这一点。特别是,它不会优先将执行单元分配给更高优先级的线程。操作系统确实使用线程优先级来决定选择哪些线程在哪些 CPU 上运行。
有关超线程如何工作的更多信息,请参阅Ars Technica 上的这篇文章。不幸的是,插图没有出现,因为他们重新托管了他们的网站 - 也许给他们的电子邮件可以解决这个问题。有关 Windows 如何“调度”线程的更多信息,请参阅Solomon、Russinovich等人撰写的Windows Internals的“调度”一章。
| 归档时间: |
|
| 查看次数: |
2576 次 |
| 最近记录: |