【问题标题】:Why are niceness values inversely related to process priority?为什么 niceness 值与进程优先级成反比?
【发布时间】:2012-12-13 13:52:41
【问题描述】:

进程的niceness随着进程优先级的增加而减少。

摘自《Linux 编程入门》第 4th 版,第 169 页:

默认优先级为0。正优先级用于背景 当没有其他更高优先级的任务准备好运行时运行的任务。 负优先级导致程序运行更频繁,占用 可用 CPU 时间的更大份额。有效优先级的范围 是 -20 到 +20。这通常是令人困惑的,因为越高 数值,执行优先级越低。

对于较高的进程优先级对应的负值是否有任何特殊原因(而不是为较高的 niceness 值的进程增加优先级)?

【问题讨论】:

  • 我会将这个问题提交给 serverfault,因为它与编程无关,抱歉。
  • 虽然它确实说明了程序员的想法 - 只是展示,并不是我们所做的一切都很清楚:)
  • 这可能是一个错误:" POSIX 没有为这些函数获取和设置的值定义任何语义。正如您将看到的,Linux 实现与 POSIX 的作者完全相反记住语法。" gnu.org/software/libc/manual/html_node/Priority.html
  • @AshRJ 是的,肯定是 +19...从 -20 到 +19 有 40 个优先级,包括 0。有关更多信息,请阅读我的答案。

标签: linux unix terminology nice


【解决方案1】:

是的 - 随着数字的上升,它会变得更好,随着数字的下降,它会变得更平均。因此,当它不占用所有资源时,该过程被视为“更友好”,而当它对资源变得更加贪婪时,它被视为“讨厌”。

把它想象成“好”点——你对别人越好,你得到的点就越多。

【讨论】:

  • 我很难相信,这是唯一的原因 :)
  • @AshRj:还是这样。 Wikipedia page on nice 引用了 Kernighan 和 Pike (1984) 的词源,可视为权威来源。
  • @larsmans 我刚刚检查了维基百科页面上引用的来源,The Unix Programming Environment,第 35 页以及其他实例,作者在任何地方都没有说明这个推理或任何推理或解释为什么 niceness 值会降低。他们只在书中的两个实例中提到了nice utility
  • @AshRj 是的 - 这是真的 - 就像关于为什么光标被称为光标的故事......因为它提示你诅咒:)
  • @AshRj:有趣——即使维基百科确实引用了来源,你也不能完全相信它。我只是 grepped V6 Unix 文档集,它没有解释“nice”这个名字。
【解决方案2】:

@Ewald 的回答是正确的,正如 Jerry Peek et al.Unix Power Tools (O'Reilly, 2007, p. 507) 中所证实的那样: p>

这就是 nice 数字通常被称为 niceness 的原因:niceness 高的作业对您系统的用户非常友好(即,它运行在低优先级),而一个不太友好的工作会占用 CPU。 “niceness”这个词很尴尬,就像优先系统本身一样。不幸的是,它是唯一一个既准确的术语(漂亮 数字用于计算优先级,但不是优先级本身)并避免可怕的迂回说法(“提高优先级意味着降低优先级......” )。

Nice 至少从 V6 Unix 开始就有这个含义,但 V6 手册从未明确解释过这一点。允许值的范围是 -220 到 +20,负数保留给超级用户。 V7 中的范围已更改为 -20 到 +20。

【讨论】:

    【解决方案3】:

    首先答案有点长,但只是为了澄清。

    在 linux 内核中,每个常规进程都可能具有称为静态优先级的优先级,从 100(最高)到 139(最低)。所以基本上有 40 个优先级可以分配给流程。

    所以当任何进程被创建时,它会获得它的父进程的优先级,但是如果用户想要更改它的优先级,那么它可以在 nice(nice_value) 系统调用的帮助下完成。

    &您提出问题的原因是每个进程都需要基本时间片,该时间片用作进程将获得 CPU 执行的时间(以毫秒为单位),其计算方式为

    time={
         if static_priority<120
    
           (140-static_priority)*20 
    
         if static_priority>=120
    
           (140-static_priority)*5
    

    so sys_nice( ) 服务例程处理 nice( ) 系统调用。尽管 nice_value 可以有任何值,但大于 40 的绝对值会被缩减为 40。传统上,负值对应于优先级增加的请求并需要超级用户权限,而正值对应于优先级降低的请求。在 nice_value 为负的情况下,函数 调用 able() 函数来验证进程是否具有 CAP_SYS_NICE 能力。此外,该函数调用security_task_setnice()安全钩子。所以最后nice_value被用来计算静态优先级,然后这个静态优先级被用于计算基准时间片。

    很明显,-ve 值用于增加优先级,因此需要超级用户访问权限,而 +ve 值用于降低优先级,因此不需要超级用户访问权限。

    【讨论】:

      【解决方案4】:

      歇斯底里的原因 - 我的意思是历史性的......我很确定它是从数字从 0 .. 20 开始上升的,并且首先采用了最低的可用数字。然后有人得出结论,“嗯,如果我们需要让一些更重要的东西怎么办?”——好吧,我们必须消极。

      您希望优先级是一个可排序的值,因此如果您从“默认为零”开始,则必须将更高的优先级设为更高的数字(但日常发言中的“优先级 1”高于“优先级 2”-当您的老板说“将此作为您的第一要务”时,这确实意味着它很重要,对吗?)。作为一台计算机,显然优先级0高于优先级1,优先级-1高于优先级0。

      最后,这是一个随意的选择。也许 Ken Thomson、Dennis Ritchie 或其中一个人能够肯定地说他们为什么只选择那个序列,而不是 0..255,例如。

      【讨论】:

      • Ritchie 一年多前去世了,但 Unix V6 手册描述了原始的 nice(1)nice(2):niceness 值的范围是 -220..20,负值仅适用于超级用户。
      • 是的,我知道 DR 已不在我们身边。我可能只是因为这是一种确定“特殊”级别开始位置的简单方法 - 如果它小于零,则您必须是超级用户。
      • 另外,它使计算变得简单 - 只需将 niceness 添加到优先级(如果数字低意味着高优先级则减去它)。
      • 是的,所以调度程序不仅仅是 niceness —— niceness 值被添加到优先级计算中,而不是进程的全部优先级。它还考虑了 IO 活动和处理器使用情况。与那些占用大量 CPU 的进程相比,具有高 IO 和低处理器使用率的进程将得到“提升”。这有助于系统获得良好的 IO 吞吐量,否则它们会被稍后可以完成的 cpu 密集型工作阻塞。
      • 我喜欢与人们用英语谈论优先事项的方式进行比较。没办法证明,但解释很有意义。
      猜你喜欢
      • 1970-01-01
      • 2011-06-25
      • 2017-02-17
      • 2011-08-08
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多