Chinaunix首页 | 论坛 | 博客
  • 博客访问: 350574
  • 博文数量: 106
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-10 08:32
文章分类

全部博文(106)

文章存档

2016年(11)

2015年(93)

2013年(2)

分类: LINUX

2015-08-17 09:22:31

实时系统的特点
2.1 时间约束性
实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。实时系统的任务具有一定的时间约束(截止时间),根据截止时间,实时系统的实时性分为“硬实时”和“软实时”。硬实时是指应用的时间需求能够得到完全满足,否则就造成重大安全事故。软实时是指某些应用虽然提出时间需求,但实时任务偶尔违反这种需求的时候对系统运行及环境不会造成严重影响。
2.2 可预测性
实时操作系统的重要特点是具有系统状态的可确定性,即系统能对运行情况的最好和最坏等的情况能做出精确的估计。可预测性是指系统能够对实时任务的执行时间进行判断,确定是否能够满足任务的时限要求。由于实时系统对时间约束要求的严格性,使可预测性成为实时系统的一项重要性能要求。除了要求硬件延迟的可预测性以外,还要求软件系统的可预测性,包括应用程序的响应时间是可预测的,即在有限的时间内完成必须的工作;以及操作系统的可预测性,即实时原语、调度函数等运行开销应该是有界的,以保证应用程序执行时间的有界性。换句话说,系统面对变化的负载(从最小到最坏的情况)时必须确定性地保证满足时间要求。注意,上述定义并未提到性能,原因是实时性与速度关系不大:它与可预见性有关。例如,使用快速的现代处理器时,Linux 可以提供 20 μ 微秒的典型中断响应,但有时候响应会变得很长。这是一个基本的问题:并不是 Linux 不够快或效率不够高,而是因为它不能提供确定性。
3、实时系统实时性能的指标

系统响应时间(System Response Time):系统发出处理要求到系统给出应答信号的时间。

任务换道时间(Context-Switching Time):是任务之间切换而使用的时间。

中断延迟(Interrupt Latency ):计算机接收到中断信号到操作系统作出响应,并完成换道转入中断服务程序的时间。


3.1. 中断时延
      中断时延就是从一个外部事件发生到相应的中断处理函数的第一条指令开始执行所需要的时间,很多实时任务是靠中断驱动的,而且中断时间必须在限定的时限内处理,否则将产生灾难性后果,因此中断时延对于实时系统来说,是一个非常重要的指标。虽然由于中断与cpu时钟是异步的,所以事件可能在无法预知的时刻到达,但是处理程序必须能够在事件发生后严格的时限内作出响应(系统响应时间),即使是在尖峰负荷下,也应如此(即实时操作系统中不能允许某一时刻系统资源的利用率达到或接近100%)。
3.2. 抢占时延
      有时也称为调度时延,抢占时延就是从一个外部事件发生到相应的处理该事件的任务的第一命令开始执行的时间。大多数实时系统都是处理一些周期性的或非周期性的复杂事件,事件产生的频度就确定了任务的执行时限,因此每次事件发生的时候,相应的处理任务必须及时响应处理,否则将无法满足时限。抢占时延就反映了系统的响应及时程度。
    
