CodeBlanks Logo Icon CodeBlanks

G-M-P modeli

Goroutine, makine ve processor üçlüsünü öğrenirsin.

G-M-P modeli

Go zamanlayıcısı üç yapıyla çalışır: G (goroutine: yığını ve durumu), M (machine: bir işletim sistemi iş parçacığı) ve P (processor: çalıştırma hakkı ve yerel kuyruk). Bir G'nin çalışması için bir M'nin bir P tutması gerekir.

P sayısı = GOMAXPROCS (varsayılan: CPU çekirdeği sayısı)
M sayısı = gerektiği kadar (bloklayan syscall'lar için artar)
G sayısı = yüz binler olabilir

Böylece milyonlarca goroutine birkaç OS iş parçacığına çoklanır (M:N zamanlama).

Goroutine neden ucuz?

Bir goroutine yaklaşık 2 KB yığınla başlar ve gerektikçe büyür; OS iş parçacığı ise genellikle 1–8 MB ayırır. Goroutine geçişi çekirdeğe inmeden kullanıcı alanında yapılır, bu yüzden bağlam değişimi çok hızlıdır.

Uygulama P ve CPU

runtime.GOMAXPROCS(0) ile runtime.NumCPU() değerlerini karşılaştır ve P sayısının CPU sayısından büyük olmadığını (<=) yazdır.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "runtime"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Println(runtime.GOMAXPROCS(0) <= runtime.NumCPU())
}

Beklenen çıktı

true

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Aynı anda en fazla kaç goroutine Go kodu çalıştırabilir?

  • Her zaman 1
  • GOMAXPROCS kadar (P sayısı) Doğru cevap
  • Sınırsız
  • M sayısı kadar

Açıklama: Go kodu çalıştırmak için P gerekir; P sayısı GOMAXPROCS'tur. Syscall'da bekleyen M'ler P tutmaz.

2 P sayısını oku

Soru
fmt.Println(runtime.____(0))
Cevap
fmt.Println(runtime.GOMAXPROCS(0))

Açıklama: GOMAXPROCS(0) değeri değiştirmeden mevcut P sayısını döndürür.

3 G, M, P

Kavram Anlamı
G Goroutine
M OS iş parçacığı
P Çalıştırma hakkı + kuyruk
GOMAXPROCS P sayısı

Uzman bölümündeki tüm dersler