levif的当前答案(建议SCHED_BATCH)对于Linux上的当前NPTL线程实现不正确(您可以通过运行'getconf GNU_LIBPTHREAD_VERSION'来检查内核具有哪种实现)。
在当今的内核中,仅实时调度策略允许设置sched_priority-对于非RT策略(SCHED_OTHER,SCHED_BATCH和SCHED_IDLE),该值始终为0。 对于非RT策略,您唯一的选择是设置“ nice”值,例如 通过setpriority()。 设置'nice'并不能很好地说明确切的行为,至少在理论上,它可能因内核版本而异。 对于当前的Linux内核,“ nice”具有非常强的效果,类似于优先级,因此您可以互换使用。 为了增加线程的调度频率,您想降低“ nice”值。 这需要CAP_SYS_NICE功能(通常不是root,虽然不是必需的,请参见[http://man7.org/linux/man-pages/man7/capabilities.7.html]和[http://man7.org/linux/man- pages / man3 / cap_set_proc.3.html)。]
实际上,SCHED_BATCH是为发问者所要求的相反情况而设计的:它是为CPU密集型,长时间运行的工作而设计的,这些工作可以具有较低的优先级。 它告诉调度程序稍微惩罚线程的唤醒优先级。
还要回答较早的评论之一(我还没有足够的声誉来回应这个评论-为此投票一些投票将有所帮助:))。 是的,坏消息是POSIX.1规范说“好的”影响进程,而不是单个线程。 好消息是,Linux线程实现(NPTL和原始Linux线程)都违反了规范,并使其影响单个线程。 我经常在手册页的“ BUGS”部分中指出这一点,这很有趣。 我要说的是,该错误是在POSIX.1规范中进行的,该错误应该允许这种行为发生,而不是在尽管有此规范的情况下被强迫提供该错误的实现,但该行为是有意和故意的。 换句话说-不是错误。
大部分内容在sched(7)手册页上(由于某些原因未在我的Fedora 20系统上提供):[http://man7.org/linux/man-pages/man7/sched.7.html]
如果您确实想影响sched_priority,则可以查看实时策略,例如SCHED_RR。