嵌入式实时Linux的技术研究

欢迎进入IT技术社区论坛,与200万技术人员互动交流 >>进入

  (2)进程抢先调度

  在许多控制系统中,实时控制软件是非常简单的,可以直接写入中断处理程序中与一个特定的中断联系起来。还有一些就不那么简单了,必须开启专门的用户进程为它服务。

  这时当这个高优先级的进程提交时,如有其它进程正在运行,它就必须打断正在运行的进程。若正在运行的进程运行在用户态,系统一般允许它被打断且执行其它优先权高的进程,若正在运行的进程运行在系统态,则此时是否允许被打断决定了系统是抢先式的还是非抢先式的。

  Linux就是一个非抢先式的操作系统,在用户执行系统调用时,不允许其它进程的调度,这样就影响了系统的响应度。一个真正的抢先式的操作系统允许正在系统状态下的当前进程被打断,然后进程切换回来时还能继续从刚才的执行点继续下去。但某些关键部分的代码段。系统必须保证其原子性,并防止重入。通常有如下几种方法:

  在关键代码断前关闭中断,等其执行完毕之后再将中断打开; 设计一个信号量.在关键代码段之前加锁,在其后解锁;

  在系统代码中保证安全的地方加入切换进程的代码switch(),防止该进程长久占用CPU,允许调度其它进程; 在关键代码段加入一个switchaccept标志,开始该代码段时。将此标志置为否.离开时再置回原来的值.这样在执行该段代码时,即使进程调度器被激活,它也会先检查此标志。若为否,则返回,并不进行进程切换。

  (3)进程调度策略

  第三个影响系统响应速度的关键部分就是进程调度的策略。对于一个实时性能强的操作系统来说,系统必须规定不同进程的优先级,并把优先级作为唯一的进程选择的标准。Linux的后期版本参照Posixl.b标准,在某些方面已经具备了一些实时操作系统的特性。Linux有两种类型的进程:一般进程和实时进程,它可以通过sched_setscheduler系统调用设置实时进程。实时进程比所有一般进程的优先级高,Linux设置实对进程的权重为它的counter值加1000;设置一般进程的权重为counter。因此,实时进程总会被认为是最值得运行的进程。

  然而,Linux核心的设计主要集中在应用程序的吞吐量上。追求吞吐量的必然结果,就是Linux调度器运用一种”公平共享”的策略保证所有的进程得到平均的CPU资源。而且,Linux的进程调度器只是简单地将标有实时标志的进程的权重加1000,至于实时进程间的轻重缓急还没有周密的完整的设计。因此,Linux的进程调度器还远不能称作是一个真正的实时进程凋度器。

  4 拟采用的策略

  根据以上分析的特点,我们决定主要从以下4个方面来修改Linux的核心代码。

  (1)在内核中插入抢先点 由于Linux是一个非抢先式的操作系统。因此当一个实时进程提交时,很可能因为当前的进程正处于核心态不能被打断而不能得到及时的处理。因此有必要在Linux内核中插入抢先点,使实时进程得到处理。根据上一节分析的特点,太体有4种方法可供选择。权衡这4种方法的利弊,我们决定采用第4种方法,即在关键代码段加入一个switchaccept标志,开始该代码段时,将此标志置为否.离开时再置回原来的值。这种方法比采甩semaphore的好处是,如果采用许多种semaphore的话.要考虑是否会产生死锁的问题。比采用锁中断的好处是.将中断锁住将丢失中断,而这样不会。而以固定的周期加switch语句显然有失灵活性。这样.采用这种方法,需要我们分析Linux所有系统调用的代码,画出其结构流程图。分析出哪些部分是关键部分,也即不允许置入的部分。在关键代码前后更改switchaccept标志。这项工作比较艰巨。同时修改进程调度器,使其判断switchaccept标志来决定是否执行进程切换。

  (2)修改进程调度器Linux的进程调度器虽然已经具有一定的实时性能,但还远远达不到真正实时调度器的标准,因此需要修改其进程调度器,必要的话可让Linux运行在两种模式下,实时模式和分时模式。可设计一些相关的系统调用,并在实时进程提交时,将系统转化为实时模式,当实时进程结束时,再转化为分时模式。

  (3)Linux的中断管理根据前面分析过的,Linux的中断管理及时地将紧要的任务完成后,将其余不重要的缓慢的任务放置在任务队列中,等到系统空闲(cpu idle())或系统调用等返回时再完成这些任务,这样就提高了系统的响应速度,同时,Linux还支持中断嵌套。因此,不再对其作太大改动。

  (4)锁定内存 在本项目的规划中本打算实现Linux锁内存的功能,使优先权高的进程在内存中的数据不被换出,从而提高实时进程的运行速度。然而,在分析了Linux代码后,发现后来版本的Linux已通过系统调用sys mlock实现了此项功能。

  5 结束语

  采用上述方法修改了内核代码后,由于每个修改方案都是有一定的代价的,它在增加了系统响应速度的同时也在某种程度上降低了系统的整体效率,比如说将内核设置成可抢先的,在进程频繁的切换过程中也要消耗一定的cpu处理时间。因此,还需要对各种解决方案进行测试、比较。另外,为了减少嵌入式Linux自身的长度,在存储管理部分对虚拟内存也应作进一步的处理。

[1][2]

游手好闲会使人心智生锈

嵌入式实时Linux的技术研究

相关文章:

你感兴趣的文章:

标签云: