Go (Golang) İleri Seviye Concurrency & Çekirdek

Goroutines & Go Runtime Scheduler: GMP Modeli

Go'nun 2 KB bellek ile milyonlarca mikro iş parçacığını yönetme sırrı: G, M, P.

5 Yaşındaki Çocuğa Anlatır Gibi (Analoji)

Bir restoranda: G (Müşteri siparişi/Goroutine), M (Fiziksel aşçı/OS Thread), P (Aşçının çalıştığı tezgah/Processor bağlamı). Bir aşçı yemeğin kaynamasını beklerken diğer tezgahtaki siparişi çalar (Work Stealing).

Teknik & Mimari Tanım

Goroutine sadece ~2KB stack alanı ile başlar ve dinamik büyür. GMP Modeli: G = Goroutine, M = Machine (OS Thread), P = Processor (Mantıksal CPU bağlamı, GOMAXPROCS). Go Runtime boşta kalan P'lerin diğer P'lerin kuyruğundan iş çalmasını (Work Stealing) sağlayarak maksimum CPU verimi elde eder.

Mülakatta Ne Demelisin? (Kurtarıcı Altın Cevap)

“Go scheduler işletim sistemi çekirdeğinde değil, kullanıcı alanında (User-space) çalışan işbirlikçi ve öncelikli (cooperative & preemptive) bir planlayıcıdır. Syscall veya kanal beklemesinde M bloke olursa P hemen başka bir M ile eşleşerek diğer goroutine'leri koşturmaya devam eder.”

Go (Golang) Örnek Uygulaması
func worker(id int, ch chan int) {
    for n := range ch {
        fmt.Printf("Worker %d: %d\n", id, n*2)
    }
}

func main() {
    ch := make(chan int, 100)
    for i := 1; i <= 3; i++ { go worker(i, ch) } // 3 Goroutine
    for j := 1; j <= 10; j++ { ch <- j }
    close(ch)
}
Mülakat Tuzağı & Adayların En Sık Yaptığı Hata:

Goroutine Leaks: Kapanmayan bir kanalı sonsuza dek bekleyen goroutine'lerin RAM tüketerek sunucuyu kilitlemesi.