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:
- Planavimo sistema (Go runtime dalis) įkelia naujas gorutinas į globalią arba vietinę P eilę.
- Susijęs M paima gorutiną iš P eilės ir vykdo ją.
- 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ę.
- 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
}