QNX system architecture -- Chapter 5 Multicore Processing

QNX Neutrino RTOS可以在单核或多核系统上运行。 多处理系统可以采用以下形式:

Discrete or traditional

具有单独物理处理器的系统通过板级总线连接在多处理模式下。

Multicore

一个芯片,其中一个物理处理器具有多个CPU,通过芯片级总线互连。

多核处理器通过并发性提供更高的计算能力,提供更高的系统密度,并以比单处理器芯片更低的时钟速度运行。多核处理器还可以降低散热,功耗和电路板面积(从而降低系统成本)。

多处理包括几种操作模式:

Asymmetric multiprocessing (AMP):

在每个CPU上运行单独的OS或相同OS的单独实例

Symmetric multiprocessing (SMP):

OS的单个实例化同时管理所有CPU,应用程序可以浮动到它们中的任何一个。

Bound multiprocessing (BMP):

OS的单个实例化同时管理所有CPU,但每个应用程序都锁定到特定的CPU。

注意:要确定系统上有多少处理器,请查看系统页面的num_cpu条目。 有关更多信息,请参阅构建嵌入式系统的系统页面章节。

Asymmetric multiprocessing (AMP)

非对称多处理提供了与传统单处理器系统类似的执行环境。它为移植遗留代码提供了相对简单的途径,并提供了一种控制CPU使用方式的直接机制。在大多数情况下,它允许您使用标准调试工具和技术。

AMP can be:

• homogeneous —每个CPU运行相同类型和版本的操作系统

• heterogeneous —每个CPU运行不同的操作系统或同一操作系统的不同版本

QNX Neutrino的分布式编程模型使您可以在同构环境中充分利用多个CPU。在一个CPU上运行的应用程序可以与其他CPU上的应用程序和系统服务(例如,设备驱动程序,协议栈)透明地通信,而不需要传统形式的处理器间通信所强加的高CPU利用率。

在异构系统中,您必须实现专有通信方案,或者选择两个共享公共基础结构(可能基于IP)的操作系统,以进行处理器间通信。为了帮助避免资源冲突,操作系统还应提供访问共享硬件组件的标准化机制。

使用AMP,您可以决定应用程序使用的共享硬件资源如何在CPU之间进行划分。通常,此资源分配在引导期间静态发生,包括物理内存分配,外设使用和中断处理。虽然系统可以动态分配资源,但这样做会导致CPU之间的复杂协调。

在AMP系统中,进程始终在同一CPU上运行,即使其他CPU空闲也是如此。结果,一个CPU可能最终被低估或过度使用。为了解决该问题,系统可以允许应用程序从CPU动态迁移到另一个。但是,这样做可能涉及复杂的状态信息检查点或可能的服务中断,因为应用程序在一个CPU上停止并在另一个CPU上重新启动。此外,如果CPU运行不同的操作系统,这种迁移即使不是不可能,也很困难。

Symmetric multiprocessing (SMP)

在多核设计中分配资源可能很困难,尤其是当多个软件组件不知道其他组件如何使用这些资源时。

对称多处理通过在所有系统的CPU上仅运行QNX Neutrino RTOS的一个副本来解决该问题。由于操作系统始终可以深入了解所有系统元素,因此可以在很少或没有来自应用程序设计人员的输入的情况下在多个CPU上分配资源。此外,QNX Neutrino提供内置的标准化原语,例如pthread_mutex_lock(),pthread_mutex_unlock(),pthread_spin_lock()和pthread_spin_unlock(),让多个应用程序可以安全轻松地共享这些资源。

通过仅运行QNX Neutrino的一个副本,SMP可以动态地将资源分配给特定应用程序而不是CPU,从而可以更好地利用可用处理能力。它还允许系统跟踪工具为多处理系统整体收集操作统计信息和应用程序交互,为您提供有关如何优化和调试应用程序的宝贵见解。

例如,IDE中的System Profiler可以跟踪从一个CPU到另一个CPU的线程迁移,以及OS原语使用,调度事件,应用程序到应用程序消息传递和其他事件,所有这些都具有高分辨率时间戳。由于您使用标准OS原语而不是复杂的IPC机制,因此应用程序同步也变得更加容易。

QNX Neutrino允许应用程序中的执行线程在任何CPU上同时运行,使得芯片的整个计算能力始终可供应用程序使用。QNX Neutrino的抢占和线程优先级排序功能可帮助您确保CPU周期进入最需要它们的应用程序。

Booting an x86 SMP system

