Linux实时性

实时的关键在于保证完成时间,而不在于原始速度

实时的行为是一个软件问题

针对用户对超出时间限制所造成的影响的可接受程度,实时又可分为软实时和硬实时

linux作为实时系统的局限:内核可抢占性、进程调度方式、中断处理机制、时钟粒度等几个方面

 

存在的问题

进程调度

  1. Linux进程默认的调度策略为SCHED_OTHER,这种调度方式虽然可以让进程公平地使用CPU和其它资源,但是并不能保证对时间要求严格或者高优先级的进程将先于低优先级的执行。
  2. 将实时进程的调度策略设置为SCHED_FIFOSCHED_RR,似乎使得Linux系统具备根据进程优先级进行实时调度的能力。
  3. Linux系统在用户态支持可抢占调度策略,而在内核态却不完全支持抢占式调度策略。这样运行在Linux内核态的任务(包括系统调用和中断处理)是不能被其它优先级更高的任务所抢占的,由此引起优先级逆转问题。

内核抢占机制

  1. Linux的系统进程运行分为用户态和内核态两种模式。当进程运行在用户态时,具有高的优先级的进程可以抢占进程,可以较好地完成任务;但是当进程运行在内核态时,即使其他高优先级进程也不能抢占该进程。
  2. Linux2.6版本后的内核是抢占式的,三种模式
    • PREEMPT_NONE:没有强制性的抢占。整体的平均延时较低,但偶尔也会出现一些较长的延时。
    • PREEMPT_VOLUNTARY:降低延时的第一阶段。它会在内核代码的一些关键位置上放置额外的显示抢占点,以降低延时。
    • PREEMPT/PREEMPT_DESKTOP:这种模式使内核在任何地方都是可抢占的,临界区除外。实现软实时。

中断屏蔽(中断和中断处理程序

  中断处理时都会关闭中断,这样可以更快、更安全地完成自己的任务,但是在此期间,即使有更高优先级的实时进程发生中断,系统也无法响应,必须等到当前中断任务处理完毕。

  什么是中断?内核要对连接到计算机上的所有硬件设备进行管理,首先要能和它们互相通信。处理器的速度跟外围硬件设备的速度往往不在一个数量级上,提供一种机制,让硬件在需要的时候再向内核发出信号。这就是中断机制。中断本质上是一种特殊的电信号,由硬件设备生成,并直接送入中断控制器的输入引脚上,再由中断控制器向处理器发送相应的信号,处理器一经检测到此信号,便中断自己当前工作转而处理中断,最后由OS来负责处理新到来的数据。例如,CPU在忙着作自己的事情,这时候硬件(比如说键盘按了一下)触发了一个电信号,这个信号通过中断线到达中断控制器i8259A,i8259A接受到这个信号后,向CPU发送INT信号申请CPU来执行刚才的硬件操作,并且将中断类型号也发给CPU,此时CPU保存当前正在做的事情(REST指令把程序计数器PC中的下一条待执行的指令的内存地址保存到)的情景现场,然后去处理这个申请,根据中断类型号找到它的中断向量即中断程序在内存中的地址),然后去执行这段程序(这段程序已经写好,在内存中),执行完后再向i8259A发送一个INTA信号表示其已经处理完刚才的申请。此时CPU就可以继续做它刚才被打断做的事情了,将刚才保存的情景现场恢复出来,CPU继续执行接下来下面的程序。

 

时钟粒度粗糙(时钟

  1. 系统所能提供的最小时间间隔称为时钟粒度,时钟粒度与进程响应的延迟性是正比关系,即粒度越粗糙,延迟性越长。
  2. 同等硬件环境而言,较小的时间粒度会导致系统开销增大,降低整体吞吐率。
  3. 在嵌入式Linux系统中,为了提高整体吞吐率,时钟频率一般设置为100HZ或250HZ。 

虚拟内存管理

  Linux采用虚拟内存技术,进程可以运行在比实际空间大得多的虚拟空间中。在分时系统中,虚拟内存机制非常适用,然而对于实时系统这是难以忍受的,频繁的页面换进换出会使得系统进程运行无法在规定时间内完成。对于此问题,Linux系统提供内存锁定功能,以避免在实时处理中存储页被换出。

共享资源的互斥访问差异

  1. 多个任务互斥地访问同一共享资源时,需要防止数据遭到破坏,系统通常采用信号量机制解决互斥问题。
  2. 在采取基于优先级调度的实时系统中,信号量机制容易造成优先级倒置,即低优先级任务占用高优先级任务资源,导致高优先级任务无法运行。

解决方案

内核修改

  1. 实时内核补丁(www.kernel.org/pub/linux/kernel/projects/rt/),补丁添加了第4种抢占模式,称为PREEPT_RT(实时抢占)。
  2. 使用可抢占的互斥量来替代自旋锁
  3. 除了使用PREEMPT_DISABLE()保护的区域以外,内核中的所有地方都开启了非自愿式抢占(involuntary preemption)功能。这种模式能够显著降低抖动(延时的变化),并且使那些对延时要求很高的实时应用具有可预测的较低延时。 
  4. 通过修改Linux内核,难以保证实时进程的执行不会遭到非实时进程所进行的不可预测活动的干扰。

双内核

双内核法是在同一硬件平台上采用两个相互配合,共同工作的系统核心,通过在Linux系统的最底层增加一层实时核心来实现。其中的一个核心提供精确的实时多任务处理,另一个核心提供复杂的非实时通用功能。实质是把标准的Linux内核作为一个普通进程在另一个内核上运行。关键的改造部分是在Linux和中断控制器之间加一个中断控制的仿真层,成为其实时内核的一部分。该中断仿真机制提供了一个标志用来记录Linux的关开中断情况。一般只在修改核心数据结构关键代码时才关中断,所以其中断响应很小。

补丁:RTLinux/GPL、RTAI 和 Xenomai。RTLinux/GPL只允许以内核模块的形式提供实时应用;而RTAI和Xenomai支持在具有MMU保护的用户空间中执行实时程序。

posted @   celestially98  阅读(1093)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示