传统上,SMP系统通过提供多个物理处理器,允许多个线程并发地运行。然而,最近在计算机硬件方面的一项实践是将多个处理器内核放置在同一个物理芯片上,从而产生多核处理器。每个核心都维护其架构状态,因此,在操作系统看起来,它们就是一个个独立的物理处理器。使用多核处理器的SMP系统比每个处理器拥有自己的物理芯片的系统更快,消耗更少的电力。

多核处理器可能会使调度问题复杂化。让我们考虑一下这是如何发生的。研究人员发现,当处理器访问内存时,它花费大量的时间来等待数据变得可用。这种情况,称为内存延迟( memory stall),可能由于各种原因而发生,例如缓存缺失(访问不在缓存内存中的数据)。图6.10描述了内存延迟( memory stall)。在这种情况下,处理器可以花费高达50%的时间等待内存中的数据变得可用。为改善这状况,许多最近的硬件设计都实现了多线程处理器内核,其中两个(或多个)硬件线程被分配给一个处理器核心上。这样,如果一个线程在等待内存时停止,内核可以切换到另一个线程。图6.11演示了一个双线程处理器内核,其中thread0的执行和thread1的执行都是交叉的。从操作系统的角度来看,每个硬件线程都显示为一个逻辑处理器( logical processors),可以运行一个软件线程。因此,在双线程、双核心系统中,就会有四个逻辑处理器被呈现给操作系统。 Ultra SPARC T3 CPU的每个芯片上有16个内核,每个核心有8个硬件线程。从操作系统的角度来看,似乎有128个逻辑处理器( logical processors)。

图6.10 内存延迟

图6.11多线程多核系统。

一般来说,有两种方法来多线程处理核心:

  • 粗粒度的多线程。对于粗粒度的多线程,线程在处理器上执行,直到出现一个长延迟事件,如内存延迟。由于延迟是由长延迟事件导致的,处理器必须切换到另一个线程以开始执行。但是,在线程之间切换的成本很高,因为在另一个线程可以在处理器核心上开始执行之前,指令管道必须被刷新。一旦这个新线程开始执行,它就开始用它的指令填充这个管道。
  • 细粒度的多线程。细粒度的(或交错的)多线程在线程之间以更细的粒度级别切换------通常在指令周期的边界上。然而,细粒度系统的架构设计包括了线程切换的逻辑。因此,在线程之间切换的成本很小。

注意,一个多线程多核处理器实际上需要两个不同级别的调度。

  1. 在一个级别上,由操作系统作出调度决策,因为它选择在每硬件线程(即逻辑处理器)上运行那个软件线程。对于这种级别的调度,操作系统可以选择任何调度算法,如第6.3节所述。
  2. 第二个级别的调度指定了每个内核如何决定要运行哪个硬件线程。在这种情况下有几种策略可以采用。前面提到的Ultra SPARC T3使用一个简单的Round-Robin(轮询算法)将八个硬件线程调度到每个CPU核心上。另一个例子是Intel Itanium,它是一个双核处理器,每个内核有两个管理的硬件线程。分配给每个硬件线程是一个动态的urgency(紧急)值,从0到7,0代表最低的紧急情况,7表示是最高紧急的。Itanium会识别5个可能触发线程切换的事件。当其中一个事件发生时,线程切换逻辑会比较两个线程的紧急值,并选择具有最高紧急值的线程在处理器核心上执行。

results matching ""

    No results matching ""