Может ли кто-нибудь помочь мне понять, как 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.
Как это делается? Может ли кто-нибудь описать это более подробно?
JVM - это обычный процесс. Он (и его потоки) управляется ОС/ядром, включая создание и планирование. Как и все другие процессы и потоки. Части, выделенные жирным шрифтом, тоже ничего особенного - так работают все обычные потоки. – Mat
и можем ли мы манипулировать JVM, какой процессор и ядро должны использоваться для определенного потока или полностью под управлением ОС? – user3342955
Это специфическая платформа. Если вам хорошо писать собственный код, то в Linux ручное планирование выполняется системным вызовом 'sched_setaffinity'. Насколько мне известно, в стандартной библиотеке нет java-обертки. Также посмотрите команду 'taskset' для запуска всей JVM с измененной близостью. – gudok