2010-12-13 4 views
23

Java Threads/OS Threads와 Interpreted 언어로 엉망이 된 것 같습니다.Java Threads 대 OS Thread

시작하기 전에 Green Threads는 Java Threads이며 JVM에서 스레딩을 처리하고 전체 Java 프로세스가 단일 OS Thread로만 실행된다는 것을 이해합니다. 따라서 다중 프로세서 시스템에서는 쓸모가 없습니다.

내 질문에 대한 답변입니다. 두 개의 스레드 A와 B가 있습니다. 각 스레드는 10 만 줄의 독립 코드가 있습니다. 다중 프로세서 시스템의 Java 프로그램에서이 스레드를 실행합니다. 각 스레드는 다른 CPU에서 실행될 수있는 원시 OS 쓰레드가 주어질 것입니다. 그러나 자바가 해석되기 때문에이 쓰레드는 바이트 코드를 기계 명령어로 변환하기 위해 JVM과 다시 상호 작용해야합니다. 내가 맞습니까? 그렇다면 작은 프로그램보다 Java 스레드가 큰 이점이 아닐까요?

일단 핫스팟이이 두 실행 경로를 컴파일하면 모두 네이티브 스레드만큼 좋을 수 있습니까? 내가 맞습니까?

[편집] : 대체 질문은 JIT 컴파일되지 않은 코드가있는 단일 Java 스레드가 있다고 가정 할 때 해당 스레드를 만들고 시작() 할 수 있습니까? OS 스레드와 JVM이 상호 작용하여 해당 바이트 코드를 실행하는 방법은 무엇입니까?

감사

답변

25
각 스레드가 다른 CPU에서 실행할 수있는 실행하는 기본 OS 스레드를 부여되지만 자바이기 때문에 이 스레드가 다시 JVM과 상호 작용하는 을 필요로 해석 다시 바이트를 변환

코드 에 코드를 추가 하시겠습니까? 내가 맞습니까?

두 가지를 혼합합니다. VM에 의해 수행 된 JIT와 VM에 의해 제공되는 스레딩 지원. 내부 깊숙한 곳에서 당신이하는 모든 일은 일종의 원시 코드로 번역됩니다. 스레드를 사용하는 바이트 코드 명령어는 스레드에 액세스하는 JIT 코드와 다르지 않습니다.

그렇다면 작은 프로그램보다 Java 스레드가 큰 장점이되지 않습니까?

여기에 작은 값을 지정하십시오. 수명이 짧은 프로세스의 경우 예, 스레딩은 순차 실행이 빠르기 때문에 큰 차이를 만들지 않습니다. 이 문제는 해결되는 문제에 따라 달라집니다. UI 툴킷의 경우 응용 프로그램이 아무리 작은 경우에도 UI를 응답 성있게 유지하려면 일종의 스레딩/비동기 실행이 필요합니다.

스레딩은 이 병렬로 실행될 때 의미가 있습니다. 전형적인 예는 쓰레드에서 많은 IO를 수행하고 다른 쓰레드에서 계산을하는 것입니다. 메인 스레드가 IO 처리를 차단했기 때문에 처리를 막고 싶지 않을 것입니다.

핫스팟이 실행 경로 모두 좋은 네이티브 스레드 수 있습니다 모두 컴파일하면

? 내가 맞습니까?

첫 번째 지점을 참조하십시오.

스레딩은 실제로 "이 코드를 더 빨리 만들 수있는 스레드 사용"에 대한 오해에서 비롯된은 총알이 아닙니다. 약간의 독서와 경험이 최선의 방법이 될 것입니다. this awesome book 사본을 가져 오는 것이 좋습니다. :-)

@Sanjay : Infact 이제 내 질문을 재구성 할 수 있습니다. 내가 코드가 JIT되지 않은 스레드가 있다면 OS 스레드는 어떻게 실행합니까?

다시 말하면 쓰레딩은 JIT와 완전히 다른 개념입니다. 의 간단한 측면에서 프로그램의 실행 살펴 봅시다 :

자바 pkg.MyClass -> VM이 방법 가 실행되도록 찾습니다 -> 라인에 의한 방법 라인의 바이트 코드를 실행 시작 ->

012 : 네이티브 상대 각 바이트 코드 변환 명령 - -> OS에 의해 실행되는 명령어는 JIT 가 걷어 때> 명령어는 머신

의해 실행

java pkg.MyClass에 -> VM이 방법 가을 JIT'ed 된 를 실행할 찾아 -> 그 방법에 대한 관련 기본 코드 를 찾습니다 -> OS에서 실행 명령 은 -> 명령은 기계에 의해 을 실행

따라 서 알 수 있듯이 따라야 할 경로에 관계없이 VM 명령어는 특정 시점에서 네이티브 상대 경로에 매핑되어야합니다. 해당 원시 코드가 추가 재사용을 위해 저장되는지 아니면 다른 경우 (버려지는지).

은 따라서 당신이 코드를 스레딩 쓰기 할 때마다, 그것은 네이티브 코드로 변환이며, 귀하의 질문에 대답하고 OS에 의해 를 실행합니다. 그 번역이 즉석에서 수행되는지 아니면 그 시점을 조회하는지는 완전히 다른 문제입니다.

+0

호언 장담 죄송합니다.이 답변은 예상보다 오래 걸렸습니다. ;-) –

+0

@Sanjay : JIT가 올바르게 실행되면 스레드가 처음 실행되기 전에 완료됩니다.Essesntially JVM은 먼저 독립적 인 쓰레드와 실행을위한 OS 쓰레드에 대한 JIT를 수행한다. – Geek

