QNX system architecture 16 - Adaptive Partitioning

QNX支持自适应分区,这里的分区并不是常见的磁盘分区,而是一个可分配资源集合。QNX通过自适应分区控制竞争进程间的资源分配控制。

What are partitions

在一些计算机系统中,需要把应用或者应用组同其他应用或应用组隔离起来。我们不希望一个应用程序(不管是不是恶意的)破换其他应用或者阻止其他应用执行。

针对这个问题,某些系统使用虚拟墙,也称为分区,确保在这个分区内的一组进程给定一组资源。主要的资源是CPU运行时间,也包括其他共享资源,比如memory和文件空间。

Figure 55: Static partitions guarantee that processes get the resources specified by the system designer

典型的,竞争资源分区系统的主要目标是把计算机划分为一组小计算机,并使得他们间的交互尽可能少。然而,这种方法非常的不灵活。自适应分区采用了更灵活的方式。

QNX 分区自适应表现在:

  • 可以在运行时改变配置
  • 分区仅仅在配置作用时间内固定
  • 分区在运行时自动适应条件,比如:
    • 空闲时间重新分配给其他的调度分区
    • 文件系统可以对在不同时间分区移动的clients进行时间记账。

因此,自适应分区限制更少更强大。除了自适应,时间分区允许我们根据不同的行为,划分CPU时间分区。


If adaptive partitions aren't boxes, what are they?

一个自适应分区是一组规则的集合。规则用来控制系统内资源的分配。

当一个进程或者线程被关联到一个特定的分区,那么它的行为就受到分区规则的控制。

比如,自适应分区类似于俱乐部中的成员。每个人可以参加几个不同的俱乐部。他们甚至可以从一个俱乐部移到另外一个俱乐部。但是当他们在某个特定俱乐部时,他们必须遵守这个俱乐部的规则。

分区提供:

  • 内存保护 - 每个分区是分离的,被MMU控制。
  • overload protection - 每个分区都保证执行时间片,时间片由系统设计者指定。

通过使用多个partitions,你可以避免单点失败。例如,一个跑飞的程序不能占用整个地址空间,在其他分区运行的进程仍然可以分配系统资源。

当前,QNX进程模型和其他操作系统相比,提供了更多保护,包括:

  • 进程间的全内存保护
  • 消息传递提供了唯一的可控值的IPC
  • client-server模型的优先级继承
  • 硬时间决定调度
  • devices,files,和内存的更细节的权限模型。
  • 内存,文件描述符,CPU和优先级限制,使用POSIX setrlimit()函数限制跑飞的进程。

Why adaptive?

提供实时性能,防止过载。QNX引入了自适应分区。固定分区在静态系统,很少或没有软件动态配置的情况下,运行良好。对于动态系统,静态分区是低效的。比如,在分区间静态划分CPU时间会导致延迟:

  • 如果大部分分区空闲,仅有一个非常忙,忙的分区无法获得额外的执行时间,而其他分区的后台线程却在浪费时间。
  • 如果一个中断在某个分区内调度,那么中断要等到分区运行。这可能会造成无法接受的延迟,特别是如果中断是突发的情况。

一个自适应分区是一组线程,为了共同的目标和行为。对于静态分区,自适应分区分配了预算,保证它的最小共享CPU资源。而对于静态分区,自适应分区:

  • 可以按需动态的增加和调整自适应分区。
  • 在正常负载下,运行为全局硬实时线程调度。但是在超载的情况下,仍然能提供最小中断延迟。
  • 为了最大化CPU资源使用。线程调度器把一个分区未用的配额分配给需要额外资源的分区。

Benefits of adaptive partitioning

自适应分区在设计,开发,运行和调试系统时提供了很多好处。

Engineering product performance

自适应分区设计系统有助于性能优化

Partitioning

分区划分系统资源,供应用程序使用。一个分区包含一些资源并且定义了这些资源的使用规则。资源包括处理器,buffers,页表或者文件描述符。

关于线程调度,自适应分区确保空闲的时间可以分配给其他分区使用。这使得系统可以处理突发的进程需求。对于轮转线程调度器,未用的CPU时间被花费在运行idler线程上。

Partition inheritance

自适应分区的另外一个特色是分区继承概念。

