3.4 实时调度
实时调度器的只要任务是满足所有实时任务的时间要求。有很多方法表示时间的约束和很多的调度策略[4]。不存在一个适合所有任务的调度策略。
在大多数实时系统中,调度器是由大的、复杂的代码块组成,它也不可能扩展到适用任何情况。用户只是通过调节参数来改变调度器的行为,往往这是不够的。一般调度器代码也比较慢。
在RTLinux中,允许用户编写自己的调度器代码。可以把它实现为一个可装载的内核模块。这就使得可以实验不同的调度策略和算法,以找到一个最适合自己应用的调度方式。
3.4.1 实现的调度器
迄今为止实现了两种调度器。一个是基于优先级的占先式调度器。调度策略如下所述。每个任务赋予一个唯一的优先级。假如有几个任务处于就绪状态,优先级最高的那个将运行。只要一个优先级更高的任务就绪,它就可以中断当前较低优先级任务的执行。每个任务假定它可以自由的放弃CPU。
这个调度器直接支持周期任务。每个任务的周期和开始时间是可以给定的。一个中断驱动的(非周期的)任务通过定义中断处理程序,然后通过中断处理程序来唤醒相应的任务。
根据每个任务的周期和它们的终止时间,很自然的我们可以根据速率单调调度算法(rate monotonic scheduling algorithm, RMS)[5]决定每个任务的优先级。根据这个算法,周期短的任务有高的优先级。对于有 个任务的实时调度来说,满足下面公式的实时任务将能够成功的调度,每个任务都不会超过它们的最终期限(deadline):
这里, 为任务 在每个周期的最长执行时间, 为任务 的周期。非周期任务将处理为周期任务,同样赋予一个优先级[5]。
调度器把Linux当作一个有最低优先级的任务。Linux只在没有实时任务运行时运行。为此,从Linux切换到实时任务时,软中断状态将被记录,而且禁止软中断。当切换回来时,软中断状态将恢复。
另外一个调度器是根据最早期限优先算法(Earliest Deadline First, EDF)实现的。在这个算法中没有静态的优先级。而是最靠近最终期限(deadline)的任务总是最先执行。
3.4.2 设计用户自己的调度器
RTLinux作为开放的系统,具有以下的优势方便用户设计自己的调度器,以实现自己特有的调度方式:
l 一个分时复用的基于优先级调度的内核;
l 有精确可靠的时间片划分;
l 精确的时钟控制原语;
l 快且可预测的中断响应和进程切换时间;
RTLinux的调度器在文件rtl_sched.c和rtl_schedule.h中定义,实时线程可以在创建时用函数pthread_attr_setschedparam设置或在运行中pthread_setchedparam改变其优先级。scheduler将系统的优先级设为-1,而所有实时线程的优先级大于0,从而保证实时线程优先执行。用户需要改动的是rtl_schedule(调度过程)函数;两个重要的数据结构:schedule_t和rtl_thread_struct;和任务队列task_queue *list,task_queue *destlist。
通过对以上的数据结构和调度过程的修改,用户可以自己实现特定的调度算法。
3.5 计时
精确的计时是正确的调度器操作是必须的。调度器常常要求在一个特定的时刻进行任务切换。计时的错误将引起背离计划的调度,导致任务释放抖动(task release jitter)[24]。在大多数的应用中任务释放抖动是不好的。要尽量减少它的影响。
低的时间精度一个原因是在操作系统中,使用周期的时钟中断。系统设计者必须在时钟中断处理函数开销与计时精度之间做一个折中[24]。有时候使用周期时钟并不能得到要求的计时器定时精度。
在Linux中也是一样。在IBM兼容的PC上,硬件定时器的时钟中断速率设定为大约100Hz左右。因此,任务可以达到10毫秒的精度。一些商业的操作系统,比如VxWorks、REAL/IX也是使用周期的时钟中断,尽管它们允许用户改变中断频率。
在RTLinux中,消除这个折中是在需要的时候才通过使用一个可编程间隔定时器来中断CPU。特别地,使Intel 8354定时器芯片工作在interrupt-on-terminal-count模式。使用这种模式,可以使中断调度得到1微秒左右的精度。这种方法的定时器精度高而系统开销是最小。
为Linux模拟了一个周期的中断。使用软中断是非常简单的:为了模拟一个中断要求,一个未处理的中断屏蔽位被设定。在下一个软中断返回时,或者软sti执行时,处理函数将被调用。
3.5.1 时间相关函数
时间相关的函数将在第四章介绍。
3.6 进程间通信
由于Linux内核任何时候都可能被实时任务占先,Linux线程不能安全地被实时任务调用。不管怎样,必须要有一些进程间通信(IPC)的机制。RTLinux提 上一页 [1] [2] [3] [4] 下一页 没有相关教程
|