为何创建带死循环的RT进程时我的RT Linux系统会出现冻结?
现象本质说明
你遇到的不是内核崩溃,是FULL PREEMPT模式下RT调度机制的正常行为导致的低优先级任务饥饿,表现为系统冻结。
具体原因分析
- RT-Preempt开启FULL PREEMPT后,
SCHED_FIFO调度类的进程优先级高于所有普通CFS调度进程、以及大部分低优先级内核线程。只要该类进程不主动让出CPU(无睡眠、阻塞、系统调用调度点、被更高优先级RT进程抢占),内核会永久让它占用绑定的CPU核心,不会强制调度切走。 - 你的第一个测试用例中,子进程绑定了CPU1、设置了高优先级
SCHED_FIFO策略,纯死循环没有任何让出CPU的逻辑,直接占满CPU1的所有运行时间,所有跑在CPU1上的普通系统服务、桌面进程等低优先级任务完全得不到调度,就会出现系统冻结的表象。 - 原生Ubuntu内核使用CFS公平调度,无论进程优先级高低,都会分配时间片,时间片用完后会强制调度切走,因此不会出现任务饿死、系统冻结的问题。
修改后恢复正常的原因
你调整后的死循环代码中添加了usleep(100)调用,该系统调用会让进程主动进入睡眠状态,让出CPU执行权,给低优先级任务留出了运行窗口,因此CPU占用率下降,系统不再出现冻结。
相关建议
- RT系统开发中,非独占CPU核心的高优先级RT进程禁止编写无任何调度点的纯死循环,否则必然导致绑定核心上的低优先级任务饿死。
- 如果业务需要独占某个CPU核心,可以通过内核启动参数
isolcpus隔离对应核心,避免系统默认把普通进程调度到该核心上,从根源避免系统冻结。 - 可检查内核配置项
CONFIG_RT_GROUP_SCHED是否开启,开启后可通过cgroup限制RT进程的CPU使用比例,避免占满整个核心。
内容的提问来源于stack exchange,提问作者panda
相关产品推荐
相关产品推荐

