linux钟判断一行实现累加,基于RT-Linux的EDF动态调度算法的实现(2009-2)

作者:沈阳工业大学信息科学与工程学院 王溪波 刘晓帆

RT-Linux(Realtime-Linux)作为一个嵌入式硬实时操作系统,到目前为止,已经成功地广泛应用于航天飞机的空间数据采集、科学仪器测控和电影特技图像等领域。RT-Linux是由Victor

Yodaiken提出的设计思想,其采用双内核机制,在Linux内核基础上增加一个可抢先的实时内核。RT-Linux3.2内核调度是可抢占式的静态固定优先级调度,在系统运行前,静态地为每个任务分配唯一的优先级,在系统运行过程中,总是选择优先级最高且已经就绪的任务,直到任务被挂起,或者有更高优先级的就绪任务到来。由于RT-Linux是按静态的固定优先级方式调度,这在具体应用中会限制任务调度的灵活性,不能真实反映任务优先级在任务运行过程中的变化,而动态调度就能根据实际需求随时调整调度任务顺序,提高系统运行效率。因此,将EDF(最早截止期优先)动态调度算法嵌入到RT-Linux中,实现RT-Linux上的动态调度。

1. EDF调度算法描述

动态调度算法是根据任务的资源需求来动态地分配任务的优先级,它是在运行期间决定选择哪个就绪任务来运行的。EDF是典型的动态调度算法,其核心思想是:在任何时刻,具有最早截止期的任务优先级最高。该算法在每个时刻都要确定下个时刻系统中哪个任务的截止期最小,从而决定系统在下个时刻应该调度哪个任务。

对于含有n个任务的任务集,EDF算法可调度的条件是处理器的利用率满足下面公式的条件:

由此可知,EDF调度算法最大的优势在于,对于任何给定的任务集,只要处理器的利用率不超过100%,就能够保证它的可调度性。

2. 调度算法的设计和实现

分析RT-Linux3.2调度算法,了解到原静态算法是由三个重要的结构体和一个rtl_schedule()函数组成,它们控制着整个算法的调度核心。本文修改主要针对这三个结构体增加成员变量和函数接口。

在rtl_sched_param结构体里面增加成员变量如下:

struct rtl_sched_param

hrtime_t sched_runtime; //线程的运行时间

hrtime_t switchOutTime; //任务切出CPU时刻

hrtime_t switchInTime; //任务切入出CPU时刻

hrtime_t lastRunTime; //任务上一次占用CPU的时间

hrtime_t allRunTime; //任务总运行时间

hrtime_t expectedRunTime; //任务的预计运行时间

连体对大底盘双塔楼结构的

动力特性和地震响应的影响

湖南邵阳学院 宋娟

贺海斌  其中,switchOutTime表示任务切出CPU时刻,switchInTime表示任务切入CPU时刻。因此,任务一次运行占用的CPU时间lastRunTime

=switchOutTime-switchInTime,allRunTime表示任务的总运行时间,通过allRunTime+=lastRunTime,能计算出每个任务的总运行时间。增加的这些成员变量都是表示时间的,对rtl_schedule()函数的修改主要是获取几个时间点的问题,在rtl_schedule()中的切换新任务处,通过函数

gethrtime(sched->clock)

获取新任务切入时刻,同时获取原来任务的切出时刻,将原来任务的切出时刻与切入时刻相减便得到原来任务上一次占用CPU的执行时间,并将此执行时间累加到该任务的总运行时间上,即可得到该任务的总运行时间:

sched->rtl_current->sched_param.

lastRunTime=sched->rtl_current->sched_param.

switchOutTime-sched->rtl_current->sched_param.

switchInTime;//任务的一次执行时间

sched->rtl_current->sched_param.

allRunTime+=sched->rtl_current->sched_param.

lastRunTime;//一个任务的总共运行时间

由于每个任务都有自己的结构体,同时拥有自己的运行时间、周期、释放时间等成员变量,这样通过循环链表即可计算出所有任务对列中各个任务的运行时间。当任务的运行时间与预计运行时间相等时,即表示该任务完成一个周期的运行,从而计算任务下一次的释放时刻,通过公式resume_time+=period即可求得任务的下一次释放时刻。EDF算法比较的是任务的绝对时限,本文任务的绝对时限定义为:绝对时限=释放时间+相对时限,其中任务的相对时限取任务的周期,这样任务的相对时限和释放时间均为已知数据,两者相加即为任务的绝对时限。在搜索任务队列时,取绝对时限小的任务作为高优先级任务。

3. 调度算法的验证

本实验平台是基于linux-2.4.20内核的RT-Linux3.2实时操作平台,算法验证是在以下几个假设条件成立下验证的。

(1)进程切换(context switch)的时间忽略;

(2)进程间没有数据依赖;

(3)进程的执行时间是恒定的;

(4)所有进程的deadline都在它们周期的结束点上。

在已经配置好的RT-Linux3.2平台上,建立3个任务分别为T1=(100,20),T2=(150,50),T3=(250,100),其中第一个参数表示任务的周期,第二个参数表示任务的执行时间,初始时均处于就绪状态。在嵌入EDF算法的RT-Linux上三个任务的运行情况如图2所示。

实验结果表明:

在初始状态时,T1、T2和T3均处于就绪状态,根据绝对时限公式可以判断T1的时限低,故而T1的优先级高,先运行。当T1运行完毕,放弃CPU。在就绪任务中,T2时限低于T3,因此,T2运行。

在时刻t=100ms时,T1的下一个就绪时刻到来,此时,根据公式判断T1的绝对时限低于T3,因此,T1抢占正在运行的T3。当T1运行完毕,T3继续运行。

在时刻t=150ms时,T2再次就绪,但此时T2绝对时限高于T3的绝对时限,因此,T3不被T2抢占,T2处于等待状态。

在时刻t=190ms时,T3运行完毕,此时就绪任务T2运行。

在时刻t=200ms时,T1又到达就绪时刻,通过公式判断T1与T2的绝对时限相等,但由于T2正在运行,故而T1不抢占T2,T2继续运行。

在时刻t=240ms时,T2运行完毕,就绪任务T1开始运行,以下类推。

在每一个就绪时刻都要判断就绪任务的时限,时限低的任务优先级高。所实现的EDF算法能够按照时序图顺序调度任务。

4. 结论

本文将EDF算法嵌入到RT-Linux3.2中,将原调度方式从静态固定优先级改为动态调度。通过验证,本文所嵌入的EDF算法能够按照时序图分析情况运行,这说明嵌入的EDF算法在RT-Linux上运行成功。但算法每次调度判断都要搜索任务队列重新计算任务的优先级,这将会增大系统开销。如何尽量减小调度的开销,将是今后需要进一步研究的方向。□

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值