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

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

另外,我想知道相对线程的优先级,因为我不想将线程优先级设置得太高而导致OS停止。 有人可以帮我吗?

默认的Linux调度策略是SCHED_OTHER ,它没有优先级select,而是在策略内部进行调整。

您必须使用函数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 

浪费更less时间的方法(我经常使用):

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

在保持用户权限的同时,这会make成本降低15%(就我而言)。

编辑:介绍niceSCHED_BATCHSCHED_IDLESCHED_IDLE工具。 为了准确! 🙂

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

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

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

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

在当今的内核中,只有实时调度策略允许设置sched_priority – 非RT策略(SCHED_OTHER,SCHED_BATCH和SCHED_IDLE)始终为0。 非RT策略的唯一select是通过setpriority()设置“nice”值。 然而,通过设置“nice”,没有确切的行为规范,至less理论上它可以从内核版本到内核版本有所不同。 对于目前的Linux内核来说,'nice'具有与优先级类似的非常强大的效果,所以你可以使用它几乎可以互换。 为了增加你的线程计划的频率,你想降低你的“好”的价值。 这需要CAP_SYS_NICE能力(通常是根,尽pipe不一定,请参阅http://man7.org/linux/man-pages/man7/capabilities.7.html和http://man7.org/linux/man-pages/man3 / cap_set_proc.3.html )。

实际上,SCHED_BATCH是针对提问者所要求的相反情况而devise的:它专为CPU密集型,长时间运行的作业而devise,可以以较低的优先级运行。 它告诉调度器略微惩罚线程的唤醒优先级。

也回答之前的评论之一(我还没有足够的声誉来回应评论 – 这个答案的一些upvotes会帮助:))。 是的坏消息是,POSIX.1规范说'好'会影响进程,而不是单个线程。 好消息是,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)。