Go 런타임은 많은 goroutine을 적은 수의 OS 스레드에 다중화하는 스케줄러를 포함합니다. 이 M:N 스케줄링(M개의 goroutine을 N개의 OS 스레드에)이 goroutine을 그토록 저렴하게 하고 Go의 동시성을 확장 가능하게 만드는 것입니다. 이를 이해하면 goroutine 성능이 설명됩니다.
G-M-P 모델
G (Goroutine) — 여러분의 동시 작업(가벼움, 시작 시 약 2KB 스택)
M (Machine) — OS 스레드(OS가 스케줄링하는 실제 스레드)
P (Processor) — 논리 프로세서 / 스케줄링 컨텍스트; 실행 가능한 G의 큐를 보유
(P의 수 = GOMAXPROCS, 기본값 = CPU 코어 수)
스케줄러가 P를 통해 조율하여 M에서 G를 실행:
각 P는 로컬 실행 큐를 가짐; M은 G를 실행하려면 P를 보유해야 함.
런타임은 논리 프로세서(P)를 통해 많은 goroutine(G)을 OS 스레드(M)에 매핑합니다. 기본적으로 CPU 코어당 하나의 P()가 있으며, 각각 실행 준비된 goroutine 큐를 가집니다.
