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

Ste*_*eng 56 c++ linux multithreading pthreads

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

另外,我想了解相对线程优先级,因为我不希望将线程优先级设置得太高并导致操作系统停止.有人可以帮我吗?

lev*_*vif 56

默认的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.
Run Code Online (Sandbox Code Playgroud)

实时调度策略:

   SCHED_FIFO    a first-in, first-out policy; and
   SCHED_RR      a round-robin policy.
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以使用,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
Run Code Online (Sandbox Code Playgroud)

一种方法来浪费时间少(这是我经常使用):

alias batchmake='time chrt --batch 0 make --silent'
Run Code Online (Sandbox Code Playgroud)

在保持用户权限的同时,这推动了make15%(在我的情况下).

编辑:引入nice,SCHED_BATCH,SCHED_IDLEchrt工具.为了准确!:)

  • @Spudd86:当然,可以调整系统文件`limits.conf`(在FC 上的/etc/security/ 中)以增加Hard 值,然后作为标准用户使用setrlimit()。在其他情况下,这对于实时音频混合是必不可少的。缺少这一点,我将进行编辑以修复。 (2认同)

Bob*_*tle 30

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功能(通常是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密集型,长时间运行的作业而设计,可以以较低的优先级生活.它告诉调度程序略微惩罚线程的唤醒优先级.

也回答之前的评论之一(我还没有足够的声誉来回应评论 - 这个答案的一些赞成将有助于:)).是坏消息是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).

  • NTPL(本机POSIX线程库)是当前Linux线程实现的调用.它与原始线程实现不同,后者使用多个进程来模拟多线程行为.NTPL是在Linux 2.6中引入的.更多细节和历史:https://en.m.wikipedia.org/wiki/Native_POSIX_Thread_Library (4认同)

Pot*_*ter 25

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

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

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