代码之家  ›  专栏  ›  技术社区  ›  Nrj

如何将Java线程优先级转换为OS线程优先级?

  •  9
  • Nrj  · 技术社区  · 17 年前

    所以请记住,可能存在这样一种情况:两个或多个具有不同优先级的线程最终在操作系统级别获得相同优先级。

    4 回复  |  直到 12 年前
        1
  •  14
  •   C. K. Young    17 年前

    实际上,某些优先级可以映射到相同的“本机”优先级。以下是列表(基于OpenJDK 6中的热点代码):

    Solaris

    • 2 ⇒ 32
    • 3 64
    • 4 96

    Linux

    • 1 10 4 -5 ( nice

    值得注意的是,在Linux上,Java中不同的线程优先级在本机级别映射到不同的优先级值。

    窗户

    • 1 2 THREAD_PRIORITY_LOWEST
    • 3 4 THREAD_PRIORITY_BELOW_NORMAL
    • 5 6 THREAD_PRIORITY_NORMAL
    • THREAD_PRIORITY_ABOVE_NORMAL
    • 9 10 THREAD_PRIORITY_HIGHEST
        2
  •  1
  •   Bill Michell    17 年前

    您的理解是正确的-Java线程优先级没有清晰地映射到OS线程优先级。

    因此,如果您的算法以任何方式依赖于线程优先级映射的细节,那么它就被破坏了,因为它会根据这么多变量而变化。例如,升级你的JRE或在你的操作系统上应用补丁/服务包可能会破坏它——当然,仅仅在不同的操作系统上运行也会产生后果。

    除了非常不寻常的情况外,只使用两个优先级就足够了——正常优先级和低优先级。大多数工作将在正常线程中完成。低优先级应该保留给那些不允许耗尽正常优先级的线程的线程,而只允许它们狼吞虎咽地消耗掉处理器的能量。

    如果您愿意,您可以获得比这更细粒度的信息,但您需要注意,任何更详细的信息都可能在目标平台上丢失。

        3
  •  1
  •   Jé Queue    16 年前

    我不太确定Linux上的Sun JVM。编写了一个快速Java程序,以生成10个具有每个优先级的线程,并使用大小数计算pi(4*atan(1)方法),每次500000次,在每个线程上加入,并报告run方法的运行时间。是的,可能不是最好的例子,但要保持基本。

    $uname -r && grep bogomips /proc/cpuinfo
    2.4.33.3
    bogomips        : 4312.26
    $java -version 2>&1 |head -1
    Java version "1.6.0_01"
    $javac T.java && java -Xmx32m T
    1:3112
    2:2636
    3:2662
    4:3118
    5:2870
    6:3319
    7:3412
    8:3304
    9:3299
    10:3069
    

    看起来并不像人们期望的那样有多大的偏差!那是在一个小型的虚拟Linux机器上。让我们在真实的楼板上尝试一下,以防万一,此框也相当活跃,平均荷载很少低于7,让我们看看在这样的环境中如何安排:

    $uname -r && grep bogomips /proc/cpuinfo
    2.6.9-67.ELsmp
    bogomips        : 3992.93
    bogomips        : 3990.00
    $java -version 2>&1 |head -1
    java version "1.4.2_14"
    $javac T.java && java -Xmx32m T
    1:63200
    2:64388
    3:62532
    4:58529
    5:62292
    6:64872
    7:64885
    8:64584
    9:61653
    10:61575
    

    嗯,这里没有太多变化,不知道1.4是否映射了线程。让我们试试windows的盒子。我知道Windows有一个相当积极的线程优先级模式。以上任何内容 典型的 奇闻轶事消耗更多。因此,让我们在每个线程中增加多达900000次迭代:

    C:\>java -version
    java version "1.6.0_11"
    C:\>java -Xmx32m T
    1:12578
    2:12625
    3:11469
    4:11453
    5:10781
    6:8937
    7:10516
    8:8406
    9:9953
    10:7391
    

        4
  •  -1
  •   Dana the Sane    17 年前

    因为我们讨论的是线程,我认为这永远不会直接到达操作系统。优先级可能是向JRE提示如何安排每个线程的CPU时间。为了处理您的示例,需要某种“打破僵局”算法。