Sobes.tech
Middle+

Papasakokite apie konkurencijos valdymo modelį (GMP) Go kalboje.

sobes.tech AI

Atsakymas iš AI

GMP - tai planavimo modelis, kaip vykdyti gorutinas Go kalboje, kur:

  • G (Gorutina): Lengvas vykdymo srautas, abstrakcija virš sisteminių srautų.
  • M (Machine): Operacinės sistemos srautas. Gali vykdyti vieną ar kelias gorutinas.
  • P (Processor): Loginis procesorius, kuris atstovauja kontekstą gorutinų vykdymui. Kiekvienam P priskirtas M, ir P turi vietinę eilę runnable gorutinų. P skaičius dažniausiai yra lygus $GOMAXPROCS (dažniausiai procesoriaus branduolių skaičius).

Veikia taip:

  1. Planavimo sistema (Go runtime dalis) įkelia naujas gorutinas į globalią arba vietinę P eilę.
  2. Susijęs M paima gorutiną iš P eilės ir vykdo ją.
  3. Kai gorutina blokuojasi (pavyzdžiui, laukia I/O arba užrakto):
    • M atjungiasi nuo esamo P.
    • Planavimo sistema bando rasti kitą M, kad jis užimtų tą P, arba sukuria naują.
    • Blokuojama gorutina yra įdedama į specialią eilę.
    • Kai blokavimas pašalinamas, gorutina vėl tampa runnable ir grįžta į P eilę.
  4. Kai gorutina išnaudoja savo laiko kvantą arba aiškiai perduoda valdymą (retai), planavimo sistema gali perjungti M į kitą gorutiną tame pačiame P.

Privalumai:

  • Efektyvus sisteminių srautų M naudojimas.
  • Mažesnės konteksto perėjimo išlaidos nei natūralūs OS srautai.
  • Darbo vagystės mechanizmas (M gali pavogti gorutiną iš kitos P eilės), subalansuojant apkrovą tarp P.

Gorutinos kūrimo pavyzdys:

// main.go
pakuotė main

import (
	"fmt"
	"time"
)

func worker(id int) {
	fmt.Printf("Darbininkas %d pradedamas\n", id)
	time.Sleep(time.Second) // Blokavimas / užimtumo iliustracija
	fmt.Printf("Darbininkas %d baigė\n", id)
}

func main() {
	for i := 1; i <= 5; i++ {
		go worker(i) // Sukuriama nauja gorutina
	}

	time.Sleep(time.Second * 2) // Laukiama gorutinų pabaigos
}