Middle
Mis on nälgimine (starvation) mitme lõime kontekstis?
sobes.tech AI
Vastus AI-lt
Seisund, kus üks või mitu gorutini (liini, protsessi) ei pääse kunagi juurde ressursile (näiteks mutex, kanal), mis on neile vajalik jätkamiseks, samal ajal kui teised gorutini pidevalt sellele ressursile juurde pääsevad. See toimub ebaõige planeerimise või ebaefektiivsete sünkroniseerimismehhanismide tõttu, näiteks prioriteetide või liigse lukustamise tõttu.
Näide:
package main
import (
"fmt"
"sync"
"time"
)
var (
mu sync.Mutex
counter int
)
func worker(id int) {
for {
mu.Lock() // Kaitseme ressurssi (counter)
// Siin võib tekkida nälg, kui teised gorutini
// pidevalt lukustavad mutexi ja hoiavad seda pikka aega.
counter++
fmt.Printf("Tööline %d suurendas loendurit kuni %d\n", id, counter)
time.Sleep(10 * time.Millisecond) // Töö imiteerimine
mu.Unlock()
// Lisame väikese viivituse, et plaanija saaks vahetada
time.Sleep(1 * time.Millisecond)
}
}
func main() {
for i := 0; i < 5; i++ {
go worker(i)
}
// Programm töötab piiramatu aja,
// kuid mõned töötoad võivad kogeda nälga
// sõltuvalt plaanijast ja koormusest.
select {}
}
Nälga minimeerimiseks kasutatakse:
- Õiglased lukud (fair locks): Tagavad, et voodid saavad juurdepääsu ressursile päringujärjekorras.
- Juhuslikkus: Juhuslikkuse sisseviimine, et valida voog, mis saab juurdepääsu ressursile.
- Aja piirangud: Piirangute seadmine ootamise ajale ressursile.
- Prioriteedi pöörde vältimine: Vältida olukordi, kus kõrge prioriteediga protsess ootab madala prioriteediga protsessi.
Go standardmutexid ei taga õiglust, mis võib viia nälga teatud tingimustel.