如何在pthreads中增加线程优先级?

时间:2010-09-06 05:45:31

标签: c++ linux multithreading pthreads

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

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

3 个答案:

答案 0 :(得分:55)

默认的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权限才能执行此类操作的原因。

为确保机器的功能,您可以使用chrt工具 util-linux包。
作为一个例子:

$ 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工具。为了准确! :)

答案 1 :(得分:28)

levif(推荐SCHED_BATCH)的当前答案对于Linux上的当前NPTL线程实现是不正确的(您可以通过运行'getconf GNU_LIBPTHREAD_VERSION'来检查内核的实现。)

在今天的内核中,只有实时调度策略允许设置sched_priority - 对于非RT策略(SCHED_OTHER,SCHED_BATCH和SCHED_IDLE),它始终为0。您对非RT策略的唯一选择是设置“好”值,例如通过setpriority()。然而,通过设置'nice'并没有很好的期望确切的行为,并且至少在理论上它可以从内核版本到内核版本不同。对于当前的Linux内核,“nice”具有类似于优先级的非常强大的效果,因此您可以互换使用它。为了增加线程的调度频率,您希望降低您的'nice'值。这需要CAP_SYS_NICE功能(通常是root,但不一定,请参阅http://man7.org/linux/man-pages/man7/capabilities.7.htmlhttp://man7.org/linux/man-pages/man3/cap_set_proc.3.html)。

实际上,SCHED_BATCH是针对相反的案例而设计的,是提问者所要求的:它专为CPU密集型,长时间运行的作业而设计,可以使用 lower 优先级。它告诉调度程序略微惩罚线程的唤醒优先级。

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

大部分内容详见sched(7)手册页(由于某种原因,我的Fedora 20系统没有提供): http://man7.org/linux/man-pages/man7/sched.7.html

如果您真的想影响sched_priority,可以查看实时政策,例如SCHED_RR。

答案 2 :(得分:25)

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

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

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