Linux实时调度与内存管理全解析
1. 实时调度策略
实时调度策略旨在实现确定性。实时调度器总是会运行优先级最高且准备好运行的实时线程,并且实时线程总是会抢占分时线程。选择实时调度策略而非分时调度策略,意味着你对线程的预期调度有深入了解,并希望覆盖调度器的内置假设。
实时调度策略主要有两种:
-SCHED_FIFO:这是一种运行至完成的算法。一旦线程开始运行,它将持续执行,直到被更高优先级的实时线程抢占、在系统调用中被阻塞或终止(完成)。
-SCHED_RR:这是一种轮询算法。如果同一优先级的线程超出其时间片(默认值为100毫秒),调度器将在这些线程之间循环调度。从Linux 3.9版本开始,可以通过/proc/sys/kernel/sched_rr_timeslice_ms来控制时间片的值。除了时间片机制,它的行为与SCHED_FIFO相同。
每个实时线程都有一个介于1到99之间的优先级,其中99为最高优先级。若要为线程赋予实时调度策略,需要CAP_SYS_NICE权限,默认情况下只有root用户拥有该权限。
实时调度存在一个问题,即某个线程可能会因计算密集而陷入死循环(通常是由于代码中的错误导致),这将阻止低优先级的实时线程和所有分时线程运行,使系统变得不稳定,甚至完全锁定。为避免这种情况,可以采取以下两种方法:
-预留CPU时间:从Linux 2.6.25版本开始,调度器默认会为非实时线程预留5%的CPU时间,以确保即使出现失控的实