Go runtime bao gồm một scheduler ghép nhiều goroutine lên một số nhỏ các OS thread. Lập lịch M:N này (M goroutine trên N OS thread) là thứ khiến goroutine rẻ đến vậy và concurrency của Go có khả năng mở rộng đến vậy. Hiểu nó giải thích hiệu năng goroutine.
Mô hình G-M-P
G (Goroutine) — tác vụ concurrent của bạn (nhẹ, stack ~2KB lúc đầu)
M (Machine) — một OS thread (thread thực mà OS lập lịch)
P (Processor) — một bộ xử lý logic / ngữ cảnh lập lịch; giữ một hàng đợi các G có thể chạy
(số lượng P = GOMAXPROCS, mặc định = số core CPU)
Scheduler chạy các G trên các M, được điều phối qua các P:
Mỗi P có một hàng đợi chạy cục bộ các goroutine; một M phải giữ một P để chạy các G.
