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