微处理器已存在相当长时间了。x86架构可追溯至1978年发布的8086,而SPARC架构则出现得稍晚,第一个SPARC处理器于1987年面世。在那段时间,性能提升多源自加快处理器时钟速度(最初的8086处理器时钟频率约为5 MHz,而最新处理器的时钟频率约是其600倍,超过3 GHz)和架构方面的改进(同时发出多个指令等)。然而,最近的处理器却增加了CPU芯片上的核心数量,而非强调单个线程在处理器上运行时的性能提升。处理器核心是执行应用程序指令的部分,因此有了多个核心,单个处理器就能同时执行多个应用程序。 变更为多核处理器的原因很容易理解:提高串行性能日益困难。为使处理器更快地执行指令,要使用大量硅片面积,会增加耗电,产生更多热量。此外,尽管通过这种方法也有可能获得极大的性能提升,但通常性能提升有限,在10%至20%之间。相比之下,如不采用增加硅片面积,而是用这一面积来新添一个核心,则产生的处理器可能完成两倍的工作量,而拥有4个核心的处理器则能完成4倍的工作量。因此,提升整体性能最有效的方法是增加该处理器能支持的线程数量。显然,如何利用多个核心与其说是硬件问题,不如说是软件问题,不过如本书稍后所示,这是一个经过深入研究的软件问题。 多核处理器有关的术语颇为令人费解。大多数人熟悉的微处理器都是有许多引脚的黑色薄片。多处理器系统中有多个微处理器插至系统板上。当一个处理器只能运行单个线程时,处理器、CPU、芯片和核心四者的数量关系相对简单,即在同一系统中它们的数量相等,因而这些术语可以互换使用。但随着多核处理器的出现,情况有所变化。事实上,在多核处理器背景下可能很难对这些术语的确切定义达成共识。 本书将使用术语处理器(processor)和芯片(chip)来指代这个有许多引脚的黑色薄片。但用插座(socket)来称呼它的情况也并不少见。细心的读者可能已经注意到,这些都是可数的实体,你可以取下计算机机箱的盖子,数一下插座或处理器的数量。 单个多核处理器将为用户和操作系统提供多个虚拟CPU。虚拟CPU在物理上不可数,你不能打开计算机机箱查看一下主板,然后说出此主板能支持多少个虚拟CPU。但是,对于调度工作的操作系统来说,虚拟CPU却是可见的实体。 同样,我们也很难确定系统包含多少核心。如果拆开微处理器查看硅片,也许能确定核心数量,尤其是相关文档说明了应该有多少核心时!识别核心并非有规可循的学问。同样,我们也无法查看一下核心就确定此核心能支持多少个软件线程。由于单个核心可以支持多线程,核心的概念是否重要就值得商榷了,因为它对应的既不是有形的可数实体,也不是操作系统用来分配工作的虚拟实体。但实际上,要了解系统的性能,内核的概念很重要,随着学习你会逐渐明确这一点。 还可能让人迷惑的是线程这一术语。线程可指代硬件线程或软件线程。软件线程是指处理器执行的指令流,而硬件线程是指执行某个软件线程的硬件资源。多核处理器有多个硬件线 程——这些都是虚拟CPU。其他资料可能称硬件线程为缕程(strand)。一个硬件线程能支持一个软件线程。 在某个系统上运行的软件线程通常比同时支持它们的硬件线程多得多,因此,这些线程中有许多处于不活动状态。当处于活动状态的软件线程比运行它们的硬件线程多时,操作系统将在活动的软件线程之间共享虚拟CPU。每个线程将运行很短的一段时间,然后操作系统将把它切换到做好运行准备的另一个线程。将线程转移到虚拟CPU或从虚拟CPU转移出来的行为称为上下文切换。