Подтвердить что ты не робот

Как многопоточная программа Java может использовать несколько ядер процессора?

Может ли кто-нибудь объяснить, как многопоточная программа 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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 4

Я бы начал с чтения Concurrency Tutorial.

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

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