微内核本身包含非常少的硬件或系统特定代码。决定系统功能的代码在启动程序中被隔离,启动程序负责初始化系统,确定可用内存等。收集的信息被放入微内核和所有进程可用的内存表中(在读取时) - 只是基础)。

startup-x86 程序旨在用于支持统一可扩展固件接口的系统。该启动程序负责:

• 确定处理器数量
•确定本地和I / O APIC的地址
•初始化每个额外的处理器

复位后,只有一个处理器将执行复位代码。 该处理器称为启动处理器(BP)。 对于找到的每个其他处理器,运行startup-x86代码的BP将:

•初始化处理器
•将其切换到32位保护模式
•为处理器分配自己的页面目录
•设置处理器在禁用中断的情况下旋转,等待内核释放

How the SMP microkernel works

一旦附加处理器已经发布并且正在运行,所有处理器都被认为是用于线程调度的对等体。

Scheduling

调度策略遵循与单处理器系统相同的规则。也就是说,优先级最高的线程将在可用的处理器上运行。如果新线程准备好作为系统中的最高优先级线程运行,它将被分派到适当的处理器。如果选择多个处理器作为潜在目标,则微内核将尝试将线程分派到上次运行的处理器。此亲和关系用于尝试减少从一个处理器到另一个处理器的线程迁移,这可能会影响缓存性能。

在SMP系统中,调度程序在确定如何调度其他线程时具有一定的灵活性,着眼于优化高速缓存使用并最小化线程迁移。这可能意味着某些处理器将运行优先级较低的线程,而优先级较高的线程正在等待它上次运行的处理器上运行。下一次运行较低优先级线程的处理器做出调度决策时,它将选择优先级较高的线程。

在任何情况下,保证在单处理器系统上实施的实时调度规则在SMP系统上得到支持。

Kernel locking

在单处理器系统中,一次只允许一个线程在微内核中执行。大多数内核操作的持续时间很短(在奔腾级处理器上通常为几微秒)。 微内核还设计为完全可抢占并可重新启动,以用于需要更多时间的操作。这种设计保留了微内核精简而快速,无需大量精细锁。有趣的是,通过内核在主代码路径中放置许多锁会明显降低内核的速度。每个锁通常涉及处理器总线事务,这可能导致处理器停顿。

在SMP系统中,QNX Neutrino在可抢占和可重新启动的内核中只保留了一个线程的这种理念。 可以在任何处理器上输入微内核,但是一次只允许一个处理器访问。

对于大多数系统,在微内核中花费的时间仅占处理器工作负载的一小部分。因此,虽然会发生冲突,他们应该比一般例外更多。。对于微内核尤其如此,其中传统的OS服务(如文件系统)是独立的进程而不是内核本身的一部分。

Interprocessor interrupts (IPIs)

处理器通过IPI(处理器间中断)相互通信。IPI可以有效地调度和控制多个处理器上的线程。例如,在以下情况下,通常需要对另一个处理器进行IPI:

•优先级较高的线程准备就绪
•在另一个处理器上运行的线程被信号命中

•取消在另一个处理器上运行的线程
•销毁在另一个处理器上运行的线程

Critical sections

为了控制对它们之间共享的数据结构的访问,线程和进程使用互斥锁,condvars和信号量的标准POSIX原语。这些工作在SMP系统中没有变化。

许多实时系统还需要保护对中断处理程序和拥有处理程序的线程之间的共享数据结构的访问。 线程之间使用的传统POSIX原语不能供中断处理程序使用。 这里有两种解决方案:

    1. 一种是从中断处理程序中删除所有工作,而是在线程时执行所有工作。鉴于我们的快速线程调度,这是一个非常可行的解决方案。

    2. 在运行QNX Neutrino RTOS的单处理器系统中,中断处理程序可以抢占线程,但线程永远不会抢占中断处理程序。这允许线程通过在非常短的时间内禁用和启用中断来保护自己免受中断处理程序的影响。

非SMP系统上的线程使用以下形式的代码保护自己:

InterruptDisable()
// critical section
InterruptEnable()
Or:
InterruptMask(intr)
// critical section
InterruptUnmask(intr)

不幸的是,这个代码在SMP系统上会失败,因为线程可能在一个处理器上运行而中断处理程序同时在另一个处理器上运行!

一种解决方案是将线程锁定到特定处理器(请参阅本章后面的“Bound Multiprocessing (BMP)”)。

更好的解决方案是使用线程和中断处理程序可用的新排除锁。 这由以下原语提供,它们适用于单处理器和SMP机器:

InterruptLock(intrspin_t* spinlock )

