多核CPU给系统设计带来了什么

来源:互联网 发布:飞升坐骑升级数据2017 编辑:程序博客网 时间:2024/06/06 07:39

(转自:http://publish.it168.com/2007/0124/20070124003604.shtml)

【IT168 专稿】多核化趋势正在改变IT计算的面貌。跟传统的单核CPU相比,多核CPU带来了更强的并行处理能力、更高的计算密度和更低的时钟频率,并大大减少了散热和功耗。目前,在几大主要芯片厂商的产品线中,双核、四核甚至八核CPU已经占据了主要地位。在将应用从单核环境向多核系统迁移的过程中,通过选择合适的操作系统,应用开发人员可以大大地减少麻烦。

系统设计和软件开发面临的多核挑战

    有效地利用多核技术,不仅会大大地改善下一代网络环境的性能和可扩展性,还会对系统设计和软件开发产生深远的影响。目前,系统设计工程师和软件工程师们非常熟悉针对单核CPU的编程环境,却对多核计算一无所知,或者缺乏足够的经验技能。

图1 典型的多核CPU结构

    例如,多核芯片如何管理共享资源就是一大挑战。在大多数情况下,多核CPU的内核拥有独立的L1缓存,共享L2缓存、内存子系统、中断子系统和外设(如图1)。因此,系统设计师需要让每个内核独立访问某种资源,并确保资源不会被其他内核上的应用程序争抢。

    多核的出现还让系统设计变得更加复杂。如运行在不同内核上的应用为了互相访问、相互协作,需要进行一些独特的设计,如高效的IPC(进程间通信,interprocess communication)机制、共享内存的数据结构和同步原语(synchronization primitives)。

    程序代码迁移(code migration)也是个问题。大多数系统厂商都在针对单核CPU架构的代码库上进行了大量投资。因而,这些公司需要有一个清晰的迁移策略,来使其代码可以最大化地利用多核硬件资源。

    针对多核设计的操作系统可能会大大减少解决上述挑战所需的工作量,也可能增加另一些问题的复杂性。这全都取决于操作系统是如何支持多核芯片的多处理模式。多处理模式主要有以下三种:

    •非对称多处理(Asymmetric multiprocessing,AMP)——每个CPU内核运行一个独立的操作系统或同一操作系统的独立实例(instantiation)。

    •对称多处理(Symmetric multiprocessing,SMP)——一个操作系统的实例可以同时管理所有CPU内核,且应用并不绑定某一个内核。

    •混合多处理(Bound multiprocessing,BMP)——一个操作系统的实例可以同时管理所有CPU内核,但每个应用被锁定于某个指定的核心。

上述三种模式都有其各自的优点和缺点。每一个模式适合于解决某方面的特定问题,而且对操作系统的要求也各不相同。

非对称多处理(Asymmetric multiprocessing,AMP)

    非对称多处理(AMP)给开发者提供了一个与传统单核CPU系统相类似的运行环境,使得开发者已有的一系列经验和知识可以继续加以利用;同时,这也为老程序的移植提供了相当大的便利性,AMP模式的运行机制使得开发者可以直接调控CPU内核运作情况;最重要的是,开发者可以使用标准的调试工具和技术来完成既定的设计。

    AMP可以是同构的(homogeneous),也可以是异构的(heterogeneous)。前者是指所有内核运行同一种类型和版本的操作系统,后者则是指每个内核运行不同类型或版本的操作系统(比如一个内核运行QNX Neutrino RT,而另一个内核运行Linux)。

    在同构环境中,开发人员只要选择一个可提供分布式编程模式的操作系统,就能最大化地利用多核,允许某个内核上的应用程序透明地与另一个内核上的应用/系统服务(如设备驱动、协议堆栈)进行通信,但不会有传统IPC机制所造成的高CPU占有率。

    异构环境的要求有些不同。在这种环境下,开发人员要么执行专有的通信协议,要么选择可供IPC共享相同架构(如基于IP)的两个操作系统。为了避免资源冲突,两个操作系统还需要通过一个标准机制来访问被共享的硬件

图2 使用同构AMP控制输入和输出流量

    在如图2所示的同构环境中,一个内核处理来自某硬件接口的输入流量(ingress traffic),而另一个内核处理输出流量(egress traffic)。由于这两种流量彼此独立,因此,两内核之间无须进行通信或共享数据,操作系统也就不用提供内核间的IPC。但是,操作系统必须拥有足够的效率来进行实时流量的管理。

图3 使用同构AMP执行分布式控制面板

    图3所示的则是另一个同构例子。在这种情况下,两个内核基于分布式控制面板(distributed control plane),每个内核要处理数据面板(data plane)的不同方面。为了正确地控制数据面板,运行在不同内核上的应用程序之间必须相互协调。而为了实行这种协调,操作系统需要提供足够强大的IPC支持,比如拥有共享内存存储路由信息。

    在图4所示的异构环境中。一个内核运行控制面板(control plane),另一个内核处理所有的数据面板流量,并实时监控。在这种环境下,运行在两个内核上的不同操作系统需要提供一致的IPC机制,以允许两个内核可以高效的通信,抑或通过共享数据结构来实现。

图4 基于异构AMP的控制面板和数据面板

    实际上,在所有上述情况中,操作系统对易用的通信协议的支持都会大大地增强内核间的操作。特别是,基于分布式编程的操作系统还能最大化地利用多核所具有的并行处理机制。

资源分配

    使用AMP,应用开发人员就可以决定不同内核上的应用以何种方式共享硬件资源。通常情况下,资源分配是在系统启动时静态地实现的,包括物理内存分配、外设调用和中断处理。当然,系统也可以动态地分配资源,但内核与内核之间的协调也会变得更加复杂。

    在AMP系统中,一个进程(process)总是运行在同一个内核中,即使其他内核处于空闲状态。结果会导致一个内核要么没有被充分利用,要么被利用过度。为了解决这个问题,系统会允许应用程序在内核间动态迁移。然而,这样就需要对状系统信息进行相当复杂的检测。或者,当应用在内核间迁移的过程中,可能会导致服务中断。还有,如果核心运行不同的操作系统,这种迁移是相当困难的。

    为了支持AMP,多核CPU必须执行一个抽象层(abstraction layer),以使得某种资源看起来是被每个内核所独占。目前一个较好的例子就是基于X86多核CPU的虚拟化概念。

对称多处理(Symmetric multiprocessing,SMP)

    在多核系统中分配资源是很困难的,特别是在多个软件之间不知道对方正占用哪些资源的情况下。SMP通过以下方法来解决这一问题:让所有内核都运行同一个操作系统的拷贝。由于操作系统每时每刻都监控着系统的运行状态,因此可以在多核之间分配资源,而无需应用开发人员的干预。另外,操作系统可以提供内嵌的标准化原语(primitives),如pthread_mutex_lock、pthread_mutex_unlock、pthread_spin_lock和pthread_spin_unlock,从而让多个应用可以安全和容易地共享这些资源。

    由于仅仅是运行操作系统的一个拷贝,SMP可以动态地向指定应用分配资源,从而提高硬件资源的利用率。另外也可以让系统跟踪工具完整地收集各种有价值的信息,如操作统计、多核芯片上的应用交互等,以帮助开发人员对应用进行优化和调试。比如,QNX Momentics开发套件中的system profiler可以实时跟踪线程在内核与内核之间的迁移,跟踪操作系统原语使用、计划任务、应用间通信以及其他事件。由于开发人员使用标准的操作系统原语,而不是复杂的IPC机制,这也使得应用同步变得更加容易。

    SMP上的操作系统提供上述功能而无须开发人员使用特别的API或编程语言。实际上,在高端SMP环境中,开发人员已经多年成功地使用了POSIX标准(特别是pthreads API),可以写出能同时运行在单核CPU和多核CPU上的POSIX代码。一些操作系统也允许在这两类CPU上运行相同的二进制代码。

    两个核心共享内存中的单一操作系统映像。在极少数情况下,两个内核在试图访问操作系统资源时,会使用处理机间中断(interprocessor interrupt)和自旋锁(spinlock)来预防冲突。为最大程度地减少延迟,微内核(microkernel )操作系统架构是最好的选择,这种架构在kernel上实际花费的时间很少。

    一个设计良好的SMP 操作系统允许多个应用线程协同地运行在任何一个内核上。这种协同性使得应用程序任何时候都可以利用芯片的整体计算能力。如果操作系统能提供适当的优先权和线程优先排序能力,就能帮助应用开发人员确保CPU为最需要的应用服务。

图5 基于SMP模式的控制面板

    在图5所示的控制面板中,SMP允许各种程序中的所有线程运行在任何一个内核上。比如,在CLI(命令行界面,command-line interface)进程运行的同时,路由应用程序也正在进行密集计算。

混合多处理(Bound multiprocessing,BMP)

    由QNX倡导的BMP结合了SMP高级资源管理和AMP应用控制的混合功能。BMP跟SMP一样具有透明资源管理功能,不同的是,可以让开发人员将软件任务锁定在指定的内核上。而在SMP中,操作系统拷贝可以管理所有的系统资源,允许资源在应用程序间动态地分配和共享。

    跟SMP相比,BMP带来了几大优势。它允许共享同一个数据集(data set)的应用独立地运行在同一个内核上,从而消除了SMP系统中会降低性能的快取置换(cache thrashing)。另外,由于一个应用中的所有执行线程可以运行在一个内核上,所以BMP可以提供比SMP更简单的应用调试。BMP还可以让为单核环境编写的传统程序正确地运行在多核环境,即让这些应用运行在某一个内核上。

     在BMP系统中,锁定于一个内核的应用无法利用其他内核,即使其他内核处于空闲状态。这意味着,操作系统厂商可以提供工具来分析应用对CPU等资源的使用率,从而在内核之间分配应用来获得最大的性能。如果操作系统还能支持动态改变所指定的CPU核心,那么用户就可以更自由的让应用程序从一个核心转到另一个,不必为了要检查、停止和重新启动应用程序而担心。

    图6所示的是运行在半双工模式下的BMP 系统。在Core 0和Core 1核心上分别运行着多线程的接收/传送进程。与SMP类似,操作系统完全清楚所有的内核在做什么,可以完整地看到系统的操作信息和性能信息,这有助于减轻开发人员的负担,使其不再需要分别从每个内核收集信息和分析整理这些信息。

图6 BMP的半双工模式

    在图7所示的控制面板/数据面板中。控制面板应用(CLI,操作、管理和维护,数据面板管理)运行在core 0上,而数据面板ingress和egress应用一起运行在core 1上。使用本地操作系统机制或同步受保护的共享内存结构,开发人员可以容易地实现进程间通信(IPC)。

图7 基于BMP的控制面板和数据面板

    作为界于AMP和SMP之间的中间路线,BMP为用户提供了一种可行的迁移策略。这些用户可能想向全SMP迁移,又担心现有的代码在真实的并行模式下无法正确运行。而在BMP中,用户可以先将以前的代码绑定在一个内核上以保证正确执行,然后逐渐向多核环境转移。

    通过把应用(或线程)绑定在指定的内核上,设计人员从而把潜在的并行问题控制在应用和线程层面。解决这些问题将允许应用完全并行地运行,因而最大化地发挥多核CPU带来的强大性能。