首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪个实时优先级是Linux中的最高优先级?

哪个实时优先级是Linux中的最高优先级?
EN

Stack Overflow用户
提问于 2012-01-16 23:02:36
回答 7查看 117.9K关注 0票数 84

在Linux实时进程优先级范围1到99中,我不清楚哪一个是最高优先级,1还是99。

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

每个实时进程都与一个实时优先级相关联,该优先级从1(最高优先级)到99 (最低优先级)不等。

另一方面,sched_setscheduler手册页(RHEL6.1)声称99是最高的:

在一个实时策略(SCHED_FIFO,SCHED_RR)下调度的进程的sched_priority值在1(低)到99 (高)之间。

哪个是最高的实时优先级?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-02-14 22:25:06

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

  • process1: RT优先级= 40,CPU亲和力= CPU 0。这个进程“旋转”10秒,这样就不会让任何优先级较低的进程在CPU 0上运行。
  • process2: RT优先级= 39,CPU亲和力= CPU 0。此过程每0.5秒打印一条消息到stdout,在两者之间休眠。它打印出每条消息的运行时间。

我正在使用PREEMPT_RT补丁运行一个2.6.33内核。

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

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

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

代码语言:javascript
复制
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)做了以下工作:

代码语言:javascript
复制
return task->normal_prio;

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

代码语言:javascript
复制
prio = MAX_RT_PRIO-1 - p->rt_priority;  /* <===== notice! */
...
return prio;

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

代码语言:javascript
复制
p->prio = p->normal_prio = MAX_RT_PRIO - 1 - p->rt_priority

哇!这太让人困惑了!概括地说:

  • 对于p->prio,较小的值优先于较大的值。
  • 对于p->rt_优先级,较大的值抢占较小的值。这是使用sched_setscheduler()的实时优先级集.
票数 97
EN

Stack Overflow用户

发布于 2018-09-25 15:29:43

短答案

99将成为实时优先权的赢家。

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

PR计算如下:

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

长答案

有两种类型的进程,正常的和实时的(仅对那些),nice被应用于以下几个方面:

尼斯

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

PR = 20 + NI

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

默认情况下,程序尼斯值为0位--通过使用以下命令,根用户可以使用指定的尼斯值午餐程序:

代码语言:javascript
复制
nice -n <nice_value> ./myProgram 

实时

我们可以走得更远。这个好的优先级实际上是用于用户程序的。虽然UNIX/LINUX的总体优先级有140个值,但很好的值使进程能够映射到范围的最后一部分(从100到139)。这个方程使0到99之间的值无法达到,这将对应于负PR水平(从-100到-1)。为了能够获得这些价值,应将这一过程表述为“实时”。

LINUX环境中有5种调度策略,可以使用以下命令显示:

代码语言:javascript
复制
chrt -m 

它将显示以下列表:

代码语言:javascript
复制
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策略):

代码语言:javascript
复制
chrt --rr <priority between 1-99> ./myProgram

为了获得实时过程的PR值,应用下列方程:

PR = -1 - rt_prior

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

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

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

代码语言:javascript
复制
top

它显示了以下输出:

在图中显示PR和NI值。注意到PR值-51对应于实时值的过程是很好的。也有一些过程的PR值表示为"rt“。这个值实际上对应于PR值-100。

票数 42
EN

Stack Overflow用户

发布于 2012-02-08 06:51:22

sched.h中的这个评论是非常明确的:

代码语言:javascript
复制
/*
 * 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 值倒置:较低的值意味着较高的优先级

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8887531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档