Sobes.tech
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:

  1. Gorutyna (G) jest przypisana do P.
  2. P łączy się z M (wątkiem systemowym).
  3. M wykonuje gorutynę.
  4. 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ć
}