Как потоки Java планируются в пространстве ядра?

Вот мое понимание того, что потоки Java планируются, когда java запускает поток при вызове start() API класса java.lang.Thread, работающего в современных реализациях ОС (например, Solaris 9).

введите здесь описание изображенияИспользуется термин LWP, поскольку термин kernel thread обычно используется в программировании ядра для запуска потока.

Итак, каждое создание java thread с использованием java.lang.Thread::start() API имеет карту 1:1 с созданием native thread с использованием pthread_create() или thr_create() или CreateThread() на платформах POSIX, Solaris, Windows соответственно. В свою очередь, каждый native thread имеет карту 1:1 с LWP.

Мой вопрос:

1)

Могу ли я сказать, что в пользовательском пространстве jvm больше нет политики планирования потоков Java для планирования потоков Java на основе модели потоков 1-1 на приведенной выше диаграмме?

2) Дополнительно: в сценарии с двухъядерным процессором имеют ли эти 2 LWP (представляющие каждый процесс JVM) равные шансы на одновременное (параллельное) выполнение?

Примечание: мне, как новичку в Java, нужна эта ясность


person overexchange    schedule 05.12.2014    source источник
comment
Я думаю, что планирование потоков никогда не выполняется в пользовательском пространстве; оно генерируется с запросом к ядру, и, следовательно, ОС должна нести ответственность за планирование --- хотя не уверен.   -  person Am_I_Helpful    schedule 05.12.2014
comment
В Linux поток ядра — это поток, который операционная система использует для своих целей, не связанный с каким-либо пользовательским процессом (т. е. не связанный с вашей JVM). Когда вы говорите о потоках Java, которые непосредственно управляются операционной системой, принято называть эти собственные потоки.   -  person Solomon Slow    schedule 05.12.2014


Ответы (2)


На диаграмме подробно описывается внутренняя работа jvm и то, как он абстрагируется от потоков операционной системы более низкого уровня к модели потоков Java. Вот как JVM работает в вышеуказанных операционных системах.

Чтобы ответить на ваши вопросы напрямую:

  1. ) Каждый раз, когда вы создаете поток, вы создаете поток для управления операционной системой. JVM имеет уровень абстракции между вами и операционной системой, поэтому вы можете работать с одной и той же моделью потоков в разных системах. В общем, для неоптимизированного java-кода java-поток — это поток ОС.

  2. ) У вас нет никаких гарантий на параллельное выполнение. В зависимости от загрузки ЦП операционной системе могут потребоваться ресурсы в другом месте для систем с более высоким приоритетом. При написании многопоточных приложений пишите так, как будто все, что происходит вне потока, неизвестно.

Если вы хотите узнать больше о многопоточной модели Java, я рекомендую этот забронировать. Книга старая, но до сих пор актуальная. Он был написан архитектором языка Java и подробно описывает модель многопоточности Java.

person Leland Barton    schedule 05.12.2014
comment
Среда выполнения Java оптимизирует байт-код во время выполнения. Может обнаружиться, что вы пытаетесь создать поток, когда было бы быстрее выполнить работу в том же потоке. JVM может или не может удалить вызов для создания нового потока, несмотря на то, что он присутствует в вашем коде. - person Leland Barton; 05.12.2014
comment
Упс... да, именно это я и имел в виду. - person Leland Barton; 05.12.2014
comment
Считаете ли вы, что JVM обеспечивает абстракцию многопоточности? я так не думаю. Одного действительно волнует, запускает ли он свой java-код в JVM платформы Solaris/Linux/Windows на основе собственной (libpthread.so/kernel32.dll/libthread.so) библиотеки, которую JVM использует для запуска собственных потоков, и модели потоковой передачи, которая ОС обеспечивает. потому что модель потоковой передачи на уровне ОС напрямую влияет на производительность многопоточного приложения Java. - person overexchange; 05.12.2014
comment
JVM обеспечивает абстракцию над собственными библиотеками, упрощая их. Стандарт потоков POSIX предлагает гораздо большую гибкость, чем класс Java Thread и классы параллелизма. - person Leland Barton; 05.12.2014
comment
я хотел бы узнать ваши отзывы о том, имеет ли смысл эта диаграмма для вас, могу ли я изобразить работу потоков java таким образом? мне нужны комментарии по этому поводу - person overexchange; 05.12.2014
comment
Я поддерживаю приложение Java, которое подключается к устройствам X по сети. Архитектура программы имеет поток для каждого устройства, который помогает сохранять состояние. Существует также поток для графического интерфейса пользователя и поток для управления всеми потоками устройства. Когда я выполняю долгосрочный процесс с 30 устройствами, Windows показывает 32 дескриптора потока для моего процесса. Когда я выполняю недолговечный процесс с 30 тактами, который работает только с журналами локально, количество дескрипторов потока не превышает 5. Я бы сказал, что диаграмма до некоторой степени точна, но есть крайние случаи. - person Leland Barton; 05.12.2014

Политика планирования потоков Java на уровне JVM может управляться следующими параметрами: 1) UseBoundThreads 2) AdjustConcurrency 3) приоритет потока Java.

person Jamsheed    schedule 05.12.2014
comment
это задокументированные утверждения, можете ли вы показать мне результаты, используя эти параметры, по крайней мере, используя Solaris JVM для вашего первого варианта. - person overexchange; 05.12.2014
comment
UseBoundThreads предоставляет функцию 1x1. Без нее может быть MxN AdjustConcurrency используется в отсутствие 1x1, чтобы сделать достаточное количество lpw доступным для JVM. Приоритет потока Java также влияет на то, как происходит планирование потока. - person Jamsheed; 05.12.2014