녹색 스레드 대 비 녹색 스레드


79

이러한 유형의 스레드가 제공하는 이점을 이해하고 싶습니다.

  • 어떤 환경에서 녹색 스레드가 녹색이 아닌 것보다 낫습니까? 일부는 녹색 스레드가 멀티 코어 프로세서에 더 좋다고 말합니다.

  • 예상되는 모든 동작 문제.


5
녹색 스레드가 하나의 코어보다 mroe를 사용하지 않기 때문에 멀티 코어 프로세서에 더 적합 할 가능성은 극히 낮습니다. 녹색 스레드가 더 낫다면 스레드를 사용하지 않아야하는 프로그램이있는 것입니다 (때로는 스레드를 사용하지 않아야 할 때 사용됨)
Peter Lawrey

1
쓰레드는 어디에 사용하면 안되나요?
user1657170

답변:


82

Wikipedia 기사 Green Threads 는이를 매우 잘 설명합니다.

녹색 스레드는 "사용자 수준 스레드"입니다. 그것들은 커널이 아닌 "일반적인"사용자 레벨 프로세스에 의해 예약됩니다. 따라서 이러한 기능을 제공하지 않는 플랫폼에서 멀티 스레딩을 시뮬레이션하는 데 사용할 수 있습니다.

특히 Java의 맥락에서 녹색 스레드는 과거의 일입니다. Solaris Developer 's Guide 용 JDK 1.1 문서를 참조하십시오 . (솔라리스에 관한 것이지만 녹색 스레드가 더 이상 사용되지 않는다는 사실은 일반 플랫폼에서 유효합니다.)

녹색 스레드는 버전 1.3 릴리스부터 Linux 용 Sun JVM에서 폐기되었습니다 ( archive.org 에서 Linux 플랫폼의 Java [tm] 기술 참조 ). 2000 년으로 거슬러 올라갑니다. Solaris의 경우 JDK 1.2에서 원시 스레드를 사용할 수있었습니다. 그것은 1998 년으로 거슬러 올라갑니다. Windows에 대한 녹색 스레드 구현이 없다고 생각하지만 그에 대한 참조를 찾을 수 없습니다.

Wikipedia 기사에 언급 된 몇 가지 예외가 있습니다. 주로 저전력 (임베디드) 장치를 위해 수집합니다.


8
고대 의 일 . 지난 세기. 교수님은 최신 정보가 필요합니다.
user207421 2011

1
@ user1657170 : 그들이 아닌 것은 무엇입니까? 어떤 "보조 스레딩"기술을 언급하십니까?
Mat

2
@ user1657170 : 위에서 쓴 내용에서 당신이 말하는 것을 여전히 이해하지 못합니다. 내가 전 썬에서 링크 한 기사를 읽으십시오. 그들은 솔라리스 2.6 주변의 녹색 스레드를 포기했습니다.
Mat

4
@ user1657170 : Fibers (그리고 요즘 거의 모든 플랫폼에서 등장했거나 Erlang 프로세스에서와 같이 본질적으로 영원히 존재했던 모든 관련 / 유사한 것)은 Java에서 사용 된 용어로 녹색 스레드와 관련이 없습니다. 물론 Sun / Oracle에는 네이티브 스레드가 있으며 물론 JVM이이를 사용합니다. 다시 말씀 드리지만, 위의 내용에서 사실적으로 잘못된 부분이있는 경우 정확한 출처를 인용하십시오.
Mat

3
위에 게시 한 세 가지 링크, 특히이 질문에 대해 참조없이 게시 한 내용과 모순되는 Oracle 문서에 대한 링크는 무엇입니까? 나는 귀하의 의견에 대한 답변을 끝냈습니다. 이것은 완전한 시간 낭비입니다.
Mat

23

녹색 스레드는 OS가 아닌 응용 프로그램 수준에서 구현 된 스레드입니다. 이것은 일반적으로 OS가 스레드 API를 제공하지 않거나 필요한 방식으로 작동하지 않을 때 수행됩니다.