如果以上两个指标都是确定的,可预测的,那么就可以说操作系统就是实时的。
4、标准Linux内核影响系统实时性的主要因素
Linux在设计之初优先关注的是公平调度、资源共享和吞吐量最大化,并没有对实时性进行考虑,因此在实时性方面存在很多固有缺陷,不能完全满足嵌入式系统的需求。需要指出的是,在当前广泛运用高速高性能处理器的前提下,Linux实时性缺陷并不是指它不够快或者效率不够高,而是因为它不能提供确定性。标准Linux有几个机制严重地影响了其实时性能。
4.1. 中断具有最高优先级
在Linux系统中,中断(包括软中断)具有最高的优先级。无论任何时候,只要有中断产生,系统将立刻转而执行相应的中断处理函数(或是软中断)。只有当所有挂起的中断(以及软中断)处理完成后,系统才会继续执行当前的正常任务。因此在标准的Linux系统上,一个实时任务可能被大量的中断所打断,从而引入大量的延迟,实时任务可能因为相关中断的处理被阻塞,引入大量无法确定的延迟而根本不可能得到实时性保证。
4.2. 内核可抢占性不足
在Linux2.4和之前的版本中,内核是不可被抢占的。也就是说,当前任务如果运行在内核态,那么无论当前是否有优先级更高的任务需要运行,正在执行的任务也不能被抢占。因此,高优先级的任务需要等待正在执行的任务执行完内核态的操作返回用户态,或是等到当前任务因为需要某些条件而主动让出CPU时才能有机会执行。为了支持内核抢占,自愿抢占的实现方式被提了出来。然而这种实现方式只是在内核引入了一些可抢占点,并不是内核完全可抢占。自愿抢占加入可抢占点,实际上就是对调度函数的调用。只有在进入可抢占点的时候,内核才是可抢占的。这样虽然抢占时延有一定的改善,但是依然做不到即时调度的效果。从Linux2.6版本起,内核已经具备了一定的可抢占性,因而系统的实时性得到了加强。这种主动抢占的实现方式,除了部分不可抢占的区域,其余都可以实现任务抢占。这些不可抢占区域,包括由自旋锁(spinlock)保护的临界区(criticalsection),以及一些显示使用preempt_disable来抢占失效的临界区。这样,只要中断不发生在不可抢占区域,在中断处理程序执行完成之后,调度器都会正常工作,激活抢占与自愿抢占相比,内核存在了更多的可抢占区域。相对的,抢占时延也就会低很多。所以,无论是自愿抢占方式还是主动抢占内核,都不能实现内核的完全可抢占,从而完成消除不可抢占部分带来的延迟。但是可抢占内核已经带来了巨大的改进。
即使内核是可抢占的,Linux也不是在任何地方可以发生任务调度。在标准Linux系统中,对线程和进程的CPU占用采取了“公平”的调度策略。例如,在中断上下文,一个中断处理函数可能唤醒了某一高优先级进程,但是该进程并不能立即运行,因为在中断上下文中不能发生调度,中断处理完后,CPU的主动权需要归还给原来被中断了的任务,直到该任务主动放弃CPU后才有机会调度刚才中断唤醒的那个高优先级进程。因此,任务调度也存在可抢占性问题,从而导致抢占延迟具有非常大的不确定性和不可预测性。
4.3. 自旋锁(spinlock)
自旋锁是一种数据同步机制,用于在可抢占内核和SMP情况下对共享资源进行保护和同步。通常,一个任务对于共享资源的占用时间是非常短暂的。如果有两个任务竞争同一个共享的资源的时候,得不到自愿的任务将会自旋来等待另一个任务释放相关资源。虽然这种锁机制非常高效,但是维持自旋锁的同事将失效抢占,这必定会带来更大的抢占时延。
4.4. 调度算法和调度点
在 Linux2.4版本和以前使用的是时间复杂度为O(n)的调度器,在SMP的情况下性能很低。因为所有的CPU都共享同一个任务链表,任何时刻都只有一个调度器在运行。在这种情况下,抢占时延跟当前系统的任务数密切相关,因而具有相当大的不确定性和不可预测性。在Linux 2.6版本及以后的版本中,引入了时间复杂度为O(1)的调度器,很好的解决了这些问题。但是所使用的调度器仍然相对比较原始,不够高 效,存在改进的空间 。 
除此之外,虽然Linux 2.6版本已经引入了可抢占内核,但是也不是任何地方都可以发生调度。例如在中断 上下文中,一个中断处理函数可能虽然唤醒了某一个优先级较高的进程,但是该进程并不能立刻执行。因 为在中断上下文中不能发生调度,只有当中断处理完了之后,并且当内核处理完所有挂起的软中断之后, 才有可能调度并执行刚唤醒的进程。在标准的Linux内核中,调度点(有意安排的执行任务调度的点)并不多。对Linux 2.4和2.6内核的测试结果表明,缺乏调度点是影响Linux实时性的一个重要因素。
4.5. 中断机制问题
在一些同步操作中,为了保护临界区资源,Linux使用了中断关闭指令。中断的关闭会增大中断时延,损害系统的实时性。此外,Linux内核将中断服务分成了两个部分:上半部分和下半部分。上半部分处理需要及时响应的任务,如与硬件相关的寄存器操作,而下半部分处理相对不
阅读(1791) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~