Sobes.tech
Middle

Co je to starvation (hladovění) v kontextu vícenásobného zpracování vláken?

sobes.tech AI

Odpověď od AI

Stav, kdy jeden nebo více gorutin (vláken, procesech) nikdy nezískají přístup ke zdroji (například mutexu, kanálu), který potřebují k pokračování v provádění, zatímco jiné gorutiny mají neustálý přístup k tomuto zdroji. To se děje kvůli nespravedlivému plánování nebo neefektivním mechanismům synchronizace, jako jsou priority nebo nadměrné držení zámků.

Příklad:

package main

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

var (
	mu      sync.Mutex
	counter int
)

func worker(id int) {
	for {
		mu.Lock() // Chráníme zdroj (counter)
		// Zde může dojít k hladu, pokud jiné gorutiny
		// neustále zabírají mutex a dlouho ho drží.
		counter++
		fmt.Printf("Pracovník %d zvýšil čítač na %d\n", id, counter)
		time.Sleep(10 * time.Millisecond) // Simulace práce
		mu.Unlock()
		// Přidáme malou prodlevu, aby si plánovač mohl přepnout kontext
		time.Sleep(1 * time.Millisecond)
	}
}

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

	// Program poběží nekonečně,
	// ale někteří pracovníci mohou trpět hladem
	// v závislosti na plánovači a zátěži.
	select {}
}

Pro minimalizaci hladu se používají:

  • Spravedlivé zámky (fair locks): Zaručují, že vlákna získají přístup ke zdroji v pořadí žádosti.
  • Náhodnost: Zavedení náhodnosti při výběru vlákna, které získá přístup ke zdroji.
  • Timeouty: Nastavení časových limitů na čekání na zdroj.
  • Prevence inverze priorit: Vyhýbání se situacím, kdy vysokoprioritní proces čeká na nízkoprioritní.

Ve Go standardní mutexy nezaručují spravedlnost, což může vést k hladu za určitých podmínek.