따라서 장점은 스레드와 같은 기능을 전혀 얻을 수 없다는 것입니다. 단점은 녹색 스레드가 실제로 여러 코어를 사용할 수 없다는 것입니다.

녹색 스레드를 사용하는 초기 JVM이 몇 개 있었지만 (IIRC는 Linux에 대한 Blackdown JVM 포트가 사용했습니다) 요즘에는 모든 주류 JVM이 실제 스레드를 사용합니다. 여전히 녹색 스레드를 사용하는 임베디드 JVM이있을 수 있습니다.


18
다중 코어 또는 다중 프로세서 아키텍처를 활용하기 위해 여러 원시 스레드를 사용하는 녹색 스레드의 여러 구현이 있습니다. 여기에는 .NET의 스레딩 라이브러리와 Java 용 Quasar 라이브러리가 포함됩니다. 둘 다 코어 수만큼 네이티브 스레드를 사용하고 추가 스레드에 녹색 스레드 / 섬유를 사용하여 네이티브 스레드간에 균형을 맞 춥니 다.
user1657170

23

녹색 스레드 메모리는 OS에서 스택을 생성하는 대신 힙에서 할당됩니다. 이로 인해 동시 스레드가 수십 배 이상 증가 할 수 있습니다. 다른 사람들이 언급했듯이 이것은 다중 프로세서를 자동으로 활용하지 않지만 사용 사례는 일반적으로 I / O를 차단하는 것입니다. 예를 들어 녹색 스레드를 사용하면 10k가 아닌 100k 동시 연결을 처리 할 수 ​​있습니다.

즉, 녹색 스레드는 특정 규모의 IO 바인딩 작업에 더 좋습니다.


3
녹색 스레드를 사용하면 실제로 10 만 개의 동시 연결이 없습니다. 그것은 단지 환상 일뿐 입니다.
Pacerier 2014 년

8
기술적으로는 연결이 동시에 이루어지며 요청을 동시에 처리 할 수 ​​없습니다.
Yike Lu

스택의 위치가 마술처럼 속도를 높이는 것은 아닙니다.
user207421 jul.

녹색 스레드가 클라이언트 화면에 10 만 개의 동시 연결 결과를 표시하는 방법은 무엇입니까? 그거 환상인가요? 코드가 그것을 생성하지 않는 동안 3D 그래픽을 화면에 환상으로 복제 할 수 있습니까?
user1657170

5

녹색 스레드는 프로세서보다 활성 스레드가 많을 때 기본 스레드보다 훨씬 빠릅니다.

Java는 처음에 녹색 스레드를 지원했지만 대부분의 최신 녹색 스레드 구현과 달리 다중 프로세서로 확장 할 수 없으므로 Java는 다중 코어를 사용할 수 없습니다.

그런 다음 Java는 원시 스레드에만 의존하기 위해 녹색 스레딩을 제거했습니다. 이로 인해 Java 스레드가 녹색 스레드보다 느려졌습니다.

다른 녹색 스레드와는 달리 멀티 코어 또는 멀티 프로세서 시스템에서 확장 할 수 없기 때문에 단점이있는 녹색 스레드의 Java 구현에 대해 구체적으로 이야기하고 있지 않습니다.


녹색 스레드는 컴퓨팅 집약적 인 작업의 경우 훨씬 빠르지 않습니다. 하지만 특정 작업에 사용할 수있는 훌륭한 도구입니다.
JugsteR

네, 그렇습니다. 계산은 빠르지 않지만 스레딩은 더 빠릅니다. 실제 트레드처럼 평 행성을 제공하지 않습니다. 대부분의 스레딩 사례는 컴퓨터 집약적 인 작업을 포함하지 않습니다. 사람들이 쓰레드를 남용하고 아마도 더 많은 상태 머신을 사용하고 그들이하는 일을 절차 적 프로그래밍에 맞춰야한다고 주장 할 수도 있습니다.
user1657170

