侵权投诉
订阅
纠错
加入自媒体

嵌入式设计:多处理器下的硬实时操作系统研究

2013-12-05 10:53
风频浪劲
关注

  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()请求迁移。

  实现迁移

  当非RT0任务调用了函数artis_request_for_migration()时,它不能直接把自己插入到其他处理器的运行队列当中,因为这样就会造成多处理器在同一时间运行同一任务的情况,所以在ARTiS系统中,是通过与当前处理器上的下一个任务来插入迁移任务的,总的来说可以分为三步:首先,迁移进程会调用artis_request_for_migration(),设置迁移标志,并将自身的亲和CPU设置为本地CPU,然后使自身再次进入可抢占状态,调用调度函数。然后,新调度的任务将执行函数artis_complete_megration(),该函数将调用函数 finish_task_swith()完成调度,选择一个非实时处理器把迁移任务插入到其上的RT-FIFO队列,并通过产生一个进程间的中断信号来强制目标处理器产生一轮新的调度。最后,目标处理器上的调度程序将通过调用函数artis_fetch_migration()从RT-FIFOs队列中取出迁移任务。

1  2  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号