2010-09-06 98 views
43

我在Linux中使用pthread。我想通过设置参数sched_param.priority来提高线程优先级。但是,我无法从网络中找到有关我可以设置的线程优先级范围或有关线程优先级描述的更多信息。如何增加pthread中的线程优先级?

此外,我想知道相对线程优先级,因为我不想将线程优先级设置得太高,导致操作系统停止。有人可以帮助我吗?

回答

48

默认的Linux调度策略是SCHED_OTHER,它们没有优先选择,而是在策略内部调整nice级别。

你不得不改变使用功能pthread_setschedparam另一调度策略(见man sched_setscheduler

'正常' 的调度策略:(从sched_setscheduler(2)

SCHED_OTHER the standard round-robin time-sharing policy; 
    SCHED_BATCH for "batch" style execution of processes; and 
    SCHED_IDLE for running very low priority background jobs. 

实时调度策略:

SCHED_FIFO a first-in, first-out policy; and 
    SCHED_RR  a round-robin policy. 

在你的情况下,也许你可以使用SCHED_BATCH,因为这不需要root权限。

警告:实时调度策略的错误使用可能会挂起您的系统。这就是为什么你需要root权限来执行这种操作。

只是为了确保您的机器能够做什么,您可以使用 util-linux包装中的chrt工具。
作为一个例子:

$ chrt -m 
SCHED_OTHER min/max priority : 0/0 
SCHED_FIFO min/max priority  : 1/99 
SCHED_RR min/max priority  : 1/99 
SCHED_BATCH min/max priority : 0/0 
SCHED_IDLE min/max priority  : 0/0 

一个办法浪费更短的时间(这是我经常使用):

alias batchmake='time chrt --batch 0 make --silent' 

虽然具有用户权限住,这推动了make 15%(在我案件)。

编辑:引入niceSCHED_BATCHSCHED_IDLEchrt工具。为了准确! :)

+0

re:'SCHED_OTHER',这个不完全正确,因为好的等级仍然有效。 – Hasturkun 2010-09-07 22:55:30

+0

@Hasturkun:你说的没错,就是对调度程序的建议(不是调度程序的优先级!)。感谢准确! – levif 2010-09-08 08:40:29

+0

您实际上并不需要root权限,只需要设置rlimits,以便允许您设置的最大值> 0 – Spudd86 2010-11-22 20:05:32

23

POSIX定义了一个查询,因此您可以询问OS的有效范围的优先级。

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

不要指望提出优先呛机器。事实上,除非您已经使用100%的CPU周期,否则不要指望它做任何事情。如果查询告诉您没有高于默认值的优先级,请不要感到惊讶。

+2

+1好小费...... – 2011-10-19 13:36:53

22

从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'具有与优先级类似的非常强大的效果,因此您可以非常多地互换使用它。为了增加您的线程安排的频率,您希望降低您的'不错'价值。这需要CAP_SYS_NICE能力(通常为根,尽管不一定,请参阅http://man7.org/linux/man-pages/man7/capabilities.7.htmlhttp://man7.org/linux/man-pages/man3/cap_set_proc.3.html)。

事实上SCHED_BATCH是专为相反情况下,以什么样的提问要求:它是专为CPU密集型的,长期运行的作业,可以用较低的优先生活。它告诉调度器略微惩罚线程的唤醒优先级。

同样回答之前的评论之一(我还没有足够的声望来回应评论 - 对这个答案的一些upvotes会帮助:))。是的坏消息是,POSIX.1规范说'好'会影响进程,而不是单个线程。好消息是,Linux线程实现(NPTL和原始Linux线程)破坏了规范并允许它影响单个线程。我觉得这很有趣,通常在手册页的“BUGS”部分中提到。我会说这个bug是在POSIX.1规范中,它应该允许这种行为,而不是在规范中被迫提供它的实现中,并且是在故意和故意的情况下进行的。换句话说 - 不是一个错误。

这其中大部分是章附表(7)手册页(由于某种原因,是不是我的Fedora 20系统上发布)上详细: http://man7.org/linux/man-pages/man7/sched.7.html

如果你真的想影响sched_priority你可以看看实时策略,如SCHED_RR)。

+0

什么是“当前的NPTL线程实现”?我需要一些东西来比较遗留目标上'getconf'的输出。 – jhfrontz 2015-11-20 17:41:40

+3

NTPL(原生POSIX线程库)是当前Linux线程实现的调用对象。它不同于使用多个进程来模拟多线程行为的原始线程实现。 NTPL是在Linux 2.6中引入的。更多细节和历史记录在这里:https://en.m.wikipedia。组织/维基/ Native_POSIX_Thread_Library – BobDoolittle 2015-11-21 19:31:45