顶部输出中 nice 值和优先级之间的差异

顶部输出中 nice 值和优先级之间的差异

顶部默认情况下,会列出两列。我很好奇它们有什么区别。我查看了手册页,但无法弄清楚:

优先事项:

   h: PR  --  Priority
      The priority of the task.

物有所值:

   i: NI  --  Nice value
      The nice value of the task.  A negative nice value means higher  priority,
      whereas  a  positive  nice value means lower priority.  Zero in this field
      simply means priority will not be adjusted in determining  a  task’s  dis-
      patchability.

我明白那个物有所值与内核的 CPU 调度队列相关;那么优先事项表示什么?可能与 I/O 有关?

答案1

nice 值是一种“全局”机制,而优先级与任务切换器相关现在

答案2

不同之处在于公共关系是内核中当前进程的真实优先级,只是向内核提示一下进程应该具有的优先级。

在多数情况下公共关系值可以通过以下公式计算:PR = 20 + NI。因此,优先级为 3 的进程的优先级为 23(20 + 3),优先级为 -7 的进程的优先级为 13(20 - 7)。您可以通过运行命令来检查第一个进程nice -n 3 top。它将显示顶部进程有镍 3公关 23。但在大多数 Linux 系统中运行,nice -n -7 top您需要具有 root 权限,因为实际上较低的公共关系值越高,实际优先级越高。因此,公关 13比标准优先级的进程具有更高的优先级PR 20这就是为什么你需要 root 权限。但非 root 进程允许的最小 niceness 值可以在/etc/security/limits.conf

理论上内核可以改变公共关系值(但不是) 本身。例如,如果某个进程占用过多的 CPU,它可能会降低该进程的优先级,或者如果某个进程由于其他更高优先级的进程而没有机会长时间运行,它可能会提高该进程的优先级。在这些情况下,公共关系值将被内核改变,并且将保持不变,因此公式“PR = 20 + NI”不正确。因此值可以解释为提示内核进程应该具有的优先级,但内核可以选择真正的优先级(公共关系值)本身取决于具体情况。但通常公式“PR = 20 + NI”是正确的。

内核如何改变优先级的具体规则尚不清楚。设置优先级(改变nice值的函数)手册上说:

改变 nice 值的效果可能因有效的进程调度算法而异。

Pthread 手册内容如下:

动态优先级基于 nice 值(由 nice(2)、setpriority(2) 或 sched_setattr(2) 设置),并且随着线程准备运行但被调度程序拒绝运行的每个时间段而增加。

看起来公共关系值对应动态优先级。

的范围价值是-20..19。 就这样公共关系值可以具有以下值0(20 - 20)至三十九(20 + 19)。但这只对具有默认调度策略的进程是正确的(棚屋_其他)。还可能存在所谓的“即时的”调度策略。这些策略包括调度资源队列SCHED_FIFO. 此类过程具有公共关系值小于 0。您可以通过运行chrt -r 1 top命令来检查这一点(需要 root 权限)。顶部过程将有公关-2。你甚至可以chrt -r 90 top在这种情况下运行顶部过程将有PR-91

似乎调度资源队列处理公共关系值可以通过以下公式计算:

PR = -1-sched_rr_priority

因此调度资源队列过程至少有公关-1这意味着任何调度资源队列进程的优先级高于任何进程SCHED_OTHER。这对应于pthread手册:

SCHED_FIFO 只能与高于 0 的静态优先级一起使用,这意味着当 SCHED_FIFO 线程变为可运行时,它将始终立即抢占任何当前正在运行的 SCHED_OTHER、SCHED_BATCH 或 SCHED_IDLE 线程。

SCHED_RR 是 SCHED_FIFO 的简单增强。上面针对 SCHED_FIFO 描述的所有内容也适用于 SCHED_RR,

实时进程的优先级称为静态优先级,内核无法更改。因此积极公共关系值可以被视为非实时的动态优先级(SCHED_OTHERSCHED_BATCH)过程和负面公共关系值为实时进程的静态优先级(调度资源队列SCHED_FIFO)。

我也尝试运行nice -n 10 chrt -r 50 top(和chrt -r 50 nice -n 10 top)。值为 10,但公共关系仍然是-51. 因此看起来值不影响优先级调度资源队列过程。这对应于设置优先级手动的:

任何使用 SCHED_FIFO 或 SCHED_RR 的进程或线程都不会受到 setpriority() 调用的影响。这不被视为错误。随后恢复为 SCHED_OTHER 的进程的优先级不会受到此类 setpriority() 调用的影响。

有趣的是,如果你跑步chrt -r 99 top,你会看到逆转录值而不是数字公共关系柱子。

  PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令
28489 根 RT 0 2852 1200 896 R 0 0.1 0:00.01 顶部

我不认为这意味着这个过程现在很特别。我认为这意味着顶部只是不要打印-100因为打印需要 4 个字符。

您还可以使用顶部代替顶部在所有示例中,这可以更方便。ps -l也可以使用,但区分实时和非实时优先级的基点不是 0,而是 60,因此nice -n -20 ps -l将打印

FS UID PID PPID C PRI NI 地址 SZ WCHAN TTY 时间 CMD
4 R 0 28983 28804 0 60 -20 - 1176 - 点/6 00:00:00 点

答案3

简短答案

PR 是优先级别。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。

默认情况下,程序的 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 值为 -51 的进程对应于实际时间值。还有一些进程的 PR 值为“rt”。该值实际上对应于 PR 值 -100。

(PS:我本来想发布一张显示最佳结果的图片,但我没有足够的声誉来做到这一点)

相关内容