QNX支持自适应分区,这里的分区并不是常见的磁盘分区,而是一个可分配资源集合。QNX通过自适应分区控制竞争进程间的资源分配控制。
在一些计算机系统中,需要把应用或者应用组同其他应用或应用组隔离起来。我们不希望一个应用程序(不管是不是恶意的)破换其他应用或者阻止其他应用执行。
针对这个问题,某些系统使用虚拟墙,也称为分区,确保在这个分区内的一组进程给定一组资源。主要的资源是CPU运行时间,也包括其他共享资源,比如memory和文件空间。
Figure 55: Static partitions guarantee that processes get the resources specified by the system designer
典型的,竞争资源分区系统的主要目标是把计算机划分为一组小计算机,并使得他们间的交互尽可能少。然而,这种方法非常的不灵活。自适应分区采用了更灵活的方式。
QNX 分区自适应表现在:
因此,自适应分区限制更少更强大。除了自适应,时间分区允许我们根据不同的行为,划分CPU时间分区。
If adaptive partitions aren't boxes, what are they?
一个自适应分区是一组规则的集合。规则用来控制系统内资源的分配。
当一个进程或者线程被关联到一个特定的分区,那么它的行为就受到分区规则的控制。
比如,自适应分区类似于俱乐部中的成员。每个人可以参加几个不同的俱乐部。他们甚至可以从一个俱乐部移到另外一个俱乐部。但是当他们在某个特定俱乐部时,他们必须遵守这个俱乐部的规则。
分区提供:
通过使用多个partitions,你可以避免单点失败。例如,一个跑飞的程序不能占用整个地址空间,在其他分区运行的进程仍然可以分配系统资源。
当前,QNX进程模型和其他操作系统相比,提供了更多保护,包括:
提供实时性能,防止过载。QNX引入了自适应分区。固定分区在静态系统,很少或没有软件动态配置的情况下,运行良好。对于动态系统,静态分区是低效的。比如,在分区间静态划分CPU时间会导致延迟:
一个自适应分区是一组线程,为了共同的目标和行为。对于静态分区,自适应分区分配了预算,保证它的最小共享CPU资源。而对于静态分区,自适应分区:
自适应分区在设计,开发,运行和调试系统时提供了很多好处。
自适应分区设计系统有助于性能优化
Partitioning
分区划分系统资源,供应用程序使用。一个分区包含一些资源并且定义了这些资源的使用规则。资源包括处理器,buffers,页表或者文件描述符。
关于线程调度,自适应分区确保空闲的时间可以分配给其他分区使用。这使得系统可以处理突发的进程需求。对于轮转线程调度器,未用的CPU时间被花费在运行idler线程上。
Partition inheritance
自适应分区的另外一个特色是分区继承概念。
对于线程调度器,这个功能让设计者开发没有配额的服务进程。当server执行clients的请求时,client分区为这个操作买单。没有这个功能,只能给server分配无限制的配额,使用这个功能有如下好处:
设计大规模的分布式系统是复杂的。典型的系统有很多子系统,进程,彼此独立开发的线程。设计系统时,会根据不同的系统性能目标,优先级模式和不同的运行时优化方法,进行分组设计。
产品开发会在不同地理位置,不同时区进行,使得系统设计变得更加复杂。一旦这些分离的系统被集成运行时,系统所有部分需要在下面操作场景提供相同的响应速度
在并行开发情况下,进行产品集成时会引发各种问题。典型的,一旦系统正在运行,不可预见的交互会导致严重的性能下降。当这类问题发生时,很少有设计者和架构师能够从系统层面检测或者解决该类问题。解决通常需要相当长时间的修改。这扩大了系统集成周期,影响了上市时间。
通常需要一周或者几周才能定位该类问题,再需要几周调整系统的优先级,重新测试,重新改进。如果这种问题不能有效的解决,产品的可扩展性是有限的。
这很大的归结于没有有效的方法分配CPU给不同的组。线程优先级提供了一种方法来确保关键任务执行,但是并没有保证重要,非关键任务的执行时间,导致正常操作没有给予足够的CPU时间。此外,很难推广通用的建立线程优先级方法到巨大的开发团队。
自适应分区使用线程调度器,使得结构维护保留资源给紧急任务,比如灾难恢复系统,或者调试shell。为每个子系统定义了CPU预算,允许开发组实现自己的优先级模式,并在给定的预算内进行优化。这个方法可以让开发者独立的设计开发子系统,并且简化了继承努力。最终效果是改善了上市时间并且有助于产品的扩展。
一些系统很容易收到拒绝服务攻击(DOS)。比如,一个恶意的用户通过请求需要进程处理的服务来轰炸系统。在大量请求攻击下,这个进程可能过度占用CPU资源,导致系统其他进程处在饥饿状态。
Figure 56: Without adaptive partitioning, a DOS attach on one process can starve other critical functions
某些系统试图通过增加一个监测进程,该进程监视CPU使用情况,当一个进程占用太多CPU时间时,监测进程执行矫正行动。这个方法有如下缺点,包括:
线程调度器可以解决这个问题,线程调度器通过提供额外的配额给系统功能。这可以确保系统重要任务有CPU配额。线程可以修改他们的优先级,这棵能是个安全漏洞,但是你可以配置线程调度器防止分区上运行的代码修改它的配额。
Figure 57: With scheduler partitions, a DOS attach is contained
因为自适应分区可以分配未用的CPU时间给需要的分区,所以没必要捕捉那些在合法需求内的处理操作。
自适应分区设置可以使得调试嵌入式系统更容易,在开发和部署阶段提供一个"emergency door"到系统中。
创建一个可以运行诊断工具的分区,如果不需要使用这个分区,线程调度器把分区的配额分配给其他的分区。这使得有可以访问系统而不影响性能。更多的信息,可参考Adaptive partitioning User's Guide中的Testing and Debugging 一章
该线程调度器是一个可选调度器,允许你保证每个进程组,线程或者应用都能获得的最小CPU时间,分配给一个分区的CPU百分比称为配额。
QNX架构的线程调度器主要用来解决嵌入式系统设计中的如下问题:
更多的信息,参见Apative Partitioning User's Guide