Linux中哪个实时优先级最高

新手上路,请多包涵

在 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(高)的范围内。”

哪个是最高实时优先级?

原文由 David Steinhauer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 692
2 个回答

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

  • 进程 1:RT 优先级 = 40,CPU 亲和性 = CPU 0。此进程“旋转”10 秒,因此它不会让任何低优先级进程在 CPU 0 上运行。

  • process2:RT 优先级 = 39,CPU 亲和性 = CPU 0。此进程每 0.5 秒向 stdout 打印一条消息,其间处于休眠状态。它打印出每条消息的经过时间。

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

为了运行实验,我在一个窗口中(以 root 身份)运行 process2,然后在另一个窗口中启动 process1(以 root 身份)。结果是 process1 似乎抢占了 process2,不允许它运行整整 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() 设置的实时优先级。

原文由 David Steinhauer 发布,翻译遵循 CC BY-SA 4.0 许可协议

简答

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

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

PR 计算如下:

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

长答案

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

好的

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

公关 = 20 + 镍

其中 NI 是 nice 级别, PR 是 priority 级别。所以我们可以看到,-20 实际上映射到 0,而 19 映射到 39。

默认情况下,程序 nice 值为 0 位,root 用户可以使用以下命令来使用指定的 nice 值午餐程序:

 nice -n <nice_value> ./myProgram

即时的

我们可以走得更远。 nice 优先级实际上用于用户程序。虽然 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

调度过程可以分为两组,正常调度策略(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 值。

原文由 Agustin Barrachina 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题