Sobes.tech
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:

  1. Go-nun çalışma zamanı (runtime) yeni goroutinları P-nin qlobal və ya yerli növbələrinə yerləşdirir.
  2. P ilə əlaqəli M, P-dən goroutin alır və onu icra edir.
  3. 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.
  4. 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
}