天天看点

Windows是如何利用超线程特性的

这个问题,取决于你所问的Windows是哪个版本?每个版本的Windows都不太一样。

请容我慢慢道来。

对于Windows 95,Windows 98和Windows ME,答案很简单:压根不会用到超线程。因为这些操作系统不是多处理器操作系统。

对于Windows NT和Windows 2000来说,答案是:连操作系统自己都不知道有超线程这回事儿。为什么?这两个操作系统是在超线程发明之前编写的。如果你启用了处理器的超线程,则一块物理CPU在操作系统看来是两块独立的逻辑CPU。(也因此你需要为这两块CPU核心付授权费)

因为调度器(Scheduler)不会在多个虚拟CPU之间实现连接,所以,和一开始就不启用超线程相比,启用超线程之后的运行性能可能会更糟。

考虑一台搭载有双超线程处理器的机器。这台机器上有两块物理处理器A和B,每块物理CPU会扩展出两块虚拟CPU,让我们将它们命名为A1, A2, B1和B2吧。

假设你有两项CPU密集的计算任务。对于Windows NT和Windows 2000调度程序而言,所有四个处理器都是等效的,操作系统会选择其中两块CPU进行计算。如果你不那么走运,它会选择A1和A2,从而导致一块物理CPU同时运行两项计算密集型的任务 (每个都可能以半速和四分之三速之间的速度运行),而另外一块物理处理器B则会空闲等待调度。操作系统压根就不知道可以将这两项任务分别调度到两块不同的物理处理器上,从而提升性能。

Windows XP和Windows Server 2003操作系统进行了改良,它们都可以正确面对这种超线程特性。

当出现上述情况时,调度器会知道当前处理器的虚拟化配置,并智能地将两项计算任务分发到不同的物理处理器上。

请注意,即使使用支持超线程的处理器,也可能发生缓存未命中的问题。

例如,如果你有四个任务,其中两个严重依赖L2缓存,而其中两个不依赖,你最好将每个L2密集型任务放在单独的处理器上,因为L2缓存是由两个虚拟处理器共享的。将它们放在同一个处理器上会导致大量L2缓存未命中,因为这两个任务会争夺L2缓存插槽。

当你使用数据中心服务器或者企业服务器版本的Windows时,事情又变得棘手了。

这个时候,就不是三言两语能讲明白的了。我建议你瞄一瞄这篇白皮书,以了解其中的玄机。

总结

虚拟化其实一直都在进行,比如,现在比较火热的”元宇宙”。

这让我想起了这东西:缸中之脑。

最后

最近我写了个东西

继续阅读