1、任务调度 大家都知道我们的操作系统可以隐蔽底层实现,为用户提供API接口来供我们的应用程序服务,同时操作系统可以管理多个任务实现CPU的最大利用率,然而对于RTOS提供的最主要功能就是任务的调度来管理多个任务。
2、"先来先服务调度"与“前后台架构” 先来先服务调度(FCFS: first come first service)该调度算法算是最简单的一种,先进入就绪的任务首先占用CPU被执行,而且是一种非抢占式的任务调度,非常类似于数据结构-队列的形式,一旦任务进入就绪状态便会进入FIFO就绪队列。 2)先来先服务VS前后台架构 区别与关联:
- 一般先来先服务调度都是通过任务主动休眠放弃CPU,然后从就绪队列取出新的任务进行执行,就绪FIFO里面的任务顺序是根据任务休眠时间结束的事件先后来进行排列的,如果我们能够控制FIFO中的任务排序便能够实现跟前后台顺序和分时轮询类似的效果。
- 然而对于前后台分时轮询架构其实和先进先服务调度还是存在一个优先级的概念在里面的,虽然说两者都不能实现任务上的抢占,不过对于分时轮询架构存在任务间的抢占,举个例子如下图所示:
3、时间片调度-(也叫RR调度)
解析一下:
- 我们可以通过上面的图看到时间片调度就是根据时间单元轮流切换执行时间,这样看来时间片的长度选择尤为关键,如果时间片过短,大部分的事件都浪费在了任务的切换上面,那么CPU的利用率较低;但是如果时间片时间过长又会导致该调度退化为类似于先进先服务调度模式,这样对于短任务的响应是大打折扣的。
- 所以时间片调度机制属于一种抢占式调度机制,如果有n个任务进行时间片调度,如果时间片的时间为t,那么每个任务得到执行的时间不会超过(n-1)t,一定要注意的是这里仅仅是得到执行,并不是执行结束,如果任务能够在一个时间片内执行完毕,则可以认为得到执行并执行完毕。
- 如果选择最优时间片呢?如果你想通过理论来进行计算的话就需要了解一下调度的性能指标比如完成时间,周转时间,带权时间,平均周转时间,平均带权周转时间等等,然后通过测试每个任务的执行时间来求出最优的时间片;不过在我们程序的运行中大部分运行时间都是动态的,且时间片的选择对我们的需求影响并不是特别大,只要不过分小或者过分大均合适,一般个人取值都是在任务切换时间的50~100倍之间进行取值,同时也会根据实际调试情况进行调整。
通过上面的知识介绍大家应该明白前后台分时轮询和时间片的差异和联系了吧,其实叫做什么名字作者觉得并不是那么重要,关键是大家要达成共识,并且了解其中的区别,对于任务调度算法其实还有很多,大家平时可以对目前的RTOS进行调度机制的改造,并且通过对应的测试指标获得各个算法的性能。
|