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 |
+--------------+
系统优先级示意图,优先级自下而上,有高到低
异常、中断、软中断、进程 优先级示意图
需要继续分析:
中断优先级;
软中断优先级;
任务优先级;
说明:中断是一种异常(或者说,中断使用异常机制实现),异常的发生不受关中断的影响。
Linux实时调度策略
最新推荐文章于 2024-03-23 16:36:30 发布