Sobes.tech
Middle

Šta je vreme izvršenja (runtime) i kako radi planer (scheduler)?

sobes.tech АИ

Одговор од АИ

Vreme izvršavanja (runtime) u Go je okruženje u kojem se izvršavaju Go programi. Uključuje:

  • Upravljanje memorijom: Sakupljač smeća (garbage collector) automatski upravlja dodelom i oslobađanjem memorije.
  • Planer (scheduler): Upravljanje izvršavanjem gorutina na nitima operativnog sistema.
  • Sistemski pozivi: Obezbeđuje interfejs za interakciju sa operativnim sistemom.
  • Primitivi za sinhronizaciju: Kanali, mutexi i drugi mehanizmi za koordinaciju gorutina.

Planer u Go implementira model M:N (više gorutina na više niti OS-a). Njegove glavne komponente:

  • G (Goroutine): Laka nit za izvršenje, u suštini apstrakcija nad funkcijom.
  • M (Machine): Nit operativnog sistema na kojoj se izvršavaju Go programi.
  • P (Processor): Logički procesor povezan sa nitima OS-a. Čuva lokalnu runnable red gorutina.

Princip rada planera:

  1. Gorutine (G) se kreiraju i dodaju u globalni ili lokalni runnable red.
  2. Nitovi OS-a (M) se povezuju sa logičkim procesorima (P). Broj P je podrazumevano jednak broju CPU jezgara (GOMAXPROCS).
  3. P uzima gorutinu iz svoje lokalne reda. Ako je lokalni red prazan, P pokušava da "ukrade" (steal) gorutine iz reda drugog P ili iz globalnog reda.
  4. M izvršava gorutinu.
  5. Kada gorutina blokira (npr. pri čitanju iz kanala bez podataka ili pri sistemskom pozivu), M se odvoji od P, i P postaje dostupan za izvršavanje druge gorutine. Blokirana gorutina se stavlja u čekanje. Kada se blokada ukloni, gorutina ponovo postaje runnable i vraća se u red.
  6. Ako se M blokira u sistemskom pozivu, on ne zadržava P. Može biti kreiran novi M ili korišćen postojeći, kako bi P mogao da nastavi sa izvršavanjem drugih gorutina.

Ovaj pristup omogućava efikasno korišćenje procesorskih resursa i lako skaliranje paralelnih zadataka, skrivajući složenost upravljanja nitima OS-a od programera.

// Primer kreiranja gorutine
func myFunc() {
	// Kod gorutine
}

func main() {
	go myFunc() // Pokretanje gorutine
	// Glavni program nastavlja izvršavanje paralelno
}