4.2. CPU 调度
调度程序负责保证系统中的 CPU 处于忙碌状态。Linux 调度程序采用调度策略,它可以决定合适以及在具体 CPU 核中线程运行的时间。
调度策略有两个主要分类:
- 实时策略
- SCHED_FIFO
- SCHED_RR
- 一般策略
- SCHED_OTHER
- SCHED_BATCH
- SCHED_IDLE
4.2.1. 实时调度策略
首先调度实时线程,所有实时线程调度完成后会调度一般线程。
实时策略用于必须无间断完成的关键时间任务。
SCHED_FIFO
- 这个策略也称作静态优先调度,因为它为每个线程规定固定的优先权(在 1 到 99 之间)。该调度程序根据优先权顺序扫描 SCHED_FIFO 线程列表,并调度准备好运行的最高优先权线程。这个线程会运行到它阻断、推出或者被更高的线程抢占准备运行的时候。即使是最低优先权的实时线程也会比非实时策略线程提前被调度。如果只有一个实时线程,则
SCHED_FIFO
优先权值就无所谓了。 SCHED_RR
SCHED_FIFO
策略的轮循变体。也会为SCHED_RR
线程提供 1-99 之间的固定优先权。但有相同优先权的线程使用特定仲裁或者时间片以轮循方式进行调度。sched_rr_get_interval(2)
系统调用所有时间片返回的数值,但用户无法设定时间片持续时间。这个策略在您需要以相同的优先权运行多个线程是很有帮助。
有关实时调度策略的规定的语义详情请参考系统界面 — 实时中的《IEEE 1003.1 POSIX 标准》,地址为 http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html。
定义线程优先权的最佳实践是从低开始,并只在识别了合法延迟时才增加优先权。实时线程不象一般线程那样是时间片。
SCHED_FIFO
线程只有在他们阻断、退出或者由更高优先权线程占先时才停止。因此不建议将优先权设定为 99。因为这样会将您的进程放到与迁移和 watchdog 线程相同的优先权等级。如果这些线程因为您的线程进入计算池而被阻断,则他们将无法运行。单处理机系统会在这种情况下平均分配锁定。
在 Linux 内核中,
SCHED_FIFO
策略包括一个带宽封顶机制。这样可以保护实时应用程序程序员不会受可能独占 CPU 的任务影响。这个机制可通过 /proc
文件系统参数进行调整:
/proc/sys/kernel/sched_rt_period_us
- 以毫秒为单位定义视为 100% CPU 带宽的时间段(‘us'是明文中与 'µs' 最接近的表示)。默认值为 1000000µs 或者 1 秒。
/proc/sys/kernel/sched_rt_runtime_us
- 以毫秒为单位定义用于运行实时线程的时间段(‘us'是明文中与 'µs' 最接近的表示)。默认值为 950000µs 或者 0.95 秒。