linux内核的调度策略

时间:2021-05-06 08:51:09


这是我对Linux的传统分时调度策略的总结:

分时进程静态优先级由nice决定;nice值将会转换为该任务的时间片的长度,nice越小,时间片越大nice可有nice()系统调用更改;动态优先级( 100 - 139 )是根据平均休眠时间来决定的;The dynamic priority is the number actually looked up by the scheduler when selecting the new process to run. dynamic priority = max (100, min ( static priority - bonus+ 5, 139)) bonus是对平均休眠时间的一个度量,bonus越大,说明休眠时间越长,动态优先级越小,被调度的几率越大;平均休眠时间的大小同时决定进程是交互进程还是批处理进程;同时,It should be noted that it is far easier for high priority than for low priority processes to become interactive.


--------------------------------------------下面转载自http://blog.chinaunix.net/uid-20797562-id-99305.html------------------------------------------------------------

linux内核的三种主要调度策略:

1SCHED_OTHER 分时调度策略

2SCHED_FIFO实时调度策略,先到先服务 

3. SCHED_RR实时调度策略,时间片轮转


实时进程将得到优先调用,实时进程根据实时优先级决定调度权值。

SHCED_RRSCHED_FIFO的不同点:

     当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。     SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。


SHCED_RRSCHED_FIFO相同点:

    RRFIFO都只用于实时任务。

    创建时优先级大于0(1-99)

    按照可抢占优先级调度算法进行。

    就绪态的实时任务立即抢占非实时任务。


所有任务都采用FIFO时:

1,创建进程时指定采FIFO,并设置实时优先rt_priority(1-99)

2,如果没有等待资源,则将该任务加入到就绪队列中。

3,调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu,该FIFO任务将一直占有cpu直到有优先级更高的任务就绪(即使优先级相同也不行)或者主动放弃(等待资源)

4,调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等),则调度程序立即在当前任务堆栈中保存当前cpu寄存器的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到cpu,此时高优先级的任务开始运行。重复第3步。

5,如果当前任务因等待资源而主动放弃cpu使用权,则该任务将从就绪队列中删除,加入等待队列,此时重复第3步。

 

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

1,创建任务时指定调度参数为RR,并设置任务的实时优先级和nice(nice值将会转换为该任务的时间片的长度)

2,如果没有等待资源,则将该任务加入到就绪队列中。

3,调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu

4,如果就绪队列中的RR任务时间片为0,则会根据nice值设置该任务的时间片,同时将该任务放入就绪队列的末尾。重复步骤3

5,当前任务由于等待资源而主动退出cpu,则其加入等待队列中。重复步骤3


所有任务都采用linux分时调度策略时:

1,创建任务指定采用分时调度策略,并指定优先级nice(-20~19)

2,将根据每个任务的nice值确定在cpu上的执行时间(counter)

3,如果没有等待资源,则将该任务加入到就绪队列中。

4,调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算权值(counter+20-nice)结果,选择计算结果最大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。

5,此时调度程序重复上面计算过程,转到第4步。

6,当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。

 

参考:

http://blog.chinaunix.net/uid-20797562-id-99305.html