多处理器下的硬实时操作系统研究
0、引言
Linux 是一个具有广阔前景的操作系统,从桌面工作站到低端服务器,处处都可见它的身影。现如今,Linux 正全力进军嵌入式系统和高端服务器系统领域,但它的技术缺陷却限制了它的竞争力:虽然Linux继承了传统Unix的公平调度机制即分时调度策略,提供了一个稳定的操作系统的管理系统,但是它仍然不能解决实时系统要求的纳秒级的中断延迟、任务切换时间,即便是当前的2.6内核,也只是在linux内核中添加了一些可抢占点,对实时性的支持也还是不尽人意。
现如今提出了一种将实时任务与SMP体系结构相结合的方案,由于它将处理器以实时与非实时的方式进行了划分,所以称之为不对称的多处理器原则。尽管这种方案是可行的,但是它仍存在一个很大的弊端:在非实时处理器负载过重的情况下,实时处理器可能会处在空闲的状态,这样就造成了极大的资源浪费。于是一种对这种方案进行拓展的实时系统――ARTiS系统便应运而生。
1、 ATRiS简介
ATRiS是一个以多处理器(SMP)架构为基础,对linux进行实时拓展的系统。它的核心思想是:“将多个处理器进行分类,即分为实时处理器(RT CPU)和非实时处理器(NRT CPU),在实际的运行当中,它将通过自身的迁移机制实现非实时任务在进入不可强占状态前迁移到非实时处理器,以便实时处理器及时响应实时任务。并通过改进的负载平衡机制使ATRiS系统充分发挥SMP架构的优势。
1.1 ATRiS任务与处理器的划分
在ATRiS系统中不仅将处理器分为了实时处理器与非实时处理器,而且将任务也分成了三种类型,分别是RT0任务、RT1+任务以及Linux任务,分别对应于现实中的硬实时任务,软实时任务和非实时任务。下面给出了处理器与任务之间的关系:
RT0任务:对应于要处理的硬实时任务,具有最高的优先级。并且每一个RT0任务都会与唯一的一个实时处理器绑定,于是RT0任务就只能运行在实时的处理器上。
RT1+任务:对应于要处理的软实时任务,可以运行在实时处理器,也可以运行在非实时处理器上。但是当它要运行在实时处理器上时,必须是处于可抢占的状态,否则就要迁移到非实时处理器上。
Linux任务:即非实时的linux任务,与RT1+任务一样,它也可以运行在实时处理器上,并且当它执行到一段不可抢占的代码时需要迁移至非实时的处理器。
1.2 迁移机制
ARTiS中迁移机制的目标是:在保证可以实时响应RT0任务的前提下,尽可能多的发挥多处理器的并行特性。为了满足这一目标,它要求实时处理器上的非RT0任务在进入到不可抢占的代码段时必须自动迁移到非实时处理器。为了使迁移不受阻碍的发生,ARTiS去掉了处理器之间的共享锁,取而代之的是一个FIFO队列,用它来实现非实时处理器与实时处理器之间的交互。也就是说,ARTiS中的处理器将通过这个FIFO队列来存放或者取出需要迁移的非RT0任务。
1.3 负载平衡机制
通常的负载平衡机制是指:通过在多台计算机之间合理地分配负载,使各台计算机的负载基本均衡。但是在ARTiS系统中RT0任务是不可迁移的,而且 linux原有的负载平衡机制只是针对于处理对称处理器(实时处理器与实时处理器,非实时处理器与非实时处理器)之间的负载平衡,并未设计不对称处理器之间平衡负载的方法。所以相对的负载平衡机制也更加复杂。
2、ATRiS机制实现
ATRiS系统的实现机制是通过改变内核源码实现的,由于它所要实现的只是在实时处理器空闲时将非实时任务迁移至实时处理器,而在非实时任务到达不可抢占代码时迁移出实时处理器,所以它所要执行的主要功能就是:在实时处理器空闲的状态下,通过自身的负载平衡机制将非实时处理器上的任务迁移至实时处理器。而当非实时任务执行到不可抢占的代码时,利用自身的迁移机制将非实时任务迁移至非实时处理器。
尽管如此,ARTiS并不是完全另起炉灶,它只是在linux原有的任务迁移和负载平衡机制上添加一些自己的函数,由此来实现自身特有的任务迁移和负载平衡机制。
2.1 任务迁移机制
ATRiS系统的迁移机制的核心就是:当一个非RT0任务将要执行到不可抢占的代码部分时,将会自动的从实时处理器迁移至非实时处理器。可以将该机制看作两步:第一步是确定非RT0任务的不可抢占点,即确定迁移的时机;第二步则是要将任务从实时处理器迁移至非实时处理器,即实现迁移。
确定迁移的时机
在ARTiS系统中的任务是通过注册而产生的(RT0任务就是通过int artis_enter_rt0(pid_t pid, int rt_cpu)函数注册的,RT1+任务是通int artis_enter_rt1plus(pid_t pid, int policy, int priority)函数注册),由于RT0任务是不存在被抢占的问题的,所以这里只考虑RT1+问题发生迁移的时机,ARTiS系统认为,如果一个任务执行了系统函数preempt_disable()或local_irp_disable()时,则表明他将要进入不可抢占状态,即需要进行任务的迁移。 ARTiS系统在上述的两个函数中添加了函数artis_try_to_migrate(),该函数首先会判断是否满足迁移其他条件(例如:判断当前运行的处理器是否是实时处理器等),然后调用函数artis_request_for_migration()请求迁移。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论