Рекурсивные вызовы на разных ядрах? - PullRequest
0 голосов
/ 16 мая 2019

Итак, я недавно писал программу для подтверждения того, что алгоритм взаимного исключения Дейкстры работает. Я решил использовать Kotlin, потому что я не хотел использовать C ++ и управлять памятью самостоятельно. Сегодня я увидел, что, несмотря на то, что моя программа работает последовательно, все ядра используются на 100%, это какая-то оптимизация JVM? Или, может быть, Котлин оптимизировал мои рекурсивные вызовы? Я должен отметить, что моя рекурсия не является хвостовой рекурсией. Кто-нибудь из вас знает, почему это происходит? Я не использовал темы или сопрограммы только для ясности.

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Краткий ответ: не волнуйтесь!

Если вы не используете сопрограммы или явные потоки, тогда ваш код должен продолжать выполняться в том же потоке.

Однако есть нет гарантии , что ваш поток всегда будет выполняться на одном и том же ядре;ОС может свободно планировать его в зависимости от того, какое ядро ​​оно считает наилучшим в каждый момент.(Я не знаю, какие критерии могут использовать различные ОС для принятия таких решений, но он, вероятно, будет учитывать другие потоки и процессы. И ваш поток может перемещаться между кодами достаточно быстро, чтобы запутать любой мониторинг, который вы можете выполнять.)

Кроме того, даже если вы не запускаете какие-либо другие потоки, вероятно, есть несколько фоновых потоков, обрабатывающих сборщик мусора , запуск финализаторов и другие служебные действия.Если вы используете инструментарий с графическим интерфейсом, такой как JavaFX или Swing, он будет использовать множество потоков, как и среда, такая как Spring.(Обычно они помечаются как ' dæmon ' theads, поэтому они не препятствуют выходу JVM.)

Наконец, сама JVM, вероятно, будет использовать системные потоки для фоновая компиляция байт-кода, мониторинг и так далее.(Разные реализации JVM могут делать это по-разному, конечно.)

(Кстати, все это не относится к Kotlin; это одинаково для всех приложений Java. Но для Kotlin это почти наверняка будет другим)/ JS и Kotlin / native.)

Так что нет, активность на нескольких ядрах не означает, что ваш код был преобразован или переписан.Это просто означает, что вы не работаете на голом металле и должны доверять JVM, чтобы позаботиться о вещах!

0 голосов
/ 16 мая 2019

Это был GC, вот пост Reddit, который я там создал. https://www.reddit.com/r/Kotlin/comments/bp9y1t/recursion_calls_on_different_cores/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...