주어진 컨텍스트가 없으므로 아무 것도 가정하지 마십시오. "일반적인"스레드와 마찬가지로 임의의 수의 CPU에서 녹색 스레드를 실행할 수 있다는 점을 감안할 때이 경우 컴퓨팅 집약적이란 전환이 진행되지 않음을 의미합니다. 스위칭이 없기 때문에 이러한 목적으로 녹색 스레드를 사용하는 이점이 사라집니다. 불명확 한 경우 죄송합니다. 따라서 제가 이야기 한 특정 시나리오의 녹색 스레드는 성능상의 이점을 제공하지 않습니다.
JugsteR

4

녹색 스레드는 커널 수준 스레드가 아니라 사용자 수준 스레드입니다. 커널이 아닌 사용자 라이브러리에 의해 예약됩니다. OS 스케줄러에 의존하지 않고 스레드를 스케줄링하는 자체 스케줄링 메커니즘을 가질 수 있습니다.

녹색 스레드는 기본 OS 기능에 의존하지 않고 다중 스레드 환경을 에뮬레이션하고 커널 공간 대신 ​​사용자 공간에서 관리되므로 기본 스레드 지원이없는 환경에서 작업 할 수 있습니다.

Performace :

멀티 코어 프로세서에서 네이티브 스레드 구현은 작업을 여러 프로세서에 자동으로 할당 할 수 있지만 녹색 스레드 구현은 일반적으로 할 수 없습니다. 녹색 스레드는 스레드 활성화 및 동기화에서 Linux 기본 스레드보다 성능이 훨씬 뛰어납니다.

녹색 스레드가 차단 시스템 호출을 실행하면 해당 스레드가 차단 될뿐만 아니라 프로세스 내의 모든 스레드가 차단됩니다.


1
프로세스의 모든 녹색 스레드가 어떻게 차단됩니까? 이 프로세스에 여러 커널 스레드와 녹색 스레드를 디스패치하는 실행기 서비스가 있으면 어떻게됩니까? syscall을 수행하는 스레드가 단순히 다른 작업을 전달하지 않으면 어떻게 될까요? 귀하의 주장은 단일 스레드 환경에서만 사실입니다.
marctrem

2
내가 의미하는 바는 프로세스의 n 녹색 스레드에 대해 1 개의 커널 스레드가 있고 1 개의 녹색 스레드가 차단 호출 (단일 커널 스레드가 처리)을 수행하면 해당 커널 스레드에 해당하는 모든 녹색 스레드가 차단된다는 것입니다. 분명히 이것은 프로세스에 대해 n 개의 녹색 스레드에 매핑 된 m 개의 커널 스레드에 대해서는 사실이 아닙니다. 두 경우 모두 단일 스레드 환경이라고 말할 수 없습니다. 커널 스레드 스케줄링에 따라 다릅니다.
Aniket Thakur

2

녹색 스레드는 OS에 의해 예약되지 않습니다.

즉, 이들에 대한 스케줄링은 사용자 공간에서 발생하며 커널에 의해 처리되지 않습니다. 이것은 일반적으로 모든 CPU 코어를 사용하도록 녹색 스레드를 만들 수 없음을 의미합니다.

요즘 Java를 실행하는 모든 주류 플랫폼 (예 : x86 또는 x64)의 경우 실제 스레드를 사용하게됩니다.


4
녹색 스레드가 여러 CPU를 사용할 수없는 이유는 없습니다. 예를 들어 GHC 및 Go를 참조하십시오.
rightfold

2

JAVA Multi-Threading은 두 가지 모델로 구현됩니다.

  1. 녹색 스레드 모델
  2. 기본 OS 모델

Green Thread 모델 : 기본 OS 지원없이 JVM에서 관리하는 Thread를 Green Thread라고합니다. Sun Solaris와 같은 소수의 OS는 녹색 스레드 모델을 지원합니다. 더 이상 사용되지 않으며 사용하지 않는 것이 좋습니다.

기본 OS 모델 : 기본 OS의 도움을 받아 JVM이 관리하는 스레드를 기본 OS 모델이라고합니다. 모든 Windows OS는 기본 OS 모델을 지원합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.