Linux中哪个实时优先级最高

Linux中哪个实时优先级最高,linux,linux-kernel,real-time,Linux,Linux Kernel,Real Time,在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)调度的进程” s

在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_优先级值在1(低)到99(高)之间。”


哪个实时优先级最高?

您认为正常进程的静态优先级为100到139,这一假设充其量是不稳定的,最坏情况下是无效的。我的意思是:set_scheduler只允许sched_优先级为0(表示动态优先级调度器),sched_OTHER/sched_BATCH和sched_IDLE(从2.6.16起为真)

编程静态优先级仅为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-100nice==-1

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

在Linux 2.6.32上,调用sched_get_priority_max(sched_FIFO)返回99

请参见中的这一评论,该评论非常明确:

/*
 * 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:RT优先级=40,CPU相关性=CPU 0。此进程“旋转”10秒,因此不会让任何优先级较低的进程在CPU 0上运行

  • 进程2:RT优先级=39,CPU相关性=CPU 0。此进程每隔0.5秒向stdout打印一条消息,并在其间休眠。它会打印出每条消息经过的时间

我正在运行一个带有PREEMPT\u RT补丁的2.6.33内核

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

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

此实验表明,sched_setscheduler()中的RT优先级值越大,优先级越高。这似乎与MichaelFoukarakis在sched.h中指出的观点相矛盾,但事实并非如此。在内核源代码中,我们有:

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;
prio = MAX_RT_PRIO-1 - p->rt_priority;  /* <===== notice! */
...
return prio;
而正常的_prio()会执行以下操作:

return task->normal_prio;
prio = MAX_RT_PRIO-1 - p->rt_priority;  /* <===== notice! */
...
return prio;
哇!这太令人困惑了!总结如下:

  • 使用p->prio时,较小的值优先于较大的值

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

  • 当然,实时优先级适用于RT策略FIFO和RR,其变化范围为0-99
  • 我们将40作为批处理的非实时进程优先级计数,其他策略从0到39不等,而不是从100到139不等。这一点,您可以通过查看系统中任何非实时进程来观察。默认情况下,它的PR为20,NIceness为0。如果降低进程的精确性(通常,数字越小或为负数,精确性越低,进程越饥饿),比如从0降低到-1,您会发现优先级将从20降低到19。 这简单地告诉我们,如果您通过降低PID的niceness值使一个进程更加饥饿,或者希望得到更多的关注,那么您的优先级也会降低,因此优先级越低优先级越高

    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
    

  • 希望本实用示例能够澄清疑问,并有助于修复错误来源的单词(如果有)。

    简短回答

    99将是实时优先级的赢家

    PR是优先级(范围-100到39)。PR越低,流程的优先级就越高

    PR的计算如下:

    • 对于正常工艺:PR=20+NI(NI很好,范围从-20到 (19)
    • 对于实时进程:PR=-1-实时优先级 (实时优先级范围从1到99)
    长答案

    有两种类型的进程,正常进程和实时进程 对于普通的(仅适用于这些),nice的应用如下:

    不错

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

    PR=20+NI

    其中NI是nice级别,PR是优先级
    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
    
    chrt --rr <priority between 1-99> ./myProgram
    
    top