Middle+
Go dilində rəqabət idarəetmə nümunəsi (GMP) haqqında danışın.
sobes.tech Süni İntellekt
AI-dan cavab
GMP, Go-da goroutinların icrasını planlaşdırma modelidir və burada:
- G (Goroutine): Yüngül çəkili icra axını, sistem axınları üzərində abstraksiya.
- M (Machine): Əməliyyat sisteminin bir axını. Bir və ya bir neçə goroutin kodunu icra edə bilər.
- P (Processor): Məntiqi prosessor, goroutinların icrası üçün kontekstə bənzəyir. Hər P-yə M təyin edilir və P-də işlək vəziyyətdə olan goroutinların yerli növbəsi var. P-nin standart sayı
$GOMAXPROCS(adətən prosessor nüvələrinin sayı).
İş prinsipi:
- Go-nun çalışma zamanı (runtime) yeni goroutinları P-nin qlobal və ya yerli növbələrinə yerləşdirir.
- P ilə əlaqəli M, P-dən goroutin alır və onu icra edir.
- Goroutin bloklandıqda (məsələn, I/O gözləyərkən və ya mutexdə):
- M mövcud P-dən ayrılır.
- Planlayıcı başqa bir M tapmağa çalışır və ya yeni M yaradır.
- Bloklanan goroutin xüsusi növbəyə yerləşdirilir.
- Blokdan çıxarıldıqda, goroutin yenidən işlək vəziyyətə keçir və P-nin növbəsinə qayıdır.
- Goroutin vaxt kvantını tükətdikdə və ya açıq şəkildə idarəetməni ötürəndə (nadiren), planlayıcı M-ni başqa bir goroutin ilə dəyişə bilər.
Bu yanaşmanın üstünlükləri:
- M sistem axınlarının səmərəli istifadəsi.
- Nativ sistem axınlarına nisbətən kontekst dəyişdirmə xərclərinin azaldılması.
- "Work stealing" mexanizmi ilə P arasında yük balanslaşdırılması (M, başqa P-nin növbəsindən goroutin oğurlaya bilər).
Goroutin yaratma nümunəsi:
// main.go
package main
import (
"fmt"
"time"
)
func worker(id int) {
fmt.Printf("İşçi %d başlayır\n", id)
time.Sleep(time.Second) // Bloklama/nəzarət nümunəsi
fmt.Printf("İşçi %d bitir\n", id)
}
func main() {
for i := 1; i <= 5; i++ {
go worker(i) // Yeni goroutin yaradılır
}
time.Sleep(time.Second * 2) // Goroutinların bitməsini gözləyirik
}