2016-12-30 4 views
1

Может ли кто-нибудь помочь мне понять, как JVM распространяет потоки между доступными ядрами процессора? Вот что я вижу, как это работает, но меня исправить.Как JVM распространяет потоки между ядрами процессора?

Итак, с самого начала: когда компьютер запущен, тогда поток начальной загрузки (обычно поток 0 в ядре 0 в процессоре 0) запускает выборку кода с адреса 0xfffffff0. Все остальные процессоры/ядра находятся в специальном состоянии ожидания, называемом Wait-for-SIPI (WFS).

После загрузки ОС ОС Windows начинает запускать процессы и назначать их между CPU/ядрами, отправляя специальный прерыватель Inter-Interrupt (IPI) через Advanced Programmable Interrupt Controller (APIC), называемый SIPI (Startup IPI) для каждого потока то есть в WFS. SIPI содержит адрес, из которого этот поток должен начинать выборку кода.

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

Вопрос: как?

Использует ли JVM тот же механизм, что и ОС, и во время среза, предоставленного ОС JVM, может отправлять SIPI другим ядрам и указывать на адрес задач, которые должны выполняться в отдельном потоке? Если да, то как восстанавливается исходная программа, которая может быть выполнена ОС на этом ядре?

Предположим, что это не правильное видение, так как это должно быть связано с управлением другими процессорами/ядрами. По общему мнению, мы могли бы прервать выполнение некоторых процессов ОС, работающих параллельно на других ядрах. Поэтому, если JVM хочет начать новый поток на другом процессоре/ядре, он вызывает вызов ОС и посылает адрес задачи, которая должна быть выполнена в ОС. Выполнение расписания ОС, как и для других программ, но с другим, что это выполнение должно происходить в том же процессе, чтобы иметь возможность доступа к тому же адресному пространству, что и остальные потоки JVM.

Как это делается? Может ли кто-нибудь описать это более подробно?

+1

JVM - это обычный процесс. Он (и его потоки) управляется ОС/ядром, включая создание и планирование. Как и все другие процессы и потоки. Части, выделенные жирным шрифтом, тоже ничего особенного - так работают все обычные потоки. – Mat

+0

и можем ли мы манипулировать JVM, какой процессор и ядро ​​должны использоваться для определенного потока или полностью под управлением ОС? – user3342955

+1

Это специфическая платформа. Если вам хорошо писать собственный код, то в Linux ручное планирование выполняется системным вызовом 'sched_setaffinity'. Насколько мне известно, в стандартной библиотеке нет java-обертки. Также посмотрите команду 'taskset' для запуска всей JVM с измененной близостью. – gudok

ответ

5

OS управляет и назначает потоки по умолчанию. JVM делает правильные звонки в ОС, чтобы это произошло, но не вмешивается.

ли JVM использовать тот же механизм, как OS

Виртуальная машина Java использует ОС, она понятия не имеет, что на самом деле происходит.

Каждый процесс имеет свое виртуальное адресное пространство, снова управляемое ОС.


У меня есть библиотека, которая использует JNA для переноса setaffinity в Linux и Windows. Вам нужно сделать это, поскольку планирование потоков контролируется ОС, а не JVM.

https://github.com/OpenHFT/Java-Thread-Affinity

Примечание: в большинстве случаев, с использованием сродства либо а) не помогает, или б) не помогает столько, сколько вы могли бы подумать.

Мы используем его, чтобы уменьшить дрожание около 40 - 100 микросекунд, что происходит не часто, но достаточно часто, чтобы повлиять на наш профиль производительности. Если вы хотите, чтобы ваши 99% ile латентности были как можно ниже, в микросекундном диапазоне важно иметь сродство нитей.Если вы в порядке с 1 в 100 запросах на 1 мс дольше, я бы не стал беспокоиться.

Смежные вопросы