+1

@ Geek : 이미 언급했듯이 JIT와 스레드 실행은 직각이 아닌 두 가지 문제입니다. 예, Thread가 실행하려고하는 코드 조각이 이미 VM에 의해 JIT 화되었을 가능성이 있습니다. 또한 실행의 * 전달 *이 없습니다. Thread 객체에서'start()'메서드가 호출되면, 새로운 네이티브 OS 쓰레드가 생성되고 "Java 쓰레드"와 "OS 쓰레드"사이에는 포워딩이 없다. 또한 JIT는 필수는 아닙니다. 스레드가 현재 JIT 화되지 않은 코드를 실행 중일 수 있습니다. JIT는 성능 관련 최적화입니다. –

7

전체 Java 프로세스는이 사실이 아니라는 단 하나의 OS 스레드

로 실행됩니다. 자바 쓰레드는 사실 네이티브 OS 쓰레드이고 다중 쓰레드 자바 애플리케이션은 실제로 멀티 코어 프로세서 나 멀티 프로세서 플랫폼을 사용한다는 점을 명시하지 않았다.

일반적인 권장 사항은 스레드 수가 코어 수 (계수 1-1.5)에 비례하는 스레드 풀을 사용하는 것입니다. 이것은 JVM이 단일 OS 스레드/프로세스로 제한되지 않는다는 또 다른 힌트입니다. wkipedia에서


는 :

자바 1.1에서

, 녹색 스레드 [4] 적어도 Solaris에서 JVM에 의해 사용되는 유일한 스레딩 모델이었다. 녹색 스레드는 원시 스레드에 비해 몇 가지 제한 사항이 있으므로 이후 Java 버전에서는 원시 스레드을 사용하여 스레드를 삭제했습니다.

2010 년 Java 7 개발 및 Java 8 계획으로 돌아 왔습니다. 역사적인 "녹색 스레드"에 관심이 있습니까?

+0

나는 그린 스레드라고 알려진 JDK i.2 이전의 특정 스레드에 대해서만 이야기했습니다. – Geek

+0

@ Geek - 당신은 "그린 쓰레드"를 언급했지만, 일반적으로 자바 쓰레드에 대한 질문은 (제목을 보았다). 녹색 스레드와 Java 1.1/1.2에만 관심이 있다면 질문을 편집하십시오. –

+0

확실합니다. Green Threads를 실제로 사용하면 JVM이 전체 제어를 가지므로 두 스레드를 실행할 때 JVM에서 바이트 코드 변환을 처리하는 방법을 쉽게 이해할 수 있습니다. 두 스레드가 OS 스레드로 실행될 때이를 파악할 수 없습니다. – Geek

2

바이트 코드 스레딩 및 실행은 별도의 문제입니다. 그린 스레드는 스레드를 기본으로 지원하지 않는 플랫폼에서 JVM에서 사용됩니다. (IMHO는 쓰레드를 지원하지 않는 플랫폼을 모른다.)

바이트 코드는 실시간으로 해석되어 JVM에서 기본 플랫폼으로 실행됩니다. JVM은 가장 인기있는 코드 조각을 결정하고 이러한 조각을 Just in time 컴파일이라고 부릅니다. 따라서 반복해서 컴파일 할 필요가 없습니다. 이는 스레딩에 독립적입니다. 예를 들어 루프에서 동일한 코드 조각을 실행하는 스레드가 하나있는 경우이 조각은 적시 컴파일러에 의해 캐시됩니다.

결론 : 성능과 스레드에 대해 걱정할 필요가 없습니다. Java는 코딩하려는 모든 것을 실행할 수있을 정도로 강력합니다.

+0

Solaris의 Java 1.0은 녹색 스레드를 사용했습니다. 그 이후로 누구도 확신하지 못했지만 디자인에서 허용됩니다. –

+0

JIT 또는 핫스팟을 통해 모든 코드를 작성했다면 두 개의 Java 스레드를 두 개의 OS 스레드로 효과적으로 실행할 수 있다고 말했던 것처럼 말입니다. 하지만 JIT 컴파일은 코드의 첫 번째 패스에서 발생하므로 처음 두 스레드를 시작하는 코드를 실행할 때 두 스레드가 여전히 해석되어야한다고 생각합니다. 따라서 JVM은 두 OS 쓰레드 모두 참여할 것입니다. – Geek

+0

내가 아는 한 JVM은 원시 스레드보다 얇은 래퍼를 생성한다. 한 응용 프로그램의 모든 스레드는 동일한 메모리를 공유하므로 원시 코드로 컴파일 된 코드는 스레드간에 공유됩니다. – AlexR

3
  1. 일부 자바 구현은 PC 사용 멀티 코어 자바의 구현을 당신이 그것을 (A 하나의 기본 스레드에서 JVM에 의해 스케줄링을) 설명처럼 녹색 스레드를 만들 수 있지만 일반 수 있습니다.
  2. JVM 자체가 이미 작업 (가비지 수집, 클래스 로딩, 바이트 코드 확인, JIT 컴파일러)에 다른 스레드를 사용할 수 있습니다.
  3. OS는 JVM이라는 프로그램을 실행합니다. JVM은 Java-Bytecode를 실행합니다. 모든 Java-Thread에 관련 원시 스레드가있는 경우 (이는 의미가 있으며 PC 구현의 경우처럼 보임) 해당 스레드의 JVM 코드는 단일 스레드에서 Java 코드 (JITed 또는 해석 된)를 실행합니다 -프로그램. 멀티 스레딩을 통해 차이점이 없습니다.