尝试获取一个自旋锁,一个在中断处理程序和线程之间共享的变量。 代码将在紧密循环中旋转,直到获得锁定。禁用中断后,代码将获取锁定(如果它是由线程获取的)。必须尽快释放锁(通常在几行C代码中没有任何循环)。

InterruptUnlock(intrspin_t* spinlock )

释放锁定并启用中断。

 

在非SMP系统上,不需要自旋锁。

Bound multiprocessing (BMP)

绑定多处理提供非对称多处理模型的调度控制,同时保留对称多处理的硬件抽象和管理。

BMP与SMP类似,但您可以指定线程可以运行的处理器。您可以在同一系统上同时使用SMP和BMP,允许某些线程从一个处理器迁移到另一个处理器,而其他线程仅限于一个或多个处理器。

与SMP一样,操作系统的单个副本维护所有系统资源的整体视图,允许它们在应用程序之间动态分配和共享。但是,在应用程序初始化期间,系统设计人员确定的设置会强制所有应用程序的线程仅在指定的CPU上执行。

与完整的浮动SMP操作相比,此方法具有以下几个优点:

  • 它通过允许共享相同数据集的应用程序仅在同一CPU上运行,消除了可能降低SMP系统性能的缓存抖动。

  • 它提供比SMP更简单的应用程序调试,因为应用程序中的所有执行线程都在单个CPU上运行。

  • 通过让共享数据在单个CPU上运行,它可以帮助使用差技术同步共享数据的旧应用程序正常运行。

在BMP中,锁定到一个CPU的应用程序无法使用其他CPU,即使它们处于空闲状态。 但是,QNX Neutrino RTOS允许您动态更改指定的CPU,而无需检查点,然后停止并重新启动应用程序。

QNX Neutrino通过runmask支持硬处理器亲和性的概念。 在runmask中设置的每个位表示线程可以运行的处理器。 默认情况下,线程的runmask设置为all,允许它在任何处理器上运行。 值0x01将允许线程仅在第一个处理器上执行。

默认情况下,进程或线程的子进程不继承runmask; 有一个单独的继承掩码。

通过仔细使用这些掩模,系统设计者可以进一步优化系统的运行时性能(例如,通过将非实时过程降级到特定处理器)。但是,一般情况下,这不是必需的,因为当优先级较高的线程准备就绪时,我们的实时调度程序将始终抢占优先级较低的线程。 处理器锁定可能只会影响缓存的效率,因为可以防止线程迁移。

您可以通过以下方式为新线程或进程指定runmask:

  • 调用posix_spawnattr_setrunmask(),使用posix_spawnattr_setxflags()来设置
    POSIX_SPAWN_EXPLICIT_CPU扩展标志,然后调用posix_spawn()

要么:

  • 设置继承结构的runmask成员并指定调用spawn()时SPAWN_EXPLICIT_CPU标志。

要么:

  • 启动程序时,使用on或-ro选项启用实用程序。 这也设定了流程将掩码继承到相同的值。

您可以通过以下方式更改现有线程或进程的运行掩码:

  • 使用_NTO_TCTL_RUNMASK或_NTO_TCTL_RUNMASK_GET_AND_SET_ INHERIT命令对ThreadCtl()内核调用。

要么:

  • 对slay实用程序使用-C或-R选项。如果还使用-i选项,则slay将继承掩码设置为相同的值。

有关更多信息,请参阅QNX Neutrino程序员指南的多核处理章节。

A viable migration strategy

作为AMP和SMP之间的中间点,如果您希望转向完整的SMP,BMP提供了可行的迁移策略,但您担心现有代码可能在真正的并发执行模型中运行不正确。
您可以将遗留代码移植到多核系统,并最初将其绑定到单个CPU以确保正确操作。 通过明智地将应用程序(可能还有单个线程)绑定到特定的CPU,您可以将潜在的并发问题隔离到应用程序和线程级别。 解决这些问题将允许应用程序完全同时运行,从而最大化多个处理器提供的性能增益。

Choosing between AMP, SMP, and BMP

AMP,SMP和BMP之间的选择取决于您尝试解决的问题:

  • AMP适用于传统应用程序,但可扩展性超出两个CPU。

  • SMP提供透明的资源管理,但尚未针对并发性设计的软件可能存在问题。

  • BMP提供许多与SMP相同的优点,但保证单处理器应用程序将正常运行,极大地简化了旧版软件的迁移。

如下表所示,从任何这些模型中进行选择的灵活性使您可以在性能,可伸缩性和迁移简易性之间实现最佳平衡。

源文件:《Multicore Processing》

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值