QNX 自适应分区

QNX 自适应分区

  QNX中微子RTOS支持自适应分区,允许您控制竞争进程之间的资源分配。

分区是什么?

  在许多计算机系统中,保护不同的应用程序或应用程序组不受其他应用程序的影响是很重要的。你不希望一个应用程序——无论是有缺陷的还是恶意的——破坏另一个或阻止它运行.
  为了解决这个问题,一些系统在一组应用程序周围使用称为分区的虚拟墙,以确保每个分区都有一组经过设计的资源。考虑的主要资源是CPU时间,但也可以包括任何共享资源,如内存和文件空间(磁盘或闪存)。
QNX 自适应分区_第1张图片

  通常,竞争资源分配系统的主要目标是将一台计算机划分为尽可能少交互的一组较小的计算机;然而,这种方法不是很灵活。自适应分区采用了更灵活的视图。QNX中微子分区是自适应的,因为:

  • 您可以在运行时更改配置。
  • 它们通常在一个配置时间内固定
  • 分区行为在运行时自动适应各种条件。例如:
    1. 空闲时间被重新分配到其他调度程序分区.
    2. 文件系统可以使用一种临时在时间分区之间移动线程的机制来向客户端计费时间。

  因此,自适应分区的限制更少,功能更强大。除了自适应之外,时间分区还允许您在将CPU时间视为资源时,轻松地对其基本不同的行为建模。

如果自适应分区不是“盒子”,那么它们是什么?

  自适应分区是一组命名规则。选择这些规则是为了控制系统的全局资源行为。当一个进程或线程与一个特定的分区相关联时,它的行为将由该分区当时的规则管理。
  例如,自适应分区类似于属于俱乐部的人。每个人可以加入几个不同的俱乐部。他们有时甚至可以从一个俱乐部转到另一个俱乐部。但是当他们在一个特定的俱乐部时,他们同意遵守那个特定俱乐部的规则。
分区提供:

  1. 内存保护: 每个分区都是离散的,由内存管理单元(MMU)控制。
  2. 超载保护:每个分区都保证有一个执行时间片,由系统设计师指定。
      通过使用多个分区,可以避免出现单点故障。例如,失控的进程不能占用整个系统的资源;其他分区中的进程仍然接收它们分配的系统资源份额。
      目前,QNX中微子的过程模型比其他一些操作系统提供了更多的保护,包括:
  3. 进程之间的全内存保护。
  4. 消息传递提供统一的和受控的IPC
  5. 干净的客户机-服务器模型进行优先级继承
  6. 硬实时确定性调度
  7. 设备、文件和内存的详细权限模型
  8. 内存、文件描述符、CPU和优先级限制,使用POSIX setrlimit()函数来约束失控的进程

为什么自适应?

  为了在保证不超载的情况下提供实时性能,QNX中微子引入了自适应分区。严格的分区在很少或没有动态部署软件的静态系统中工作得最好。在动态系统中,静态分区可能是低效的。例如,分区之间执行时间的静态划分会浪费CPU时间并带来延迟:

  • 如果大多数分区都是空闲的,并且其中一个分区非常忙,那么这个繁忙的分区就不会收到任何额外的执行时间,而其他分区中的后台线程则会浪费CPU时间。
  • 如果为一个分区被调度了一个中断,那么它必须等待,直到该分区运行。这可能会导致不可接受的延迟,特别是在出现连续突发中断的情况下。
    NOTE:虽然必须重新构建系统的OS映像,但您可以在不更改(甚至重新编译)应用程序代码的情况下引入自适应分区。
      自适应分区是一组线程,它们工作在一个公共或相关的目标或活动上。与静态分区一样,自适应分区也有一个分配给它的预算,这个预算保证了它对CPU资源的最小共享。与静态分区不同,自适应分区:
  1. 自适应分区没有锁定的一组固定代码在静态分区上;您可以根据需要动态地添加和配置自适应分区
    分区的数量是有限制的。对于线程调度器,最多有8个调度器分区,因为对于每个调度操作,线程调度器必须检查每个分区,然后才能选择要在其上运行的线程。在700mhz x86上每秒可能发生50000次。(一个缓慢的机器)。因此,一定要限制调度器分区的数量,以将调度器开销降到最低。
  2. 在正常负载下表现为全局硬实时线程调度,但即使在过载情况下仍然可以提供最小的中断延迟。
  3. 最大化CPU资源的使用。对于线程调度程序,它将分区的未使用预算分配给那些在系统未加载时需要额外资源的分区。

自适应划分的优势

  自适应分区为系统的设计、开发、运行和调试提供了许多好处。

###工程产品性能
  自适应分区允许您设计系统以优化其性能。

