为分析影响Linux实时性构建的任务响应模型

为分析影响Linux实时性构建的任务响应模型

在介绍影响linux实时性任务调度执行之前,我们先来看下一个简化的Linux任务响应模型,了解下哪些因素会影响Linux的实时性。这些有利于理解后面说道的实时性改进。

Linux实时化的最终目标是要满足实时任务快速的有期限响应时间要求。一个实时任务的一次运行(实时任务一般都是周期性的)是由外部中断触发的(比如每隔1ms要发送一帧GOOSE报文),当中断产生的时候,CPU接收到中断信号,如果CPU当前允许中断(如果不允许,则直到允许中断后才处理中断),保存当前运行的任务跳转到中断服务程序,执行中断服务程序(在中断服务程序中唤醒实时任务),然后执行中断返回,如果当前系统允许进行进程调度,则调度实时任务开始运行(假定这个实时任务的优先级最高)。为了更好的理解Linux实时化的基本原理,我们有必要对Linux的任务响应模型作详细的分析,如下图1所示,给出了一个简化的Linux任务响应模型。

 

 

为分析影响Linux实时性构建的任务响应模型_第1张图片 

1 Linux任务响应模型(时间段长度不是按比例绘制的)

如图所示任务响应模型中,任务2(可以看成Linux内的软实时任务)的优先级高于任务1t0时刻任务1在运行,而任务2处于睡眠状态,等待中断唤醒;t1时刻任务1请求系统服务完成某些操作(例如通过read()文件接口读取磁盘上的文件等),此时开始,系统在内核态运行;在t2时刻,产生一个中断(在这个中断的中断服务程序中唤醒任务2),但可能由于系统在内核态进行某些操作不希望被中断, CPU的处理中断被禁止,那么这个中断信号没有立刻得到响应,而是继续在内核态执行系统服务;在t3时刻,内核态代码使能中断响应(Linux内核退出临界区),这个时候CPU开始响应在t2时刻产生的中断,并从t4时刻开始执行中断服务程序;当中断服务程序执行完之后(在这个中断服务程序中唤醒了任务2),返回被中断的代码,由于此时系统运行在内核态(执行任务1的系统服务请求),任务2无法抢占任务1的控制权,所以执行任务1的系统服务请求;在t7时刻,由于任务1的系统调用完成返回或者在执行系统服务的过程中主动请求任务调度,系统开始进行任务调度,并在时刻t8运行任务2(假定此时任务2是系统内最高优先级的任务)。

其中,从时刻t2至时刻t8这个时间段,就是我们所说的任务响应延迟时间(Task Response Time);从图可以看出,任务的响应延迟时间可以分为以下几个部分:

1.1中断潜伏期(Interrupt Latency)或者说中断延迟,这个指从中断产生到CPU开始响应中断的时间段,也就是图中从t2t3的时间段。中断潜伏期是由于内核在进入临界区前关闭CPU的中断响应所引起的,在这个时间段内,虽然外部设备使CPU的中断请求线有效,但CPU并不立刻响应中断,而是继续执行临界区的内核代码,直至退出临界区、使能中断请求,才开始进行中断的响应。当然,还需要注意的一点是,中断潜伏期实际上包含了硬件所产生的中断延迟时间,我们一般所研究的是如何最大限度的减少软件所造成的延迟时间,所以,如果没有特别说明,我们是不考虑硬件所产生的延迟(但实际上,在工程应用中,当经过软件的优化还不能满足系统实时性的要求时,唯一的办法就只有提高硬件的处理速度了)。(这可以通过操作系统的实现来进行改进)。

12中断分发阶段(中断准备阶段),这个指从CPU开始响应中断请求到开始执行中断服务程序之间的时间段,也就是图中从t3t4的时间段。这个期间系统要做的主要操作包括查找中断号、保存寄存器、定位中断服务程序等。这个时间段的长度对于具体的平台来说,一般是确定性的,也就是说时间长度是固定的。另外,从中断产生到开始执行中断服务程序之间的时间段被称为中断响应延迟时间(Interrupt Response Time),对应于图中t2t4的时间段。

13中断服务阶段,这个指从系统开始执行中断服务程序到中断服务程序执行完的时间段,也就是图中t4t5的时间段。这个时间段的长度与具体的中断或者说具体的应用有关,也就是说,这个时间段的长度是可以控制的。(中断服务程序应尽量短小不能影响包含过多的任务内容,只负责任务唤醒)

14中断返回阶段,这个指从中断服务程序执行完到恢复被中断代码开始运行的时间段,也就是图中t5t6的时间段。这个期间系统要做的主要操作是恢复寄存器的值,这个时间段长度一般也是固定的。

15调度潜伏期(Schedule Latency)或者说调度延迟,这个指从系统需要进行进程调度(当前进程的进程结构中need_resched的值为1)到实际开始进行调度的时间段,也就是图中t6t7的时间段。由于Linux2.6内核中有些地方是不可以抢占的,当系统运行在内核空间中时,即使有更高优先级的进程需要运行,除非主动请求进行调度,否则高优先级的进程是无法抢占当前进程运行的;所以,只有等到低优先级进程的系统调用完成或主动请求调度的时候,才能进行进程的调度。(这可以通过操作系统的实现来进行改进)。

16进程调度时间,这个指从系统开始进行调度到最高优先级的进程开始被调度运行的时间段,也就是图中t7t8的时间段。在这个期间,系统主要是根据系统资源的利用情况、进程的优先级、进程的运行情况,选择合适的进程进行调度。(这可以通过操作系统的实现来进行改进)。

 

你可能感兴趣的:(为分析影响Linux实时性构建的任务响应模型)