Как приоритеты потоков Java переводятся в приоритет потоков ОС?



Как приоритеты потоков java API (1-10)переводятся в приоритеты уровня ОС, так как большинство ОС не имеют уровней приоритета потоков (в терминах числа), которые соответствуют этому.



Таким образом , имея в виду, может ли быть сценарий, когда два или более потоков с различными приоритетами в конечном итоге получить тот же приоритет на уровне ОС.



Пожалуйста, уточните, есть ли какая-то коррекция в моем понимании.

522   4  

4 ответов:

Действительно, некоторые уровни приоритета могут сопоставляться с одним и тем же" родным " уровнем приоритета. Вот список (основанный на коде точки доступа в OpenJDK 6):

Солярис

  • 1 ⇒ 0
  • 2 ⇒ 32
  • 3 ⇒ 64
  • 4 ⇒ 96
  • 5 – 10 ⇒ 127

Следует отметить, что на Solaris вы не можете поднять приоритет потока выше обычного, только понизить его: значение приоритета для 5 такое же, как и любое из более высоких значений.

Linux

  • 1 – 10 ⇒ 4 – -5 (nice значения)

Следует отметить, что в Linux различные приоритеты потоков в Java сопоставляются с различными значениями приоритетов на собственном уровне.

Windows

  • 1 – 2 ⇒ THREAD_PRIORITY_LOWEST
  • 3 – 4 ⇒ THREAD_PRIORITY_BELOW_NORMAL
  • 5 – 6 ⇒ THREAD_PRIORITY_NORMAL
  • 7 – 8 ⇒ THREAD_PRIORITY_ABOVE_NORMAL
  • 9 – 10 ⇒ THREAD_PRIORITY_HIGHEST

Ваше понимание верно-приоритеты потоков Java не соответствуют чисто приоритетам потоков OS.

В результате, если ваш алгоритм каким-либо образом полагается на детали сопоставления приоритетов потоков, то он нарушается, так как он будет меняться в зависимости от такого количества переменных. Обновление вашего JRE или применение патча / пакета обновления к вашей ОС может нарушить его, например - и, конечно, просто запуск на другой ОС будет иметь последствия тоже.

За исключением очень необычных случаев, используя только будет достаточно двух приоритетов-нормального и низкого. Большая часть работы будет выполнена в обычном потоке. Низкий приоритет должен быть зарезервирован для потоков, которые не должны позволять голодать потокам нормального приоритета, вместо этого просто поглощая и не используя иначе мощность процессора.

В то время как вы можете получить более мелкозернистый, чем это, если вы выберете, вы должны знать, что любая большая деталь, вероятно, будет потеряна на целевой платформе.

Я не так уверен в Sun JVM на Linux. Написал быстрый Java proggy, чтобы породить 10 потоков с каждым приоритетом и вычислить pi(4*atan (1) Метод) с BigDecimals 500 000 раз каждый, присоединиться к каждому потоку и сообщить о прошедшем времени для метода 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 имеет довольно агрессивную схему приоритета потока. Все, что выше нормального анекдота потребляет гораздо больше. Таким образом, давайте увеличим до 900 000 итераций в каждом потоке:

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

Очень много того, что мы ищем, не так ли?

Поскольку мы говорим о потоках, я думаю, что это никогда не достигает ОС напрямую. Приоритет, вероятно, является подсказкой JRE о том, как планировать процессорное время каждого потока. Чтобы справиться с вашим примером, должен быть какой-то алгоритм "разрыва связей".

В принципе, это будет на вершине приоритета процесса ОС, если только JRE не использует стандарты потоковой обработки 3-й стороны, такие как POSIX, вместо того, чтобы реализовывать все внутри.

Comments

    Ничего не найдено.