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

  1. Plānotājs (Go runtime daļa) ievieto jaunas gorutinas globālajā vai vietējā P rindā.
  2. Saistītais M ņem gorutinu no P rindas un izpilda to.
  3. 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ā.
  4. 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
}