Middle+
Rääkige Go keele konkurentsi juhtimise mustrist (GMP).
sobes.tech AI
Vastus AI-lt
GMP on gorutinite täitmise planeerimudeli Go keeles, kus:
- G (Goroutine): Kerge täitmise voog, abstraktsioon süsteemivoo üle.
- M (Machine): Operatsioonisüsteemi voog. Võib täita ühte või mitut gorutinat.
- P (Processor): Loogiline protsessor, mis esindab konteksti gorutinate täitmiseks. Iga P-le määratakse M ning P sisaldab kohaliku runnable gorutinate järjekorra. P arv tavaliselt võrdub
$GOMAXPROCS-ga (tavaliselt protsessori tuumade arv).
Töötab järgmiselt:
- Planeerija (Go runtime osa) asetab uued gorutinad globaalsesse või kohaliku P järjekorda.
- Seotud M võtab P järjekorrast gorutina ja täidab selle.
- Kui gorutina blokeerub (näiteks oodates I/O või mutexi):
- M lahti ühendub praegusest P-st.
- Planeerija püüab leida teise M, et see hõivaks selle P või loob uue.
- Blokeeritud gorutina asetatakse spetsiaalsesse järjekorda.
- Kui blokeerimine eemaldatakse, muutub gorutina jälle runnable ning naaseb P järjekorda.
- Kui gorutina kasutab oma kvanti või selgelt üle annab juhtimise (harva), võib planeerija vahetada M teise gorutina sama P sees.
Selle lähenemise eelised:
- Efektiivne süsteemivoo M kasutus.
- Vähem kontekstivahetuse kulu võrreldes natiivsete OS voogudega.
- "Work stealing" mehhanism, mille kaudu M võib varastada gorutina teiselt P-lt, tasakaalustades koormust P-de vahel.
Gorutina loomise näide:
// main.go
paki main
import (
"fmt"
"time"
)
func worker(id int) {
fmt.Printf("Tööline %d alustab\n", id)
time.Sleep(time.Second) // Blokeerimine / hõivatusnäide
fmt.Printf("Tööline %d lõpeb\n", id)
}
func main() {
for i := 1; i <= 5; i++ {
go worker(i) // Uue gorutina loomine
}
time.Sleep(time.Second * 2) // Ootab gorutinate lõpetamist
}