基本概念
对称多处理器(Symmetric Multi-Processing)又叫SMP,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。它是相对非对称多处理技术而言的、应用十分广泛的并行技术。
在这种技术的支持下,一个服务器系统可以同时运行多个处理器,并共享内存和其他的主机资源。像双至强,也就是我们所说的二路,这是在对称处理器系统中最常见的一种(至强MP可以支持到四路,AMD Opteron可以支持1-8路)。也有少数是16路的。但是一般来讲,SMP结构的机器可扩展性较差,很难做到100个以上多处理器,常规的一般是8个到16个,不过这对于多数的用户来说已经够用了。在高性能服务器和工作站级主板架构中最为常见,像UNIX服务器可支持最多256个CPU的系统。
SMP系统的组建要组建SMP系统,首先最关键的一点就是需要合适的CPU相配合。我们平时看到的CPU都是单个使用,所以看不出来它们有什么区别,但是,实际上,支持SMP功能并不是没有条件的,随意拿几块CPU来就可以建立多处理系统那简直是天方夜谈。要实现SMP功能,我们使用的CPU必须具备以下要求:
(1)CPU内部必须内置APIC(Advanced Programmable Interrupt Controllers)单元。Intel 多处理规范的核心就是高级可编程中断控制器(Advanced Programmable Interrupt Controllers--APICs)的使用。CPU通过彼此发送中断来完成它们之间的通信。通过给中断附加动作(actions),不同的CPU可以在某种程度上彼此进行控制。每个CPU有自己的APIC(成为那个CPU的本地APIC),并且还有一个I/O APIC来处理由I/O设备引起的中断,这个I/O APIC是安装在主板上的,但每个CPU上的APIC则不可或缺,否则将无法处理多CPU之间的中断协调。
(2)相同的产品型号,同样类型的CPU核心。例如,虽然Athlon和Pentium III各自都内置有APIC单元,想要让它们一起建立SMP系统是不可能的,当然,即使是Celeron和Pentium III,那样的可能性也为0,甚至Coppermine核心的Pentium III和Tualatin的Pentium III也不能建立SMP系统--这是因为他们的运行指令不完全相同,APIC中断协调差异也很大。
(3)完全相同的运行频率。如果要建立双Pentium III系统,必须两颗866MHz或者两颗1000MHz处理器,不可以用一颗866MHz,另一颗1000MHz来组建,否则系统将无法正常点亮。
(4)尽可能保持相同的产品序列编号。即使是同样核心的相同频率处理器,由于生产批次不同也会造成不可思议的问题。两个生产批次的CPU作为双处理器运行的时候,有可能会发生一颗CPU负担过高,而另一颗负担很少的情况,无法发挥最大性能,更糟糕的是可能导致死机,因此,应该尽可能选择同一批生产的处理器来组建SMP系统。
SMP的优缺点优势SMP有几个优点:
(1)它们是增加吞吐量的一种划算的方法。
(2)由于操作系统由所有处理器共享,它们提供了一个单独的系统映象(易于管理)。
(3)它们对一个单独的问题应用多处理器(并行编程)。
(4)负载平衡是由操作系统实现的。
(5)这种单处理器(UP)编程模型可用于一个SMP中。
(6)对于共享数据来说,它们是可伸缩的。
(7)所有数据可由所有处理器寻址,并且由硬件监视逻辑保持连续性。
(8)由于通信经由全局共享内存执行,在处理器之间通信不必使用消息传送库。
(9)更多能量的需求可通过向系统添加更多处理器来解决。然而,在一个SMP系统里添加更多处理器时,您必须设置关于性能增强的现实期望值。
(10)现在越来越多的应用程序和工具都可以使用。大多数UP应用程序可以在SMP体系结构中运行或者被移植到SMP体系结构中。
局限性SMP 系统有一些局限性,如下所述:
(1)由于高速缓存相关性、锁定机制、共享对象和其它问题,可伸缩性受到限制。
(2)需要新技术来利用多处理器,例如线程编程和设备驱动程序编程。
多处理的类型有几种多处理(MP)系统,如下所述:
非共享MP(纯群集)每个处理器都是一个完全独立的机器,运行操作系统的一个副本。处理器之间没有共享的部分(每一个都有自己的内存,高速缓存和磁盘),但是它们是互联的。通过LAN连接时,处理器之间是松散耦合的。而通过转换器连接时,处理器之间是紧密耦合的。处理器之间的通信是通过消息传送来实现的。
这样一个系统的优点是它具有很好的可伸缩性和高可用性。而缺点则是该系统是一个不为人熟悉的编程模型(消息传送)。
共享磁盘MP处理器拥有自身的内存和高速缓存。处理器并行运行并共享磁盘。每个处理器都运行操作系统的一份副本,并且处理器之间是松散耦合的(通过LAN连接)。处理器之间的通信是通过信息传送实现的。
共享磁盘的优点是保留了熟悉的编程模型的一部分(磁盘数据是可寻址和连续的,而内存则不是),而且与共享内存的系统相比,这种系统更容易实现高可用性。缺点是由于在对共享数据进行物理和逻辑访问时存在瓶颈,它的可伸缩性受到限制。
共享内存群集(SMC)一个共享内存群集中的所有处理器有自己的资源(主存储器、磁盘和I/0),并且每个处理器运行一份操作系统的副本。处理器之间是紧密耦合的(通过一个转换器连接)。处理器之间的通信是通过共享内存实现的。
共享内存MP所有处理器通过一条高速总线或者一个转换器在同一机器中紧密耦合。处理器共享同样的全局内存、磁盘和I/0设备。只有一份操作系统的副本跨所有处理器运行,并且操作系统必须设计为能利用这种体系结构(多线程操作系统)。
对称多处理器和非对称多处理器多处理器系统的工作方式分为非对称多处理(asym-metrical mulit-processing)和对称多处理(symmetrical mulit-processing,SMP)两种。
非对称多处理器是将若干个处理器挂接到总线上,在各处理器之间形成简单的主从设备关系。非对称处理器不允许所有处理器访问所有系统资源,使系统性能受到限制。
在对称多处理器系统中,所有处理器的地位都是相同的,所有的资源,特别是存储器、中断及I/O空间,都具有相同的可访问性,消除了结构上的障碍。目前,由多个RISC微处理器构成的共享存储器的多处理器并行处理系统,不但显著改善了系统的计算能力和效率,而且具有性能价格比高、通用性和伸缩性强等特点,因此正在成为多机并行系统的主流产品1。
SMP并行化应用程序有两种方法可以在一个SMP中使应用程序并行化,如下所述:
(1)传统方法是把应用程序分解为多个进程。这些进程使用进程间通信(IPC)方法进行通信,例如管道、信号量或者共享内存。必须能够阻塞进程使其等待事件的发生(例如来自其它进程的消息),并且进程必须用类似锁的东西协调对共享对象的访问。
(2)另一种方法是使用面向 UNIX(POSIX)线程的可移植操作系统接口。线程和进程一样存在协调的问题,并有类似的处理机制。因此一个单独的进程可以同时有很多线程运行在不同的处理器上。协调这些线程并且使得对共享数据的访问序列化是开发者的责任。
在并行化一个应用程序的时候,考虑线程和进程两者各自的优势并且决定使用哪种方法。线程可能比进程快,并且它对内存的共享也比较容易。另一方面,进程的实现更容易分布到多个机器或者群集中。如果一个应用程序需要创建或者删除新实例,则线程会更快(在派生进程中开销更大)。就其它功能而言,线程的开销和进程差不多2。