2009-11-16 5 views
28

Go의 멀티 스레드 접근 방식과 pthread, boost :: thread 또는 Java Threads와 같은 다른 접근 방식의 차이점은 무엇입니까?Go의 멀티 스레딩과 pthread 또는 Java Threads의 차이점은 무엇입니까?

+1

여기에 관심있는 것은 "전체적으로 멀티 스레딩 기능"이라고 생각합니다. – jldupont

+0

그들이 발표 한 지 불과 며칠이 지났습니다. 이미 Google에 대한 약 70 가지 질문이 있습니다. Google의 힘. –

답변

23

Day 3 Tutorial <에서 인용 - 자세한 내용은이 부분을 참조하십시오.

필요에 따라 시스템 스레드에 골 루틴이 다중화됩니다. goroutine 이 블로킹 시스템 호출을 실행하면 다른 goroutine이 차단됩니다.

우리는 어떤 점에서 CPU 바인딩 goroutines에 대한 동일한 작업을 수행하지만, 지금은 당신은 당신이 GOMAXPROCS $를 설정해야합니다 사용자 수준의 병렬 처리를합니다. 또는 런타임으로 전화하십시오 .GOMAXPROCS (n).

goroutine은 반드시 OS 스레드와 일치 할 필요는 없습니다. 초기 스택 크기가 더 작을 수 있으며 필요에 따라 스택이 커집니다.

여러 gorouitine은 필요할 때 단일 스레드로 다중화 될 수 있습니다.

더 중요하게도, goroutine은 그 자체를 차단할 수도 있지만 다른 goroutine을 차단하지 않는 순차적 프로그램이라는 개념이 위에 설명 된 것과 같습니다.

goroutines는 gccgo에서 pthread로 구현되므로 OS 스레드와 동일 할 수 있습니다. 프로그래밍 할 때 OS 쓰레드 개념과 멀티 쓰레딩에 대한 개념을 분리합니다.

+0

튜토리얼에 대한 링크가 깨졌습니다. http://go.googlecode.com/hg-history/release-branch.r60/doc/GoCourseDay3.pdf와 같은 모양입니다. – I82Much

13

IMO, Go에서 멀티 스레딩을 만드는 것은 커뮤니케이션 기능입니다. 통신 인프라 (뮤텍스, 대기열 등)를 구축해야하는 pthread와 달리 Go에서는 기본적으로 편리한 형식으로 사용할 수 있습니다.

요컨대, 좋은 통신 설비 (말하기에 알랭에 가깝습니다) 때문에 스레드를 사용하는 데 "저 마찰"이라는 문자가 있습니다 ().

14

참조 컴파일러 (5g/6g/8g)에서 마스터 스케줄러 (src/pkg/runtime/proc.c)는 런타임에서 N이 제어되는 N OS 스레드를 생성합니다 .GOMAXPROCS (n) (기본값 1). 각 스케줄러 스레드는 새 goroutine을 마스터 목록에서 끌어 와서 실행을 시작합니다. goroutine은 syscall이 만들어 지거나 (예를 들어 printf) 채널에서 작업이 이루어질 때까지 계속 실행될 것입니다. 그 시점에서 스케줄러는 다음 goroutine을 잡아서 중단 한 지점에서 실행합니다 (gothched() 전화는 src/pkg/runtime/chan.c입니다.

스케줄링은 모든 목적과 목적을 위해 coroutines으로 구현됩니다. 똑같은 기능은 setjmp()와 longjmp(), Go (그리고 lightweight/green 쓰레드를 구현하는 다른 언어들)를 사용하여 똑 바른 C로 작성 될 수 있습니다.

가벼운 스레드의 위쪽은 모든 사용자 공간이므로 "스레드"를 만드는 것이 매우 저렴하고 (작은 기본 스택 할당) 스레드가 서로 이야기하는 방식의 고유 한 구조로 인해 매우 효율적일 수 있습니다. 단점은 스레드가 실제 스레드가 아니라는 것입니다. 즉, 모든 스레드가 동시에 실행되어야하는 경우에도 단일 경량 스레드가 전체 프로그램을 차단할 수 있습니다.

+0

당신이 이것을 대답 한 이래로이 구현에 어떤 업데이트가 있었습니까? – Curious

+1

Go 컴파일러가 이제 자체 호스팅처럼 보이기 때문에 proc.c가 더 이상 존재하지 않습니다. https://golang.org/src/runtime/proc.go – Michaelangel007

4

이전 응답이 언급 한 것처럼, 당신의 성능 향상이 있어야하는 경우 나는 다음과 같은 유용한 발견 그러나 루틴은 반드시 시스템 스레드에 해당하지 않는 이동 멀티 스레딩 지금 :

의 현재 구현 Go 런타임은 기본적으로이 코드를 병렬 처리하지 않습니다. 단일 코어 만 사용자 레벨 처리에 할당합니다. 임의의 수의 goroutine은 시스템 호출에서 차단 될 수 있지만, 기본적으로 오직 하나만 사용자 레벨 코드를 언제든지 실행할 수 있습니다. 그것은 더 똑똑해야하고 하루 더 똑똑한 일 것이지만, 때까지 CPU 병렬을 원한다면 당신은 동시에 실행 코드를 원하는 얼마나 많은 goroutines 런타임을 말해야합니다. 이를 수행하는 두 가지 관련 방법이 있습니다. 환경 변수 GOMAXPROCS로 작업을 실행하여 사용할 코어 수를 설정하거나 런타임 패키지를 가져 와서 runtime.GOMAXPROCS (NCPU)를 호출하십시오. 유용한 값은 runtime.NumCPU()이며 로컬 시스템의 논리 CPU 수를보고합니다. 다시 말하지만,이 요구 사항은 스케줄링 및 실행 시간이 향상됨에 따라 폐기 될 것으로 예상됩니다.

quote source

내 i5 프로세서를 maxes 예제 프로그램이 (htop 100 % 모든 4 개의 코어를 사용합니다)입니다 : 이제

package main 


import (
    "fmt" 
    "time" 
    "runtime" 
) 


func main() { 
    runtime.GOMAXPROCS(4) // Set the maximum number of threads/processes 

    d := make(chan string) 
    go boring("boring!", d, 1) 
    go boring("boring!", d, 2) 
    go boring("boring!", d, 3) 
    go boring("boring!", d, 4) 

    for i := 0; i < 10; i++ { 
     time.Sleep(time.Second); 
    } 

    fmt.Println("You're boring; I'm leaving.") 
} 

func boring(msg string, c chan string, id int) { 
    for i := 0; ; i++ { 

    } 
} 

실제로 '수행'하지 않는다 아무것도 아니지만 Java와 같은 다른 언어로 다중 스레드 응용 프로그램을 작성하는 것과 비교하여 얼마나 짧고/쉽고/간단한 지보십시오.

관련 문제