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.