Sobes.tech
Middle

Mis on täitmisajava (runtime) ja kuidas tööaeg (scheduler) töötab?

sobes.tech AI

Vastus AI-lt

Go tööaeg (runtime) on keskkond, kus töötavad Go programmid. See hõlmab:

  • Mälu haldus: Garbage collector (prügikoguja) haldab automaatselt mäe eraldamist ja vabastamist.
  • Ajakava (scheduler): Juhtib gorutinite täitmist operatsioonisüsteemi niitidel.
  • Süsteemkutsed: Pakub liidest operatsioonisüsteemiga suhtlemiseks.
  • Sünkroniseerimise primitiivid: Kanalid, muteksid ja teised mehhanismid gorutinite koordineerimiseks.

Go ajakava teostab M:N mudelit (mitu gorutinit ühe või mitme OS niidiga). Selle põhikomponendid:

  • G (Goroutine): Kerge täitmise niit, põhimõtteliselt funktsiooni abstraktsioon.
  • M (Machine): Operatsioonisüsteemi niit, kus töötavad Go programmid.
  • P (Processor): Loogiline protsessor, mis on seotud OS niidiga. Hoidma kohalikku runnable järjekorda gorutinite jaoks.

Ajakava tööpõhimõte:

  1. Gorutined (G) luuakse ja lisatakse globaalsesse või kohalikku runnable järjekorda.
  2. OS niidid (M) on seotud loogiliste P-dega. P-de arv on tavaliselt võrdne CPU tuumade arvuga (GOMAXPROCS).
  3. P võtab gorutine oma kohalikust järjekorrast. Kui kohalik järjekord on tühi, püüab P "varastada" (steal) gorutine teise P järjekorrast või globaalest.
  4. M täidab gorutine.
  5. Kui gorutine blokeerub (näiteks, kui loeb kanalist ilma andmeteta või teeb süsteemkutsed), siis M eraldub P-st ning P muutub saadaval teise gorutine täitmiseks. Blokeeritud gorutine pannakse ooterežiimi. Kui blokeering eemaldatakse, muutub gorutine taas runnable ja pannakse tagasi järjekorda.
  6. Kui M blokeerub süsteemkutses, ei hoia ta P-d. Võib luua uue M või kasutada olemasolevat, et P saaks jätkata teiste gorutinite täitmist.

See lähenemine võimaldab tõhusalt kasutada protsessoriressursse ja hõlpsasti skaleerida paralleelülesandeid, varjates OS niitide haldamise keerukust arendajalt.

// Gorutine loomise näide
func myFunc() {
	// Gorutine kood
}

func main() {
	go myFunc() // Gorutine käivitamine
	// Peamine programm jätkab täitmist paralleelselt
}