线程是系统分配处理器时间资源的基本单元,是进程之内独立执行的一个单元或一条执行路径。线程包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等。一个进程内的所有线程使用同一个地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行线程。调度程序可将多个线程放到不同的处理器上去运行,这样可使处理器任务平衡,提高系统的运行效率。
多线程处理器对线程的调度与传统意义上由操作系统负责的线程调度是有区别的,它完全由处理器硬件负责线程间的切换。由于不同线程的指令间不存在相关性,因此可以保证每个时钟周期都有指令可以发射,即使某条指令有很长的访存延迟,多个线程的切换运行也可以有效地隐藏延迟。但是,在采用多线程技术的超标量处理器中,同一时钟周期内执行的还是同一线程的指令,仍然存在相关性,因此仍然有一些发射槽被浪费。那么还有没有更好的处理器结构吗?当然有!那就是SMT(Simultaneous Multi-Threading,并发式多线程)技术。
多线程技术的出现,为减少预测失败提供了一条新的途径。它将分支的两个转移方向映射到不同的线程中,同时执行,等转移地址确定后,从两个线程中选取正确的一个继续执行,错误的线程将被中止。虽然这种废止错误的线程会损失一些效率,但由于存在多个并发运行的线程,因此不会出现所有指令都被作废的恶性情况发生。虽然单独使用这一技术来处理转移指令效率并不高,但是将这一方法与传统的转移预测技术相结合,则会进一步减少控制相关所产生的危害。
多线程处理器的实现方式主要有两种:一是在超标量处理器的基础上,对并发式多线程的取指令、现场保留、指令退出(retire)提供相应的硬件支持,而不同线程仍然共享其他的处理器资源,如取指缓冲、不同寄存器组中用做重命名寄存器的物理寄存器、指令窗口和reorder缓冲。硬件设计人员可以将主要精力集中在构建一个快速的单线程超标量处理器上,然后在此基础上增加多线程处理能力。这一方式的好处在于附加硬件少,开发周期短;二是每条线程都有各自独立的指令窗口、译码部件、寄存器文件和退出部件,发射部件可以同时发射不同指令窗口中的指令到各个功能部件。这一结构形式更多地改变了超标量处理机的结构,很自然地分离了指令窗口,并简化了流水线的发射和退出段。
长期以来,任务、进程、线程的处理机制,大多数都是通过操作系统等软件来实现的。多任务、多进程早已在普通操作系统上得以实现,如Windows 9x等系统就可以让不同的多个应用(任务)同时使用一个处理器。多线程也已在服务器操作系统上实现,如Windows NT 4.0就可让同一应用占用不同的处理器。值得注意的是,多处理器系统可以通过多处理器来提高服务器系统的处理性能,然而协同多处理器同时工作的网络操作系统的多线程机制,无法充分发挥所有处理器的效能。为此,超线程技术产生了,超线程技术将多线程技术在软件上不能解决的问题从硬件上解决了。所谓超线程技术,其核心仍然是多线程技术,所不同的只是,它是由Intel公司专门用来解决在NetBurst微架构中充分利用20级超长流水线资源的问题而设计的。
NetBurst微架构支持的20级超长流水线可以显著地提高处理器的主频率。然而,在运算过程中,过长的流水线对于传统应用,却无法充分利用处理器的全部性能,仍然产生资源浪费。
为了大大减少在20级超长流水线中占用同样时钟周期的空闲流水线,超线程技术为每个物理处理器设置了两个入口,从而使操作系统等软件看来是两颗(逻辑)处理器。其中,被称为AS(Architecture State,架构状态)的入口,是由控制寄存器等相对简单的电路组成,在处理器核心面积增加不大的情况下,可以分享物理处理器的执行资源——轮流使用指令预取、译码、寄存器重命名和出口部分,以及分时复用流水线和各级缓存等。显然,这种通过在单一处理器内部设置的两个AS,共享一个I/O端口并分时复用流水线,将流水线空闲时间降到了最低点,有效地提高了处理器的整体处理能力。
显然,不管是多线程技术,还是超线程技术,都是多处理器技术的极大延伸,将这些技术应用于多处理器系统中,将会成倍提高服务器系统的性能,因为物理上多处理器应用加上逻辑上的多线程或超线程技术支持,操作系统和应用软件所感受到的则是物理处理器数量的倍数,不仅可以提高系统的运行速度和性能,还能节省用户的成本投入。所以,在多处理器系统中,多线程技术和超线程技术,有着良好的发展空间和巨大的市场潜力。