一种实时多任务系统软件设计方法
出口之间)的代码就构成了一个线程的对待。如果原进程中无循环,可将该进程当做单一线程对等。在图1中,Proc_9中共有4个循环返回节点(①~④),Nback=4。按最小拆分数量拆分中循环返回节点数也为4,但其入口至第一个循环返回节点之间有代码,所以,Proc_5按最小拆分数量拆分为5个线程。 线程号变量tProc_n是系统中实现线程调度、在各相关线程间建立联系的核心。按“前向分支”原则进行线程拆分时,凡是遇到构成循环的“反向”分支时,就将该分支转向当前线程的出口,并在出口前为所在进程的线程号变量赋一新值指向要转去的线程。如果所要转去的线程与当前所在线程一致时,线程号变量赋值可以省略。 在按“前向分支”原则设计的线程中,“结构上”的循环可以完全消除,但进程设计中“逻辑上”的循环仍然是存在的,否则进程的原有功能将不能正确地实现。事实上,线程号变量中包含有“逻辑循环”的信息。只要在主循环中按图4的方法设度各线程就可以实现进程的“逻辑循环”。 为实现中断定时,Proc_5中设置了两个定时计数器cTimerAct_1和cTimerAct_2(以下称之为“动作定时器”),在启动定时器设置好其初值,由一个基础定时中断程序按一定的时间间隔(本例为1ms)减1。当动作定时器减为0时表示定时结束。 对于继续运行的进程(如Proc_5),结束任务时应将线程号为量指向任意一个不用的空线程。为统一和方便起见,本文约定所有进程的0号线程均为空线程,进程结束时线程号变量应置为0。 3 总体模型 综上所述,一个完整的、严格按“前向分支”原则进行线程拆分和进程调度的多任务系统模型可以归纳为图5所示的结构。该模型由三部分构成:主循环、分属于不同进程的“前向分支”的连程以及一个基础定时中断程序。该模型结构最大的特点是:除了主循环中最后一个回跳以外,其它任何地方都不存在循环结构。换言之,系统中所有的循环“反向”转跳,都被归并成了主循环中的一个回跳。这样的结构能使主循环在各进程间快速地切换,有利于提高CPU的利用率,改善系统的响应,使得各进程能够得到及时、均匀、公平的服务。同时,基础定时中断程序也完全是“前向分支”结构,有利于减少对CPU的占用。 考虑到各进程对响应时间和服务频度的不同要求,在该模型中设置了对各进程进行定时同步的功能。在基础定时中断服务程序中增加了同步定时器cTimerSyn_i和同步定时标志fTimerSyn_i。同步定时器和动作定时器构成了基础定时中断服务程序的主体。 基础定时中断的中断间隔时间按所有定时任务的最大公约数来选取,所选取中断间隔时间越大,对CPU的占用越少,越有利于系统效率的提高。 进程定时同步的本质是为了不同响应时间需求的任务安排不同的服务频度。降低低优先级任务的服务频度相当于提高了高优先级任务的服务频度。在很多情况下,这样的优先级处理已令人满意。有一类进程出于功能(而不一定是优先级)的需要,也必须进行定时同步。 如前所述,严格按照“前向分支”原则拆分线程是,拆分数量不应上于时程中的循环返回节点数Nback和Nback+1。这是拆分线程时重要的参考依据。但是,在实际应用中,并不一定非要将线程中的循环彻底消除,应当根据具体情况和实际需求灵活掌握。 如果拆分粒度过细(即线程拆分数量过多),虽然对提高系统的响应速度有帮助,但由于进程切换过于频繁,进程切换所需的额外开销会导致系统效率下降(即有效的CPU机时占CPU总机时的比例下降)。粒度越细,这种情况也就越严重。另外,粒度越细,源程序和程序文档的可读性越差,这程序的调试和维护以及文档的维护带来困难。因此,在能够保证系统的响应速度和调度的均匀性等前提之下,拆分粒度倾向于粗一些。在多数情况下,倾向于将次数不确定的等待循环、较为耗时的循环和较长的纯延时拆分为线程。而那些循环数确定且不太耗时的循环则建议保留。在这种情况下,线程拆分数小于Nback或Nback+1。 实时系统要求系统能够对输入做出快速的反应和处理。但是,“实时”只是一个相对的概念,响应时间快慢实际上是衡量一个系统是否“实时”的重要指标。由图5可以看出,对于本文所介绍的模型来说,由于进程都是确定的,响应时间可以大致按以下方法估算:各地程中最耗时线程的运行时间之和就是最不利的响应时间,平均响应时间应等于各进程中线程平均运行时间之和的二分之一。根据以上估算,还可以大
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