分区

  分区对资源进行划分,使它们可以被一组程序使用。一个分区表示一个资源的一部分,并且包含很少的定义资源使用的规则。资源包括基本对象,如处理器周期、程序存储或高级对象,如缓冲区、页表或文件描述符。对于线程调度程序,自适应分区确保了系统中任何可用的空闲时间(即,一个分区不需要的分区预算中的CPU时间)对其他分区可用。这使系统能够处理在正常系统操作期间发生的突发处理需求。对于循环线程调度程序,有一种“使用它”或“丢失它”的方法,即未使用的CPU时间在没有使用完整预算的分区上运行一个空闲线程。

分区继承

  自适应分区的另一个重要特性是分区继承的概念。
  对于线程调度程序,该特性允许设计人员开发无需(或最少)预算就可以运行的服务器进程。当服务器执行来自客户端的请求时,客户端分区将按时间计费。如果没有这个特性,CPU预算就会分配给服务器,而不管它使用了多少或者使用了多少次。这些功能的好处包括:

  1. 你不必对系统进行过度的设计,这样整体成本就会降低。
  2. 如果您添加了一个应用程序,您不必重新设计公共服务(如文件系统或服务器)的预算。
  3. 该系统对用户的响应速度更快、响应速度更快。
  4. 该系统保证了重要任务的时间。
  5. 您可以使用优先级来指定进程的紧急性,使用分区的CPU预算来指定其重要性。

处理设计复杂性

  设计大规模的分布式系统本质上是复杂的。典型的系统有大量的相互独立开发的子系统、进程和线程。设计被分成不同的组,这些组具有不同的系统性能目标、不同的确定优先级的方案和不同的运行时优化方法。
  在不同的地理位置和时区进行产品开发会使情况进一步复杂化。一旦所有这些不同的子系统都集成到一个公共的运行时环境中,系统的所有部分都需要在所有的操作场景下提供足够的响应,例如:

  • 正常的系统加载
  • 高峰期
  • 故障模式

  在并行的开发道路上,在集成产品时总会出现系统问题。通常,一旦系统运行,就会发现导致严重性能下降的不可预见的交互。当出现这种情况时,通常很少有设计师或架构师能够在系统级诊断并解决这些问题。解决方案通常需要大量的修改(通常是通过反复试验)才能得到正确的结果。这扩展了系统集成,影响了投放市场的时间。
  这种性质的问题可能需要一周或更长的时间来排除故障,并且需要几周的时间来调整整个系统的优先级、重新测试和改进。如果这些问题不能得到有效的解决,产品的可扩展性就会受到限制。
  这主要是由于没有有效的方法来“预算”跨这些组的CPU使用。线程优先级提供了一种确保关键任务运行的方法,但是没有为重要的、非关键的任务提供有保证的CPU时间,这些任务在正常操作中可能会被中断。此外,建立线程优先级的通用方法很难跨大型开发团队扩展。
  自适应分区使用线程调度程序允许架构师储备应急资源,比如一个灾难恢复系统,或field-debugging shell,并为每个子系统定义高级CPU预算,允许开发团队实现自己的计划和在预算内进行优化。这种方法允许设计团队独立地开发子系统,并简化了集成工作。这样,提高了产品上市的时间,促进了产品的规模化。

提供安全性

  许多系统容易受到拒绝服务(DOS)攻击。例如,恶意用户可以用需要处理的请求轰炸系统, 当受到攻击时,这个进程会使CPU超载,并有效地使系统的其他部分陷入饥饿。
QNX 自适应分区_第2张图片

  一些系统试图通过实现一个监测进程来克服这个问题,该进程检测CPU使用率,并在它认为某个进程使用了太多CPU时调用纠正操作。这种方法有很多缺点,包括:

  1. 响应时间通常很慢。
  2. 这种方法在处理合法请求时,限制了CPU的使用。
  3. 它不是绝对可靠的;它依赖于适当的线程优先级来确保监视器进程获得足够的CPU时间。
      线程调度程序可以解决这个问题。线程调度程序可以为系统的各种功能提供单独的预算。这确保了系统总是有一些处理重要任务的CPU容量。线程可以更改自己的优先级,这可能是一个安全漏洞,但是可以配置线程调度程序,以防止在分区中运行的代码更改自己的预算。
    QNX 自适应分区_第3张图片

  由于自适应分区可以将任何未使用的CPU时间分配给需要它的分区,所以当需要增加处理时,它不会不必要地限制。

Debugging

  自适应分区甚至可以通过向系统提供一个“应急门”来简化嵌入式系统的调试(在开发或部署期间)。
  只需创建一个可以运行诊断工具的分区;如果不需要使用该分区,则线程调度程序将在其他分区之间分配其预算。这为您提供了在不影响系统性能的情况下访问系统的机会。

自适应分区线程调度程序

  线程调度器是一个可选的调度器,它允许您保证将CPU吞吐量的最小百分比分配给一组线程、进程或应用程序。分配给一个分区的CPU时间百分比称为预算。线程调度器被设计在核心QNX中微子架构之上,主要是为了解决嵌入式系统设计中的这些问题:

  • 当系统过载时,保证指定的CPU时间的最小共享
  • 防止不重要或不受信任的应用程序独占系统

你可能感兴趣的:(QNX)