Go와 Java가 사용자 공간 스레드를 사용한다는 사실이 실제로 여러 코어를 활용할 수 없다는 것을 의미하지 않습니까?

StackOverflow https://stackoverflow.com/questions/1739799

문제

우리는 요즘 운영 체제 수업의 스레드에 대해 이야기 해 왔으며 한 가지 질문이 제 생각에 올랐습니다.

Go (및 Java)는 커널 스레드 대신 사용자 공간 스레드를 사용하기 때문에 OS가 CPU 시간을 스레드 자체가 아닌 프로세스에만 할당하기 때문에 여러 코어의 장점을 효과적으로 취할 수 없다는 것을 의미하지 않습니까?

이것은 당신이 할 수 없다는 사실을 확인하는 것 같습니다

Wikipedia도 그렇게 생각하는 것 같습니다

도움이 되었습니까?

해결책

GO가 사용자 공간 스레드를 사용한다고 생각하는 이유는 무엇입니까?

그렇지 않습니다. os-shreads를 사용하고 여러 코어를 활용할 수 있습니다.

기본적으로 GO는 1 스레드 만 사용하여 프로그램을 실행한다는 사실에 당황 할 수 있습니다. 두 번 시작하면 goroutines 그들은 하나의 스레드로 실행됩니다. 그러나 I/O GO를위한 하나의 고루틴 블록이 두 번째 스레드를 생성하고 새 스레드에서 다른 Goroutine을 계속 실행하는 경우.

완전한 멀티 코어 전원을 잠금 해제하려면 GOMAXPROCS() 기능.

runtime.GOMAXPROCS(4); //somewhere in main

이제 프로그램은 4 개의 OS- 스레드 (1 대신)를 사용하며 EG 4 코어 시스템을 완전히 사용할 수 있습니다.

다른 팁

Java 스레드를 사용한 일대일 매핑은 반드시 비록 OS 스레드를 사용하는 가장 최근의 Java 버전. Java는 많은 하드웨어 스레드에서 분명히 잘 작동합니다.

나는 "사용자 공간 스레드"로 당신은 (예를 들어) Go의 Goroutines를 의미한다고 가정합니다.

동시성을 위해 고루틴을 사용하는 것이 (손과 과학적 계산에 따라) 작업 단위를 OS 스레드에 할당하기위한 특수 목적 알고리즘을 설계하는 것보다 덜 효율적이라는 것은 사실입니다.

그러나 모든 GO 프로그램은 환경에 위치하고 있으며 특정 문제를 해결하도록 설계되었습니다. 환경이 GO 프로그램에 참여하는 각 요청에 대해 새로운 Goroutine을 시작할 수 있습니다. 환경이 GO 프로그램에 동시 요청을하는 경우 GO 프로그램이 1 OS 스레드를 사용하는 경우에도 Goroutines를 사용하는 GO 프로그램이 직렬 프로그램보다 빠르게 실행될 수 있습니다. Goroutines가 더 빠른 속도로 요청을 처리 할 수있는 이유 (1 OS 스레드 만 사용하더라도) GO 프로그램이 A와 관련된 환경의 일부가 순간적으로 다음과 같은 경우 자동으로 GOROUTINE A에서 GOROUTINE B로 전환하기 때문입니다. 대답하다.

그러나 예, Goroutines를 사용하여 여러 OS 스레드에 자동으로 할당하는 것이 작업 단위를 OS 스레드에 할당하기위한 특수 목적 알고리즘을 설계하는 것보다 효율적이지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top