Как многопоточная программа Java способна использовать несколько процессорных ядер? - PullRequest
17 голосов
/ 11 апреля 2011

Может ли кто-нибудь объяснить, как многопоточная программа Java (например, контейнер сервлета Tomcat) может использовать все ядра ЦП, когда JVM - это всего лишь один процесс в Linux? Есть ли какая-нибудь хорошая статья, которая подробно описывает предмет?

РЕДАКТИРОВАТЬ # 1 : Я не ищу совета, как реализовать многопоточные программы на Java. Я ищу объяснение того, как JVM внутренне удается использовать несколько ядер в linux / windows, оставаясь при этом единым процессом в ОС.

EDIT # 2 : Лучшее объяснение, которое мне удалось найти, заключается в том, что Hotspot (Sun / Oracle JVM) реализует потоки как собственные потоки в Linux с использованием NPTL. Так что более менее каждый поток в Java - это легкий процесс (собственный поток) в Linux. Это ясно видно по команде ps -eLf, которая выводит не только идентификатор процесса (PPID), но и идентификатор собственного потока (LWP).

Более подробную информацию можно также найти здесь:

РЕДАКТИРОВАТЬ # 3 : В Википедии есть небольшая, но приятная статья по NPTL с некоторыми дополнительными ссылками http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library

Ответы [ 4 ]

11 голосов
/ 11 апреля 2011

Ядро Linux поддерживает потоки как первоклассные граждане.Фактически, ядро ​​потока не сильно отличается от процесса, за исключением того, что оно разделяет адресное пространство с другим потоком / процессом.

Некоторые старые версии ps даже показывали отдельный процесс для каждого потокапо умолчанию и более новые версии могут включать это поведение, используя флаг -m.

4 голосов
/ 11 апреля 2011

JVM - это отдельный процесс с множеством потоков.Каждый поток может быть запланирован на другое ядро ​​процессора.Один процесс может иметь много потоков.

Когда программное обеспечение Java, работающее внутри JVM, запрашивает другой поток, JVM запускает другой поток.

Именно так JVM удается использовать несколько ядер.*

3 голосов
/ 11 апреля 2011

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

Взгляните на это http://embarcaderos.net/2011/01/23/parallel-processing-and-multi-core-utilization-with-java/

2 голосов
/ 11 апреля 2011

Я бы начал с чтения Учебника по параллелизму .

В частности, он объясняет различия (и отношения) между процессами и потоками .

На архитектурах, с которыми я знаком, потоки (включая потоки, созданные JVM) управляются ОС.JVM просто использует средства потоков, предоставляемые операционной системой.

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