一、内容提要:
OSEK-OS有三种调度策略,不同的调度策略影响任务调度的响应时间,任务上下文切换的时间和内存消耗。
1. 抢占式调度
低优先级任务在运行的任何时刻,可以被就绪的高优先级任务抢占。
2. 不可抢占式调度
低优先级任务在运行时,即使有高优先级任务就绪,也不能被抢占运行。
3. 混合式调度
OSEK-OS可以实现两种调度方式并存,不但不会带来冲突,而且还能达到一些效果。
假设有三个任务
任务名 | 优先级 | 抢占性 |
TASK1 | 1 | 可抢 |
TASK2 | 2 | 不可抢 |
TASK3 | 3 | 可抢 |
TASK2是不可抢占式,表现为:
1. TASK2运行时,即使TASK3就绪,TASK3也不能抢占TASK2。
2. TASK3运行式,因为优先级比TASK2高,也不会被TASK2抢。
这样TASK2和TASK3表现为互斥,和同优先级效果一样。TASK3的实际优先级可以定义为2
The definition of a non preemptable task makes sense in a full preemptive operating system
- if the execution time of the task is in the same magnitude of the time of a task switch,
- if RAM is to be used economically to provide space for saving the task context, or
- if the task shall not be preempted.
注解:
1. 如果任务运行和任务切换的时间在同一个量级。通常任务切换的时间也很短,这意思就是说既然TASK2的实际运行时间很短,就没有必要在运行时被TASK3抢占,索性让他一次运行完。虽然任务响应推迟了一个任务切换的时间,但是也节省了一次任务切换的时间。
2. 如果TASK3要抢占TASK2运行,那么TASK3的栈就要压到TASK2之上,使栈空间增大。如果TASK3不可抢占TASK2,那么TASK2运行完后释放栈空间,TASK3重新申请栈。
3. 这个任务的确不应该被中止。
二、混合式调度的特殊用法
如图,设Task1是不可抢占式任务,在Task1代码的X处主动调用Schedule(),因为Task2的优先级要高,会触发Task2抢占Task1,这非常有用。
这意味着软件开发人员可以主动控制不可抢占式任务的动态优先级。
譬如:在Task1的前半段访问一个资源,它的实际优先级最高。在资源访问完毕后调用Schedule(),实际优先级降低。
三、总结:
1. 抢占式调度保证高优先级任务被及时响应,但是增加任务上下文切换的时间和内存消耗。
2. 不可抢占式调度牺牲了一点任务响应的及时性,但是节省了任务上下文切换的时间和内存消耗。
3. 设计任务优先级时要根据运行时间和资源访问情况综合考量。
4. 在不可抢占式任务中主动调用Schedule(),使任务调度立即生效。
5. 仔细的设计操作系统,合作模式的系统可以在任务响应时间和节省内存及时间上获取折中的效果。
四、特别说明:
无论哪一种调度策略,当中断发生时,任务都会被抢占运行。