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
runnablejärjekorda gorutinite jaoks.
Ajakava tööpõhimõte:
- Gorutined (G) luuakse ja lisatakse globaalsesse või kohalikku
runnablejärjekorda. - OS niidid (M) on seotud loogiliste P-dega. P-de arv on tavaliselt võrdne CPU tuumade arvuga (
GOMAXPROCS). - 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.
- M täidab gorutine.
- 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
runnableja pannakse tagasi järjekorda. - 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
}