Sobes.tech
Middle

Kas yra vykdymo laikas (runtime) ir kaip veikia planuotojas (scheduler)?

sobes.tech AI

Atsakymas iš AI

Go vykdymo laikas (runtime) yra aplinka, kurioje vykdomos Go programos. Ji apima:

  • Atminties valdymas: Garbage collector (šiukšlių surinkėjas) automatiškai valdo atminties paskirstymą ir laisvinimą.
  • Planavimo (scheduler): Valdo gorutinių vykdymą operacinės sistemos gijų lygiu.
  • Sisteminiai iškvietimai: Teikia sąsają sąveikai su operacine sistema.
  • Sinchronizacijos primityvai: Kanalai, mutexai ir kiti mechanizmai gorutinių koordinavimui.

Go planuotojas įgyvendina M:N modelį (kelios gorutinos vienu metu veikia keliuose OS gijuose). Jo pagrindiniai komponentai:

  • G (Goroutine): Lengvas vykdymo gijas, iš esmės funkcijos abstrakcija.
  • M (Machine): Operacinės sistemos gija, kurioje vykdomos Go programos.
  • P (Processor): Loginis procesorius, susijęs su OS gija. Laiko vietinę runnable eilę gorutinių.

Planavimo darbo principas:

  1. Gorutinos (G) yra sukuriamos ir pridedamos į globalią arba vietinę runnable eilę.
  2. OS gijos (M) yra susijusios su loginiais P. P skaičius paprastai lygus CPU branduolių skaičiui (GOMAXPROCS).
  3. P pasiima gorutinas iš savo vietinės eilės. Jei vietinė eilė tuščia, P bando "pasiskolinti" (steal) gorutinas iš kitos P eilės arba iš globalios eilės.
  4. M vykdo gorutinas.
  5. Kai gorutina blokuojasi (pavyzdžiui, skaitydama iš kanalo be duomenų arba atliekant sisteminį iškvietimą), M atjungiasi nuo P, ir P tampa prieinama kitai gorutinai. Blokuojama gorutina būna laukimo režime. Kai blokavimas pašalinamas, gorutina vėl tampa runnable ir įdedama į eilę.
  6. Jei M blokuojasi sistemos iškvietimo metu, jis neapima P. Gali būti sukurtas naujas M arba naudojamas esamas, kad P galėtų tęsti kitų gorutinių vykdymą.

Šis požiūris leidžia efektyviai naudoti procesoriaus išteklius ir lengvai mastelinti paralelines užduotis, paslėpiant OS gijų valdymo sudėtingumą nuo programuotojo.

// Gorutinos kūrimo pavyzdys
func myFunc() {
	// Gorutinos kodas
}

func main() {
	go myFunc() // Gorutinos paleidimas
	// Pagrindinė programa tęsia vykdymą paraleliai
}