Sobes.tech
Junior — Middle

U kom slučaju i kako niti mogu pristupiti globalnoj redi za dobijanje zadataka i pokretanje gorutina?

sobes.tech АИ

Одговор од АИ

U Go, runtime koristi model M:N, gde su M sistemski thread-ovi, a N goroutine-ovi. Goroutine-ovi nisu direktno povezani sa određenim thread-ovima, već se izvršavaju u pool-u thread-ova.

Globalna red čekanja zadataka je red čekanja goroutine-ova spremnih za izvršenje, ali još uvek ne dodeljenih određenom thread-u. Kada thread postane slobodan, on se obraća na ovu globalnu red čekanja da bi dobio sledeću goroutine za pokretanje.

Ovo se dešava otprilike ovako:

  • Kada se kreira goroutine (kroz go), ona se stavlja u globalnu red čekanja.
  • Slobodan thread uzima goroutine iz globalne red čekanja i počinje da je izvršava.
  • Ako thread ne pronađe zadatke u svojoj lokalnoj red čekanju, obraća se na globalnu.

Na ovaj način, thread-ovi dinamički dobijaju zadatke iz globalne red čekanja i pokreću odgovarajuće goroutine-ove, obezbeđujući balansiranje opterećenja i efikasno korišćenje sistemskih resursa.

Primer (pojednostavljeno):

// Kreiramo više goroutine-ova
for i := 0; i < 10; i++ {
    go func(n int) {
        fmt.Println("Goroutine", n)
    }(i)
}

Runtime postavlja ove goroutine-ove u globalnu red čekanja, a sistemski thread-ovi ih preuzimaju za izvršenje.