红联Linux门户
Linux帮助

Linux任务调度策略

发布时间:2015-11-27 22:03:12来源:linux网站作者:mtofum

linux内核的三种调度方法

SCHED_OTHER 分时调度策略
SCHED_FIFO实时调度策略,先到先服务
SCHED_RR实时调度策略,时间片轮转


当系统中只有三种调度方式中的一种时

所有任务都采用linux分时调度策略时(SCHED_OTHER)
创建任务指定采用分时调度策略,并指定优先级nice值(-20~19)。
将根据每个任务的nice值确定在cpu上的执行时间(counter)。
如果没有等待资源,则将该任务加入到就绪队列中。
调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算(counter+20-nice)结果,选择计算结果最大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。
此时调度程序重复上面计算过程,转到第4步。
当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。


所有任务都采用FIFO时

创建进程时指定采用FIFO,并设置实时优先级rt_priority(1-99)。
如果没有等待资源,则将该任务加入到就绪队列中。
调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu,该FIFO任务将一直占有cpu直到有优先级更高的任务就绪(即使优先级相同也不行)或者主动放弃(等待资源)。相同优先级的任务在队列中等待,按照队列顺序相继执行(非时间片轮转)。
调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等),则调度程序立即在当前任务堆栈中保存当前cpu寄存器的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到cpu,此时高优先级的任务开始运行。重复第3步。
如果当前任务因等待资源而主动放弃cpu使用权,则该任务将从就绪队列中删除,加入等待队列,此时重复第3步。


所有任务都采用RR调度策略时

创建任务时指定调度参数为RR,并设置任务的实时优先级和nice值(nice值将会转换为该任务的时间片的长度)。
如果没有等待资源,则将该任务加入到就绪队列中。
调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu。
如果就绪队列中的RR任务时间片为0,则会根据nice值设置该任务的时间片,同时将该任务放入就绪队列的末尾。重复步骤3(高优先级任务仍然被执行,低优先级继续等待,相同优先级时间片轮转)。
当前任务由于等待资源而主动退出cpu,则其加入等待队列中。重复步骤3。


系统中三种调度方式都有的情况下

RR调度和FIFO调度的进程属于实时进程,以分时调度的进程是非实时进程。
当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程。
RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RR是FIFO的一个延伸。FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中的位置决定的,这样导致一些不公正性(优先级是一样的,为什么要让你一直运行?),如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环执行,保证了公平。


总结

SCHD_OTHER为常规调度,可以随时被实时任务抢占。任务调度为按照优先级分配时间片大小的时间片轮转调度,并且被优先调度。nice值确定优先级大小(即分配的时间片大小)。优先级显示为0,没有实际意义。nice值大小:-20~19 (数值越小,分配的时间片越多)
SCHD_FIFO为实时任务,可以随时抢占OTHER任务。任务调度为类似UCOS II的方式。高优先级抢占低优先级,同样优先级按队列排队执行。优先级大小范围(1~99)。
SCHD_RR也为实时任务,可以随时抢占OTHER任务。任务调度为类似UCOS III的方式。高优先级抢占低优先级,相同优先级时间片轮转。nice值设置分配到的时间片的大小。


Linux下任务调度的crond常驻命令:http://www.linuxdiyf.com/linux/4843.html

Linux任务调度crontab时间规则介绍:http://www.linuxdiyf.com/linux/4596.html

Linux中的定时任务调度—crontab命令:http://www.linuxdiyf.com/linux/2651.html