Java и мультипроцессирование
Добавлено: 20 фев 2015, 12:24
Вопрос тянется из вот этого IT-семинара (т.е. он возникал и раньше ... назывался лет 10 назад , но там специально ему был разговор посвящён).
Потоки в Java...
Когда объект Java наследует Thread или реализует интерфейс Runable - это поток ядра операционной системы, или внутренне реализуемый виртуальной машиной JVM (интерпретатором).
Ну а дальше: если это потоки ядра операционной системы, то при наличии N процессоров (ядер) ваши N потоковых объектов Java будут естественным образом масштабироваться на эти N процессоров, раскладываться 1:1.
Такая ситуация естественным образом наблюдается в компилирующих языках C, C++ и Go (да и то Go под вопросом для разных сред исполнения, операционных систем).
А в любом интерпретирующем языке (или исполняющем байт-код) вот такое естественное отображение потоков языка в потоки операционной системы может быть только если при создании потока Java создаётся новый экземпляр виртуальной машины (JVM), выполняющийся в новом потоке ядра.
А иначе, если потоки выполняются в едином интерпретаторе, то это моделирование потоков, и оно имеет право быть ... за одним исключением: такие потоки не могут быть разнесены между разными процессорами!
Это в точности та история, которая наблюдается в Python (хоть 2, хоть 3), где выполнение на 2-х процессорах 2-х потоков может быть ... вдвое длиннее чем на одном процессоре. Это знаменитая проблема глобальной блокироки GIT в Python.
Ответ на этот вопрос стандарт языка Java не даёт.
И это естественно, потому что это зависит а). от конкретной JVM как в ней это реализовано и б). от платформы, для которой писалась JVM и её технических возможностей.
Следующий вопрос: как обстоит с этим дело в Linux? ... для самых актуальных для Linux JVM, как минимум: Sun/Oracle JDK + OpenJDK.
Где-то проскакивала информация, что (якобы) до JDK 1.2 были реализованы "зелёные" потоки, т.е. моделируемые в рамках единой виртуальной машины, а в нынешних реализациях - это нативные POSIX потоки.
Как это проверить (убедиться)?
Как будут масштабироваться потоки Java на N процессоров?
Потоки в Java...
Когда объект Java наследует Thread или реализует интерфейс Runable - это поток ядра операционной системы, или внутренне реализуемый виртуальной машиной JVM (интерпретатором).
Ну а дальше: если это потоки ядра операционной системы, то при наличии N процессоров (ядер) ваши N потоковых объектов Java будут естественным образом масштабироваться на эти N процессоров, раскладываться 1:1.
Такая ситуация естественным образом наблюдается в компилирующих языках C, C++ и Go (да и то Go под вопросом для разных сред исполнения, операционных систем).
А в любом интерпретирующем языке (или исполняющем байт-код) вот такое естественное отображение потоков языка в потоки операционной системы может быть только если при создании потока Java создаётся новый экземпляр виртуальной машины (JVM), выполняющийся в новом потоке ядра.
А иначе, если потоки выполняются в едином интерпретаторе, то это моделирование потоков, и оно имеет право быть ... за одним исключением: такие потоки не могут быть разнесены между разными процессорами!
Это в точности та история, которая наблюдается в Python (хоть 2, хоть 3), где выполнение на 2-х процессорах 2-х потоков может быть ... вдвое длиннее чем на одном процессоре. Это знаменитая проблема глобальной блокироки GIT в Python.
Ответ на этот вопрос стандарт языка Java не даёт.
И это естественно, потому что это зависит а). от конкретной JVM как в ней это реализовано и б). от платформы, для которой писалась JVM и её технических возможностей.
Следующий вопрос: как обстоит с этим дело в Linux? ... для самых актуальных для Linux JVM, как минимум: Sun/Oracle JDK + OpenJDK.
Где-то проскакивала информация, что (якобы) до JDK 1.2 были реализованы "зелёные" потоки, т.е. моделируемые в рамках единой виртуальной машины, а в нынешних реализациях - это нативные POSIX потоки.
Как это проверить (убедиться)?
Как будут масштабироваться потоки Java на N процессоров?