Sobes.tech
Middle

Šta je starvation (gladovanje) u kontekstu višestrukog pokretanja niti?

sobes.tech АИ

Одговор од АИ

Stanje u kojem jedan ili više gorutina (nitova, procesa) nikada ne pristupaju resursu (npr. mutex, kanal) koji im je potreban za nastavak izvršavanja, dok drugi gorutini stalno pristupaju tom resursu. To se dešava zbog nepravde u planiranju ili neefikasnih mehanizama sinhronizacije, kao što su prioriteti ili prekomerno zadržavanje blokada.

Primer:

package main

import (
	"fmt"
	"sync"
	"time"
)

var (
	mu      sync.Mutex
	counter int
)

func worker(id int) {
	for {
		mu.Lock() // Zaštita resursa (counter)
		// Ovde može doći do gladi ako druge gorutine
		// stalno zauzimaju mutex i dugo ga drže.
		counter++
		fmt.Printf("Radnik %d je povećao brojač na %d\n", id, counter)
		time.Sleep(10 * time.Millisecond) // Simulacija rada
		mu.Unlock()
		// Dodavanje male kašnjenja da bi planer mogao da pređe na drugu gorutinu
		time.Sleep(1 * time.Millisecond)
	}
}

func main() {
	for i := 0; i < 5; i++ {
		go worker(i)
	}

	// Program će raditi beskonačno,
	// ali neke gorutine mogu doživeti gladovanje
	// u zavisnosti od planera i opterećenja.
	select {}
}

Za minimizaciju gladi primenjuju se:

  • Pravedni zaključci (fair locks): Garantuje da niti dobijaju pristup resursu redom zahteva.
  • Nasumičnost: Uvođenje slučajnosti u izbor niti koja će dobiti pristup resursu.
  • Timeouts: Postavljanje vremenskih ograničenja za čekanje na resurs.
  • Izbegavanje inverzije prioriteta: Izbegavanje situacija gde visokoprioritetni proces čeka na nižeprioritetni.

U Go, standardni mutexi ne garantuju pravičnost, što može dovesti do gladi u određenim uslovima.