【问题标题】:SCHED_FIFO process with priority of 99 gets preempted?优先级为 99 的 SCHED_FIFO 进程被抢占?
【发布时间】:2013-12-21 19:17:28
【问题描述】:

这是来自 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 进程,这怎么可能?

【问题讨论】:

    标签: linux scheduling


    【解决方案1】:

    如果您没有更改任何其他策略设置,那么您可能会受到限制。请参阅 this informative article 了解几年前添加到调度程序的实时限制。

    它的要点是:非特权用户可以使用SCHED_FIFO 并尝试浸泡CPU,但RT 限制代码无论如何都会强制使用SCHED_OTHER,因此您不会卡住系统。来自文章:

    自 2.6.25 起发布的内核已为 默认组为每 1.0 秒中的 0.95。换句话说, 默认情况下,组调度程序配置为保留 5% 的 CPU 对于非 SCHED_FIFO 任务。

    【讨论】:

    • 感谢您的回答。我以root身份运行该过程。我还找到了以下文件:/proc/sys/kernel/sched_rt_period_us 包含 1000000 和 /proc/sys/kernel/sched_rt_runtime_us 包含 950000。我将 1000000 写入 sched_rt_runtime_us,但它没有改变任何东西。 SCHED_FIFO 进程仍被抢占。
    • 那么,当你给它写 1000000 时,你有没有把它读回来并确保它改变了? (编辑:我在本地尝试过,它确实进行了适当的更改。)
    • 是的。它们现在都包含 1000000。
    • 好的,我查看了内核源代码,它应该允许您使用echo -1 > /proc/srs/kernel/sched_rt_runtime_us 设置-1。 sched_rt_global_constraints() 函数专门测试RUNTIME_INF,它被定义为~0ULL。 (链接:lxr.linux.no/#linux+v3.12.6/kernel/sched/core.c#L7021
    • 我重新启动了系统,现在我可以写 -1 而没有错误。以前它在 bash 中在发出 'echo' 或 'cat' 作为写入错误后报告。哇!现在一切正常!该进程似乎正在消耗 100% 的 CPU。我什至不能移动鼠标光标。谢谢! :)
    猜你喜欢
    • 2014-11-26
    • 2017-02-17
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2014-04-25
    • 2013-06-01
    • 2020-12-19
    • 1970-01-01
    相关资源
    最近更新 更多