对于线程调度器,这个功能让设计者开发没有配额的服务进程。当server执行clients的请求时,client分区为这个操作买单。没有这个功能,只能给server分配无限制的配额,使用这个功能有如下好处:

  • 不需要过度设计系统,所以整体代价降低
  • 如果增加一个应用,并不需要重新设计通用服务的配额,比如文件系统或者servers
  • 系统速度快,响应及时。
  • 系统保证重要task的时间。
  • 使用优先级标识线程的优先级,使用分区CPU配额它的重要性。

Deal with design complexity

设计大规模的分布式系统是复杂的。典型的系统有很多子系统,进程,彼此独立开发的线程。设计系统时,会根据不同的系统性能目标,优先级模式和不同的运行时优化方法,进行分组设计。

产品开发会在不同地理位置,不同时区进行,使得系统设计变得更加复杂。一旦这些分离的系统被集成运行时,系统所有部分需要在下面操作场景提供相同的响应速度

  • 正常系统负载
  • 峰值期
  • 失败情况下

在并行开发情况下,进行产品集成时会引发各种问题。典型的,一旦系统正在运行,不可预见的交互会导致严重的性能下降。当这类问题发生时,很少有设计者和架构师能够从系统层面检测或者解决该类问题。解决通常需要相当长时间的修改。这扩大了系统集成周期,影响了上市时间。

通常需要一周或者几周才能定位该类问题,再需要几周调整系统的优先级,重新测试,重新改进。如果这种问题不能有效的解决,产品的可扩展性是有限的。

这很大的归结于没有有效的方法分配CPU给不同的组。线程优先级提供了一种方法来确保关键任务执行,但是并没有保证重要,非关键任务的执行时间,导致正常操作没有给予足够的CPU时间。此外,很难推广通用的建立线程优先级方法到巨大的开发团队。

自适应分区使用线程调度器,使得结构维护保留资源给紧急任务,比如灾难恢复系统,或者调试shell。为每个子系统定义了CPU预算,允许开发组实现自己的优先级模式,并在给定的预算内进行优化。这个方法可以让开发者独立的设计开发子系统,并且简化了继承努力。最终效果是改善了上市时间并且有助于产品的扩展。

Providing security

一些系统很容易收到拒绝服务攻击(DOS)。比如,一个恶意的用户通过请求需要进程处理的服务来轰炸系统。在大量请求攻击下,这个进程可能过度占用CPU资源,导致系统其他进程处在饥饿状态。


Figure 56: Without adaptive partitioning, a DOS attach on one process can starve other critical functions

某些系统试图通过增加一个监测进程,该进程监视CPU使用情况,当一个进程占用太多CPU时间时,监测进程执行矫正行动。这个方法有如下缺点,包括:

  • 响应时间太慢
  • 这个方法抓取了合理处理需要的CPU时间。
  • 该方法不可靠,因为它依赖于相应线程的优先级,必须确保监测线程可以获取充足的CPU时间。

线程调度器可以解决这个问题,线程调度器通过提供额外的配额给系统功能。这可以确保系统重要任务有CPU配额。线程可以修改他们的优先级,这棵能是个安全漏洞,但是你可以配置线程调度器防止分区上运行的代码修改它的配额。


Figure 57: With scheduler partitions, a DOS attach is contained

因为自适应分区可以分配未用的CPU时间给需要的分区,所以没必要捕捉那些在合法需求内的处理操作。

Debugging

自适应分区设置可以使得调试嵌入式系统更容易,在开发和部署阶段提供一个"emergency door"到系统中。

创建一个可以运行诊断工具的分区,如果不需要使用这个分区,线程调度器把分区的配额分配给其他的分区。这使得有可以访问系统而不影响性能。更多的信息,可参考Adaptive partitioning User's Guide中的Testing and Debugging 一章


Adaptive partitioning thread scheduler

该线程调度器是一个可选调度器,允许你保证每个进程组,线程或者应用都能获得的最小CPU时间,分配给一个分区的CPU百分比称为配额。

QNX架构的线程调度器主要用来解决嵌入式系统设计中的如下问题:

  • 当系统负载高时,保证可获得一个最小CPU运行时间。
  • 防止不重要的或者非可信应用独占系统资源。

更多的信息,参见Apative Partitioning User's Guide

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章