Middle+
Pastāstiet par konkurences vadības modeli (GMP) Go valodā.
sobes.tech AI
Atbilde no AI
GMP ir modeļa plānošanas modelis gorutinu izpildei Go valodā, kur:
- G (Goroutine): Viegls izpildes pavedienis, abstrakcija virs sistēmas pavedieniem.
- M (Machine): Operētājsistēmas pavedienis. Var izpildīt vienu vai vairākas gorutinas.
- P (Processor): Loģisks procesors, kas pārstāv kontekstu gorutinu izpildei. Katram P ir piešķirts M, un P satur vietējo runnable gorutinu rindu. P skaits parasti ir vienāds ar
$GOMAXPROCS(parasti procesora kodolu skaits).
Darbojas šādi:
- Plānotājs (Go runtime daļa) ievieto jaunas gorutinas globālajā vai vietējā P rindā.
- Saistītais M ņem gorutinu no P rindas un izpilda to.
- Kad gorutina bloķējas (piemēram, gaidot I/O vai mutexu):
- M atvienojas no pašreizējā P.
- Plānotājs mēģina atrast citu M, lai tas aizņemtu šo P, vai izveido jaunu.
- Bloķētā gorutina tiek novietota īpašā rindā.
- Kad bloķēšana tiek noņemta, gorutina atkal kļūst par runnable un atgriežas P rindā.
- Kad gorutina izsmēlusi savu laika kvantu vai acīmredzami pārtrauc vadību (retāk), plānotājs var pārslēgt M uz citu gorutinu tajā pašā P.
Šāda pieeja sniedz priekšrocības:
- Efektīva sistēmas pavedienu M izmantošana.
- Mazākas konteksta pārslēgšanas izmaksas salīdzinājumā ar nativajiem OS pavedieniem.
- Darba zagšanas mehānisms (M var nozagt gorutinu no citas P rindas), līdzsvarojot slodzi starp P.
Gorutinas izveides piemērs:
// main.go
pakešs main
import (
"fmt"
"time"
)
func worker(id int) {
fmt.Printf("Darbinieks %d sākas\n", id)
time.Sleep(time.Second) // Bloķēšana / nodarbinātības ilustrācija
fmt.Printf("Darbinieks %d pabeidz\n", id)
}
func main() {
for i := 1; i <= 5; i++ {
go worker(i) // Izveido jaunu gorutinu
}
time.Sleep(time.Second * 2) // Gaida gorutinu pabeigšanu
}