如果我的调度策略是 SCHED_OTHER,使用 setpriority() 是不是有任何影响

Posted

技术标签:

【中文标题】如果我的调度策略是 SCHED_OTHER,使用 setpriority() 是不是有任何影响【英文标题】:Does using setpriority() have any affect if my scheduling policy is SCHED_OTHER如果我的调度策略是 SCHED_OTHER,使用 setpriority() 是否有任何影响 【发布时间】:2015-09-22 14:32:37 【问题描述】:

我的日程安排政策是 SCHED_OTHER。使用 setpriority() 更改 nice 值是否有任何影响。 当我使用它时,我看不出有什么不同。

【问题讨论】:

【参考方案1】: 答案是不。在这种情况下,设置优先级不应影响进程。根据文档: http://linux.die.net/man/3/setpriority > 任何使用 SCHED_FIFO 或 SCHED_RR 的进程或线程都应不受调用 setpriority() 的影响。这不被视为错误。随后恢复为 SCHED_OTHER 的进程不需要其优先级受到这种 setpriority() 调用的影响。

很抱歉,请仔细阅读http://man7.org/linux/man-pages/man7/sched.7.html

SCHED_OTHER:默认 Linux 分时调度 SCHED_OTHER 只能用于静态优先级 0。SCHED_OTHER 是 适用于所有人的标准 Linux 分时调度程序 不需要特殊实时机制的线程。这 要运行的线程是从基于 a 的静态优先级 0 列表中选择的 仅在此列表内确定的动态优先级。这 动态优先级基于 nice 值(由 nice(2) 设置, setpriority(2) 或 sched_setattr(2)) 并且每次都增加 量子线程已准备好运行,但拒绝运行 调度器。这确保了所有 SCHED_OTHER 线程之间的公平进展。

因此,线程的动态优先级会受到 setpriority 调用的影响,并且会导致调度发生变化(取决于调用中设置的新优先级值)。

【讨论】:

感谢您的回答,有什么办法可以阻止进程在给定时间点占用总 CPU。请注意,我无法更改为其他调度方法。 为了让一个进程占用更少的 CPU,你必须通过使用 nice 或 setpriority 来增加它的 nice(更高的 nice 值 -> 低优先级)值。 我已经使用 setpriority(19) 完成了,但它不影响进程 CPU 使用率。在某一时刻,我的进程通过递归函数调用,CPU 使用率达到 95%。所以我在调用递归函数之前增加了 nice 值。但是,这似乎不起作用。 您是否有其他进程以相同的优先级同时运行并且没有获得 CPU?【参考方案2】:

您还可以使用 nice() 降低动态优先级。

试一试(9)。

    #include <unistd.h>
    int nice(int inc);  // inc = increase, added to the current nice value

【讨论】:

以上是关于如果我的调度策略是 SCHED_OTHER,使用 setpriority() 是不是有任何影响的主要内容,如果未能解决你的问题,请参考以下文章

Linux 线程调度与优先级

Linux SCHED_OTHER,SCHED_FIFO和SCHED_RR - 差异

Linux 进程调度

linux进程调度的三种策略是啥?

进程优先级与调度策略

浅析Linux下进程的调度策略与优先级