Junior — Middle
Czy możesz wyjaśnić, jak działa planista zadań w języku Go i jak współpracuje z wątkami systemowymi?
sobes.tech AI
Odpowiedź od AI
W języku Go planista (scheduler) odpowiada za zarządzanie gorutynami — lekkimi wątkami, które uruchamiają się wewnątrz jednego wątku systemowego (wątku OS).
Go używa modelu M:N, gdzie M to liczba wątków systemowych, a N to liczba gorutyn. Planista rozdziela gorutiny pomiędzy dostępne wątki systemowe, przełączając się między nimi dla efektywnego wykorzystania CPU.
Główne komponenty planisty:
- G (goroutine) — struktura reprezentująca gorutynę.
- M (maszyna) — wątek systemowy, na którym wykonują się gorutiny.
- P (procesor) — logiczny procesor, który łączy G i M, zarządza wykonaniem.
Zasada działania:
- Gorutyna (G) jest przypisana do P.
- P łączy się z M (wątkiem systemowym).
- M wykonuje gorutynę.
- Planista przełącza wykonanie między gorutynami, gdy jedna z nich się zablokuje (np. na wejściu/wyjściu) lub wygaśnie jej kwant czasu.
To pozwala Go efektywnie wykorzystywać zasoby systemowe, zapewniając wysoką konkurencyjność bez konieczności tworzenia wielu ciężkich wątków systemowych.
Przykład tworzenia gorutyny:
func main() {
go func() {
fmt.Println("Witaj z gorutyny")
}()
fmt.Println("Witaj z głównej")
time.Sleep(time.Second) // Czekamy, aby gorutyna zdążyła się wykonać
}