Sobes.tech
Junior — Middle

Puteți explica cum este implementat mecanismul planificatorului de sarcini în sistem?

sobes.tech AI

Răspuns de la AI

În Go, planificatorul (scheduler) este implementat ca parte a runtime-ului și se ocupă de gestionarea goroutine-urilor, care sunt fire ușoare. Principii de bază:

  • Există mai multe fire de sistem (M), pe care rulează goroutine-uri (G).
  • Planificatorul le leagă pe goroutine-uri de fire prin intermediul obiectelor P (processor), care gestionează cozile de goroutine-uri gata de executat.
  • Goroutine-urile sunt plasate în coadă, iar planificatorul alege următoarea pentru execuție.
  • Dacă o goroutine se blochează (de exemplu, la intrare/ieșire), planificatorul trece la alta.

Exemplu de creare și rulare a unei goroutine:

package main

import (
    "fmt"
    "time"
)

func task(id int) {
    fmt.Printf("Sarcina %d a început\n", id)
    time.Sleep(time.Second)
    fmt.Printf("Sarcina %d a terminat\n", id)
}

func main() {
    for i := 1; i <= 3; i++ {
        go task(i) // pornește o goroutine
    }
    time.Sleep(2 * time.Second) // așteaptă finalizarea
}

Astfel, planificatorul Go distribuie eficient execuția mai multor goroutine-uri pe un număr limitat de fire de sistem, asigurând concurență și paralelism.