2010-04-16 4 views
20

jvm 자체가 Java 실행 파일의 바이트 코드를 원시 시스템 코드로 바꾸는 응용 프로그램이라는 것을 이해합니다. 그러나 원시 스레드를 사용할 때는 대답 할 수없는 몇 가지 질문이 있습니다.Java의 원시 스레드와 jvm 이해

  • 모든 스레드는 자신의 특정 실행을 처리 할 수있는 JVM의 자신의 인스턴스를 만들 수 있습니까?
  • 그렇다면 jvm이 다음에 처리 할 스레드를 예약하는 방법이 있어야합니다. 그렇다면 한 번에 하나의 스레드 만 실행할 수 있으므로 Java의 다중 스레드 특성을 렌더링하지 않을까요?

답변

22

모든 스레드가 특정 실행을 처리하기 위해 jvm의 고유 인스턴스를 생성합니까?

아니요. 동일한 JVM에서 실행되므로 (예를 들어) 객체와 클래스 속성을 공유 할 수 있습니다.

그렇지 않으면 다음 그래서 이것은에서 실행 할 수 있습니다 하나 개의 스레드 때문에 쓸모 자바의 멀티 스레드 특성을 렌더링하지 않을 경우는, 다음에 처리 할 스레드를 예약 할 수있는 방법을 위해 JVM을해야합니까 시각?

Java에서 스레드 구현에는 두 가지 종류가 있습니다. 네이티브 스레드는 호스트 OS에서 구현 한 스레드 추상화에 매핑됩니다. OS는 네이티브 스레드 스케줄링과 타임 슬라이싱을 처리합니다.

두 번째 종류의 스레드는 "녹색 스레드"입니다. JVM은 스레드 스케줄링을 구현하면서 JVM 자체에 의해 구현되고 관리됩니다. 녹색 스레드 구현은 Sun JVMs, AFAIK에서 더 이상 지원되지 않습니다.

1

Java 스레드는 기본 OS 스레드에 매핑됩니다. 그들은 JVM 자체와는 거의 관계가 없습니다.

8

모든 스레드가 특정 실행을 처리하기 위해 jvm의 고유 인스턴스를 생성합니까?

아니요, 아니요, JVM에서 실행중인 응용 프로그램은 모두 JVM의 해당 인스턴스 내에있는 많은 스레드를 가질 수 있습니다.

하지 다음 JVM을 않는 경우

예, JVM은 스레드 스케줄러를 가지고 ... 그 다음에 처리 할 스레드를 예약 할 수있는 몇 가지 방법을 가지고 있습니다. 쓰레드 스케줄링을위한 많은 다른 알고리즘들이 있으며, 이들은 JVM 벤더에 의존한다. (일반적으로 Scheduling 흥미로운 주제입니다.)

... 한 번에 하나의 스레드 만 실행 할 수 있기 때문에 그래서 이것은 쓸모없는 자바의 멀티 스레드 특성을 렌더링하지 않는다면?

이 부분에 대해 잘 모르겠습니다. 이것은 스레딩의 일종입니다. 일반적으로 CPU보다 많은 스레드가 있으며 한 번에 두 가지 이상을 실행하려고합니다. 스레딩을 사용하면 다른 스레드가 I/O를 기다리는 동안 하나의 스레드를 처리하는 중이거나 다른 용도로 사용 중이 아닌 것으로 확인하여 CPU의 이점을 최대한 활용할 수 있습니다.

+0

"예, JVM에는 스레드 스케줄러가 있습니다. 스레드 스케줄링을위한 여러 가지 알고리즘이 있으며, 어느 것이 사용되는지는 JVM- 벤더에 따라 다릅니다." 자바 스레드가 네이티브를 생성하기 때문에 오해의 소지가 있다고 생각합니다. 스레드 (녹색 스레드 아님)이면 JVM은 일정을 필요로하지 않거나 OS가 컨텍스트 전환을 통해 수행하므로 일정을 계획하지 않습니다. 내가 맞습니까? 내가 틀렸다면 나를 바로 잡아주세요. – PeerNet

4

Java 스레드는 커널 스레드에 일대일로 매핑 될 수 있습니다. 그러나 그렇게해서는 안됩니다. m 개의 Java 스레드를 실행하는 n 개의 커널 스레드가있을 수 있습니다. 여기서 m은 n보다 훨씬 클 수 있고 n은 프로세서 수보다 커야합니다. JVM 자체는 n 개의 커널 스레드를 시작하고 각 스레드는 Java 스레드를 선택하여 잠시 동안 실행 한 다음 다른 Java 스레드로 전환합니다. 운영 체제는 커널 스레드를 선택하여 CPU에 할당합니다. 따라서 여러 수준의 스레드 스케줄링이있을 수 있습니다. 수천 개의 "Goroutines"가 수십 개의 스레드에 의해 실행되는 GO 프로그래밍 언어를 살펴 보는 것이 좋습니다.

+0

AFAIK 정확하지 않습니다. JVM 스레드는 기본 OS와 1 : 1을 매핑합니다. m : n 매핑을위한 예제를 보여줄 수 있습니까? –

+0

@PiyushKatariya - 플랫폼에 따라 다르다고 생각합니다. 예를 들어, Solaris 용 Sun/Java Java의 Java 9 이전 버전은 모두 N에서 M 스레드 매핑을 지원합니다. http://reins.altervista.org/java/Java_and_Solaris_Threading.htm –