Java는 다중 코어를 어떻게 사용합니까?
JVM은 단일 프로세스에서 실행되고 JVM의 스레드는 해당 프로세스에 속한 힙을 공유합니다. 그렇다면 JVM은 높은 동시성을 위해 다중 OS 스레드를 제공하는 다중 코어를 어떻게 사용합니까?
여러 스레드를 사용하여 여러 코어를 사용할 수 있습니다. 그러나 시스템에있는 코어 수보다 많은 수의 스레드를 사용하는 것은 단순히 리소스 낭비 일 수 있습니다. availableProcessors () 를 사용 하여 코어 수를 가져올 수 있습니다 .
에서 자바 7 이 포크 / 프레임 워크에 가입 멀티 코어의 메이크업에 사용.
관련 질문 :
녹색 스레드 는 Java 1.2에서 원시 스레드로 대체되었습니다.
OS가 사용 가능한 프로세서를 통해 스레드를 분산하는 경우 Java는 다중 코어의 이점을 얻습니다. JVM 자체는 스레드를 여러 코어에서 균등하게 예약하기 위해 특별한 작업을 수행하지 않습니다. 유의해야 할 몇 가지 사항 :
- 병렬 알고리즘을 구현하는 동안 코어 수만큼 스레드를 생성하는 것이 더 나을 수 있습니다. (
Runtime.getRuntime().availableProcessors()
). 더도 덜도 아니고. java.util.concurrent
패키지에서 제공하는 시설을 활용하십시오 .- 개인 라이브러리에 Java Concurrency in Practice 가 있는지 확인하십시오 .
JVM은 단일 프로세스에서 실행되고 JVM의 스레드는 해당 프로세스에 속한 힙을 공유합니다. 그렇다면 JVM은 높은 동시성을 위해 다중 OS 스레드를 제공하는 다중 코어를 어떻게 사용합니까?
Java는 다중 CPU 시스템에서 실행되는 경우 기본 OS의 스레드를 사용하여 다른 CPU에서 코드를 실행하는 실제 작업을 수행합니다. 각 Java 스레드가 시작되면, 그것은 연관된 OS 스레드를 생성하고 OS 스케줄링에 대한 책임, 등 JVM을 특정 일부 관리를 수행하고 같은 스레드 및 Java 언어 구조의 추적 volatile
, synchronized
, notify()
, wait()
, 등 모든 실행에 영향을 OS 스레드의 상태.
JVM은 단일 프로세스에서 실행되고 JVM의 스레드는 해당 프로세스에 속한 힙을 공유합니다.
JVM은 "단일 프로세스에서 실행"할 필요가 없습니다. 가비지 수집기 및 기타 JVM 코드도 다른 스레드에서 실행되고 OS는 종종 이러한 다른 스레드를 다른 프로세스로 표시하기 때문입니다. 예를 들어 Linux에서 프로세스 목록에 표시되는 단일 프로세스는 종종 여러 스레드 프로세스를 가장합니다. 단일 코어 머신을 사용하는 경우에도 마찬가지입니다.
그러나 모두 동일한 힙 공간을 공유한다는 것은 맞습니다. 그들은 실제로 코드, 인턴 문자열, 스택 공간 등을 의미하는 동일한 전체 메모리 공간을 공유합니다.
그렇다면 JVM은 높은 동시성을 위해 다중 OS 스레드를 제공하는 다중 코어를 어떻게 사용합니까?
스레드는 몇 가지 이유에서 성능 향상을 얻습니다. 분명히 직접적인 동시성은 종종 프로그램을 더 빠르게 실행합니다. 동시에 여러 CPU 작업을 수행 할 수 있으면 애플리케이션의 처리량이 향상 될 수 있습니다 (항상 그런 것은 아님). 또한 IO 작업을 단일 스레드로 격리 할 수 있습니다. 즉, 스레드가 IO를 기다리는 동안 다른 스레드가 실행될 수 있습니다 (디스크 / 네트워크에 대한 읽기 / 쓰기 등).
그러나 메모리 측면에서 스레드는 로컬 CPU 당 캐시 된 메모리로 인해 성능이 크게 향상됩니다. 스레드가 CPU에서 실행될 때 CPU 용 로컬 고속 메모리 캐시는 스레드가 중앙 메모리를 읽거나 쓰는 데 시간을 소비하지 않고도 저장소 요청을 로컬로 격리하는 데 도움이됩니다. 이 이유 volatile
와 synchronized
스레드가 작업을 조정할 필요하거나 서로 통신 할 때 캐시 메모리는 메인 메모리에 플러시 또는 무효로하기 때문에 호출은 메모리 동기화 구조를 포함한다.
참고 URL : https://stackoverflow.com/questions/4436422/how-does-java-makes-use-of-multiple-cores
'program tip' 카테고리의 다른 글
Ruby를 사용하여 명령을 5 번 실행하려면 어떻게해야합니까? (0) | 2020.11.26 |
---|---|
app.xaml에서 기본 WPF 창 스타일을 설정하는 방법은 무엇입니까? (0) | 2020.11.25 |
파생 클래스가이 코드에서 보호 된 멤버 함수를 호출 할 수없는 이유는 무엇입니까? (0) | 2020.11.25 |
srcdoc =“…”와 src =“data : text / html,…”의 차이점은 (0) | 2020.11.25 |
모든 공백을 무시하도록 vimdiff를 구성하는 방법이 있습니까? (0) | 2020.11.25 |