Sobes.tech
Middle

Čo je to hladovanie (starvation) v kontexte viacvláknového programovania?

sobes.tech AI

Odpoveď od AI

Stav, keď jeden alebo viac gorutín (vlákien, procesov) nikdy nezískajú prístup ku zdroju (napríklad mutexu, kanálu), ktorý potrebujú na pokračovanie v vykonávaní, zatiaľ čo iné gorutiny majú neustály prístup k tomuto zdroju. To sa deje kvôli nespravodlivému plánovaniu alebo neefektívnym mechanizmom synchronizácie, ako sú priority alebo nadmerné držanie zámkov.

Príklad:

package main

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

var (
	mu      sync.Mutex
	counter int
)

func worker(id int) {
	for {
		mu.Lock() // Chrániť zdroj (counter)
		// Tu môže nastať hladovanie, ak iné gorutiny
		// neustále zachytávajú mutex a dlhodobo ho držia.
		counter++
		fmt.Printf("Pracovník %d zvýšil čítač na %d\n", id, counter)
		time.Sleep(10 * time.Millisecond) // Simulácia práce
		mu.Unlock()
		// Pridanie malej oneskorenia, aby si plánovač mohol prepnúť kontext
		time.Sleep(1 * time.Millisecond)
	}
}

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

	// Program bude bežať nekonečne,
	// ale niektorí pracovníci môžu zažívať hladovanie
	// v závislosti od plánovača a záťaže.
	select {}
}

Na minimalizáciu hladu sa používajú:

  • Spravodlivé zámky (fair locks): Zaručujú, že vlákna získajú prístup k zdroju v poradí žiadosti.
  • Náhodnosť: Zavedenie náhodnosti pri výbere vlákna, ktoré získa prístup k zdroju.
  • Timeouty: Nastavenie časových limitov na čakanie na zdroj.
  • Prevencia inverzie priorít: Vyhýbanie sa situáciám, keď vysokoprioritný proces čaká na nízkoprioritný.

V Go štandardné mutexy nezaručujú spravodlivosť, čo môže viesť k hladu v určitých podmienkach.