Junior — Middle
Hogyan kezeli az operációs rendszer ütemezője egy hálózati kérés végrehajtását végző funkciót?
sobes.tech MI
Válasz az MI-től
A Go-ban a ütemező (scheduler) kezeli a goroutine-okat, amelyek könnyű szálak. Amikor egy függvény hálózati kérést hajt végre, általában blokkolódik bemeneti/kimeneti műveletnél.
A Go ütemező nem-blokkoló bemeneti/kimeneti és aszinkron rendszerhívásokat használ. Amikor egy goroutine hálózati választ vár, az ütemező azt várakozási állapotba helyezi, és más goroutine-okat hajt végre.
Ez hatékonyan használja ki a rendszer erőforrásait, és nem blokkolja az OS szálat. A hálózati kérés befejezése után az ütemező folytatja a goroutine végrehajtását.
Példa:
func fetch(url string) {
resp, err := http.Get(url) // hálózati kérés
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// válasz feldolgozása
}
func main() {
go fetch("http://example.com")
// más goroutine-ok párhuzamosan futnak
}
Így a Go ütemező hatékonyan kezeli a goroutine-okat, blokkoló műveletek, például hálózati kérések közben váltogatva őket.