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

  1. Planeerija (Go runtime osa) asetab uued gorutinad globaalsesse või kohaliku P järjekorda.
  2. Seotud M võtab P järjekorrast gorutina ja täidab selle.
  3. 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.
  4. 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
}