这是来自 sched_setscheduler(2) - Linux 手册页:
“在实时策略之一(SCHED_FIFO、SCHED_RR)下调度的进程的 sched_priority 值在 1(低)到 99(高)范围内。”
“SCHED_FIFO 进程会一直运行,直到它被 I/O 请求阻止、被更高优先级的进程抢占,或者调用 sched_yield(2)。”
我有以下代码:
struct sched_param sp;
memset( &sp, 0, sizeof(sp) );
sp.sched_priority = 99;
sched_setscheduler( 0, SCHED_FIFO, &sp );
现在该进程应该以尽可能高的优先级运行(99)
并且永远不应该被抢占。
因此,当它开始运行以下循环时:
while ( 1 ) ;
它应该永远运行,并且不允许任何其他进程运行。
尽管如此,当我启动这样一个进程时,我也可以使用其他进程。其他进程运行速度慢得多,但它们确实运行。
我的处理器有 2 个核心,因此我启动了该进程的两个副本。
两个核心的使用率跃升至 97%-100%。两个进程都在运行无限循环。
我仍然可以在 shell 中输入命令并观察它们的输出。我也可以使用 GUI 程序。
既然优先级为 99 的 SCHED_FIFO 进程永远不应该被抢占,这怎么可能呢?
如果您没有更改任何其他策略设置,那么您可能会受到限制。看这篇内容丰富的文章几年前添加到调度程序的实时限制。
其要点是:非特权用户可以使用SCHED_FIFO
并尝试浸泡CPU,但RT限制代码会强制一点点SCHED_OTHER
无论如何,这样你就不会楔入系统。来自文章:
自 2.6.25 起发布的内核已设置 rt_bandwidth 值
默认组为每 1.0 秒 0.95。换句话说,
默认情况下,组调度程序配置为保留 5% 的 CPU
对于非 SCHED_FIFO 任务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)