在Linux中哪个实时优先级是最高优先级


72

在Linux实时进程优先级范围为1至99的情况下,我不清楚哪个是最高优先级,即1或99。

“了解Linux内核”(O'Reilly)的7.2.2节说1是最高优先级,考虑到正常进程的静态优先级从100到139,其中100是最高优先级,这是有道理的:

“每个实时过程都与一个实时优先级相关联,该优先级的值范围从1(最高优先级)到99(最低优先级)。”

另一方面,sched_setscheduler手册页(RHEL 6.1)声称99是最高的:

“根据一种实时策略(SCHED_FIFO,SCHED_RR)调度的进程的sched_priority值在1(低)到99(高)之间。”

哪个实时优先级最高?

Answers:


86

我做了一个实验来确定这一点,如下所示:

  • process1:RT优先级= 40,CPU关联性= CPU0。此进程“旋转” 10秒钟,因此它不会让任何较低优先级的进程在CPU 0上运行。

  • process2:RT优先级= 39,CPU关联性= CPU0。此进程每0.5秒将一条消息打印到stdout,并在它们之间休眠。它随每条消息一起打印出经过的时间。

我正在运行带有PREEMPT_RT补丁的2.6.33内核。

为了运行实验,我在一个窗口(以root用户身份)中运行process2,然后在另一个窗口中以root用户身份启动process1。结果是进程1似乎抢占了进程2,不允许其运行整整10秒钟。

在第二个实验中,我将process2的RT优先级更改为41。在这种情况下,process2被process1抢占。

此实验表明,sched_setscheduler()中较大的RT优先级值具有较高的优先级。这似乎与Michael Foukarakis从sched.h所指出的相矛盾,但实际上并非如此。在内核源代码的sched.c中,我们有:

static void
__setscheduler(struct rq *rq, struct task_struct *p, int policy, int prio)
{
        BUG_ON(p->se.on_rq);

        p->policy = policy;
        p->rt_priority = prio;
        p->normal_prio = normal_prio(p);
        /* we are holding p->pi_lock already */
        p->prio = rt_mutex_getprio(p);
        if (rt_prio(p->prio))
                p->sched_class = &rt_sched_class;
        else
                p->sched_class = &fair_sched_class;
        set_load_weight(p);
}

rt_mutex_getprio(p)执行以下操作:

return task->normal_prio;

而normal_prio()恰好执行以下操作:

prio = MAX_RT_PRIO-1 - p->rt_priority;  /* <===== notice! */
...
return prio;

换句话说,我们有(我自己的解释):

p->prio = p->normal_prio = MAX_RT_PRIO - 1 - p->rt_priority

哇!太混乱了!总结一下:

  • 在p-> prio中,较小的值优先于较大的值。

  • 使用p-> rt_priority时,较大的值优先于较小的值。这是使用sched_setscheduler()设置的实时优先级。


23

简短答案

99位将是实时优先级的获胜者。

PR是优先级(范围从100到40)。PR越低,该过程的优先级越高。

PR计算如下:

  • 对于正常过程:PR = 20-NI(NI很好,范围从-20到19)
  • 对于实时进程:PR =-1-real_time_priority(real_time_priority的范围是1到99)

长答案

有两种类型的进程,正常进程和实时进程。对于正常进程 (仅针对那些进程),nice的应用如下:

好啊

“ niceness”标度从-20到19,而-20是最高优先级,19是最低优先级。优先级计算如下:

PR = 20 + NI

其中NI是好级别,PR是优先级。正如我们所看到的,-20实际上映射为0,而19映射为39。

缺省情况下,程序的nice值是0位,root用户可以使用以下命令来午餐带有指定nice值的程序:

nice -n <nice_value> ./myProgram 

即时的

我们可以走得更远。好优先级实际上用于用户程序。UNIX / LINUX总体优先级的范围是140个值,而nice值使进程可以映射到范围的最后一部分(从100到139)。该公式使从0到99的值不可用,这将对应于负PR级别(从-100到-1)。为了能够访问这些值,该过程应称为“实时”。

LINUX环境中有5个调度策略,可以通过以下命令显示:

chrt -m 

它将显示以下列表:

1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy

调度过程可以分为2组,正常调度策略(1至3)和实时调度策略(4和5)。实时过程将始终具有比常规过程更高的优先级。可以使用以下命令来调用实时过程(该示例是如何声明SCHED_RR策略):

chrt --rr <priority between 1-99> ./myProgram

为了获得实时过程的PR值,使用以下公式:

PR = -1-rt_prior

其中rt_prior对应于1到99之间的优先级。因此,比其他进程具有更高优先级的进程将是编号为99的进程。

重要的是要注意,对于实时过程,不会使用nice值。

要查看进程的当前“ niceness”和PR值,可以执行以下命令:

top

显示以下输出:

在此处输入图片说明

在该图中,显示了PR和NI值。最好注意PR值-51与实时值相对应的过程。也有一些过程的PR值表示为“ rt”。该值实际上对应于-100的PR值。


对于正在寻找实时计划上的即时答案的人们。对于chrt,优先级最低,优先级99。我很惊讶在chrt的手册页中没有提到它。
BZ

10

sched.h中的此注释非常明确:

/*
 * Priority of a process goes from 0..MAX_PRIO-1, valid RT
 * priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH
 * tasks are in the range MAX_RT_PRIO..MAX_PRIO-1. Priority
 * values are inverted: lower p->prio value means higher priority.
 *
 * The MAX_USER_RT_PRIO value allows the actual maximum
 * RT priority to be separate from the value exported to
 * user-space.  This allows kernel threads to set their
 * priority to a value higher than any user task. Note:
 * MAX_RT_PRIO must not be smaller than MAX_USER_RT_PRIO.
 */

注意这一部分:

优先级值反转:较低的p->prio值表示较高的优先级


1
但是那些暴露给用户空间的优先级值是否相同?(我不这么认为)。
davmac '16

@davmac:不,它们完全不同。这些是内核内部的。
Michael Foukarakis

对。这本书似乎在谈论这些值,因为我认为用户空间无法访问一个等效的优先级值。在这种情况下,这本书只有一个细节有误(假设MAX_PRIO = 139并且MAX_RT_PRIO = 99):最高优先级值为0,而不是1。
davmac '16

5

要确定可以通过编程设置的最高实时优先级,请使用sched_get_priority_max函数。

在Linux 2.6.32上,对sched_get_priority_max(SCHED_FIFO)的调用返回99。

参见http://linux.die.net/man/2/sched_get_priority_max


3
在同一手册页上,与OP的问题更相关:“优先级数值较高的进程被安排在优先级数值较低的进程之前”。
davmac '16

0

您对正常流程的静态优先级从100到139的假设充其量是不稳定的,而在最坏的情况下是无效的。我的意思是:set_scheduler仅允许SCHED_OTHER / SCHED_BATCH和SCHED_IDLE(从2.6.16开始为真)将sched_priority设置为0(表示动态优先级调度程序)。

编程静态优先级仅对于SCHED_RR和SCHED_FIFO为1-99

现在您可能会看到动态调度程序在内部使用100-139的优先级,内核在内部管理动态优先级的工作(包括翻转高优先级与低优先级的含义以使比较或排序更容易)应该是不透明的到用户空间。

请记住,在SCHED_OTHER中,您主要是将进程填充在同一优先级队列中。

这样做的目的是使内核更易于调试,并避免愚蠢的出界错误。

因此,切换含义的理由可能是,作为内核开发人员,不想使用像139-idx这样的数学运算(以防idx> 139)……最好使用idx-100进行数学运算并反转概念低与高的关系,因为人们普遍理解idx <100。

还有一个副作用是,变得更容易处理。100-100 <=>不错== 0; 101-100 <=>不错== 1; 等比较容易。它也很好地折叠为负数(与静态优先级无关)99-100 <=> nice == -1 ...


好吧,我看到sched_priority比静态优先级的不同,所有的非实时进程具有为0的sched_priority
大卫·豪尔

1
因此,静态优先级仅影响实时进程的时间范围。我认为sched_priority是O'Reilly的书所称的“实时优先级”。如果是这样,奥莱利的书将其倒退。那么,回到我最初的问题:sched_priority是99的最高优先级,还是1是最高的优先级?
David Steinhauer 2012年

0
  1. 绝对,实时优先级适用于RT策略FIFO和RR,它们的取值范围为0-99。
  2. 我们确实将40作为BATCH的非实时进程优先级的计数,其他策略的范围是0-39,而不是100到139。这可以通过查看系统中不是实时的任何进程来观察处理。默认情况下,它将具有20的PR和零度。如果您降低了流程的美观度(通常,将数值降低或减小,则该数值越小,美观度就越高),例如从0减至-1,您会发现PRiority将从20降至19。那就是,如果您通过降低PID的精确度值使进程更加饥饿或希望获得更多关注,那么优先级也会降低,因此优先级数会降低,而优先级越高。

    Example:
    
    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
    2079 admin     10 -10  280m  31m 4032 S  9.6  0.0  21183:05 mgmtd
    [admin@abc.com ~]# renice -n -11 2079
    2079: old priority -10, new priority -11
    [admin@abc.com ~]# top -b | grep mgmtd
    2079 admin      9 -11  280m  31m 4032 S  0.0  0.0  21183:05 mgmtd
    ^C
    

希望这个实际的例子可以澄清疑问,并且可以帮助将单词固定在错误的来源(如果有)。


0

Linux内核实现了两个单独的优先级范围-

  1. 不错的价值:-20至+19;好的值越大优先级越低

  2. 实时优先级:0至99;较高的实时优先级值对应于较高的优先级


感谢您的帮助,但是您可以通过解释这两个优先级之间的关系来改善答案。例如,添加详细信息,实时优先级范围和非实时范围如何重叠,以及在这种情况下“好”优先级指的是什么。
奥利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.