Sobes.tech
Middle

Kas yra badavimas (starvation) daugiasluoksnėje programavime?

sobes.tech AI

Atsakymas iš AI

Padėtis, kai vienas ar keli gorutinai (srautai, procesai) niekada neprieina prie ištekliaus (pavyzdžiui, mutexo, kanalo), kuris jiems yra būtinas tęsti vykdymą, tuo tarpu kiti gorutinai nuolat prieina prie šio ištekliaus. Tai įvyksta dėl neteisingo planavimo arba neveiksmingų sinchronizacijos mechanizmų, tokių kaip prioritetai arba per didelis užraktų laikymas.

Pavyzdys:

package main

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

var (
	mu      sync.Mutex
	counter int
)

func worker(id int) {
	for {
		mu.Lock() // Apsaugome išteklių (counter)
		// Čia gali įvykti badavimas, jei kiti gorutinai
		// nuolat užfiksuos mutexą ir ilgai jį laikys.
		counter++
		fmt.Printf("Darbininkas %d padidino skaitiklį iki %d\n", id, counter)
		time.Sleep(10 * time.Millisecond) // Darbo imitacija
		mu.Unlock()
		// Pridėsime nedidelį vėlavimą, kad planuotojas galėtų persijungti
		time.Sleep(1 * time.Millisecond)
	}
}

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

	// Programa veiks neribotą laiką,
	// tačiau kai kurie darbininkai gali patirti badavimą
	// priklausomai nuo planuotojo ir apkrovos.
	select {}
}

Siekiant sumažinti badavimą taikomos:

  • Teisingos blokados (fair locks): Garantuoja, kad srautai gauna prieigą prie ištekliaus pagal užklausos tvarką.
  • Atsitiktinumas: Įvedimas atsitiktinumo pasirinkti srautą, kuris gaus prieigą prie ištekliaus.
  • Laiko limitai: Laiko apribojimų nustatymas laukimo laikui prie ištekliaus.
  • Prioritetų inversijos vengimas: Vengti situacijų, kai aukšto prioriteto procesas laukia žemo prioriteto proceso.

Go standartiški mutexai nesuteikia garantijos dėl teisingumo, kas gali sukelti badavimą tam tikromis sąlygomis.