Linux实时调度策略

来源:互联网 发布:如何诊断网站seo 编辑:程序博客网 时间:2024/05/21 17:28

 Linux提供了两种实时调度策略: SCHED_FIFO和SCHED_RR。 而普通的、非实时的调度策略是SCHED_NORMAL。

SCHED_FIFO
----------------------------------------
SCHED_FIFO实现了一种简单的、先入先出的调度算法, 它不使用时间片。 SCHED_FIFO级的进程回比任何SCHED_NORMAL级的进程都先得到调度。 一旦一个SCHED_FIFO级进程处于可执行状态,就会一直执行,直到它自己阻塞或者显式地释放处理器为止;它不基于时间片,可以一直执行下去。只有较高优先级的SCHED_FIFO或者SCHED_RR任务才能抢占SCHED_FIFO任务。如果有两个或者更多的SCHED_FIFO级进程,它们会轮流执行,但是在它们愿意让出处理器时会再次让出。 只要有SCHED_FIFO级进程在执行,其他级别较低的进程就只能等待它结束后才有机会执行。

SCHED_RR
----------------------------------------
SCHED_RR与SCHED_FIFO大体相同,只是SCHED_RR级的进程在耗尽事先分配给它的时间片后就能再接着执行了。也就是说,SCHED_RR是带有时间片的SCHED_FIFO -- 这是一种实时轮流调度算法。当SCHED_RR任务耗尽它的时间片,在同一优先级的其他实时进程被轮流调度。时间片只能用来重新调度同一优先级的进程。对于SCHED_FIFO进程,高优先级总是立刻抢占地优先级,但是低优先级进程决不能抢占SCHED_RR任务,即使它的时间片耗尽。
这两种实时调度算法实现的都是静态优先级。内核不为实时进程计算动态优先级。这能保证给定优先级别的实时进程总能抢占优先级比它低的进程。
实时优先级范围从0到MAX_RT_PRIO-1。默认情况下,MAX_RT_PRIO为100 -- 所以默认的实时优先级范围从0到99。 SCHED_NORMAL级进程的nice值共享了这个取值空间;它的取值范围从MAX_RT_PRIO到(MAX_RT_PRIO+40)。 也就是说, 默认情况下,nice值从-20到+19直接对应的是从100到139的实时优先级范围。


实时进程           普通进程
0 ---------- 99 100 ---------- 139  

实时进程的优先级范围为0~99,其中99的优先级最高


     /|/ prio
      |           +
      |          /|
      |         / |
      |        /  |
      |       /   |
      |      /    |
      |     /     |
      |    /      |
      |   /       |
      |  /        |
      | /         |
      |/          |
      +-----------+-+
      |             |/
      |             | /
      |             |  /
      |             |   /
      |             |    /
      +-----------+-+-----+-----------------> prio value
      0          99 100   139 





+--------------+<-- priority low
|              |
|              |
|              | Process Context
|              |
|              |
| schedule()   |
+--------------+---
|              |
|              |
|              |
|              |
|              |Interrupt Context  
|              |  
| do_softirq() |
+--------------+
|              |
| do_IRQ()     |
+--------------+<--  priority high
|              |
|
Exception    |
+--------------+
系统优先级示意图,优先级自下而上,有高到低
异常、中断、软中断、进程 优先级示意图

需要继续分析:
中断优先级;
软中断优先级;
任务优先级;


说明:中断是一种异常(或者说,中断使用异常机制实现),异常的发生不受关中断的影响。