Sobes.tech
Middle

Kas ir bads (izsalkums) daudzprocesu programmēšanas kontekstā?

sobes.tech AI

Atbilde no AI

Stāvoklis, kad viens vai vairāki gorutini (straumi, procesi) nekad nepiekrīt resursam (piemēram, mutex, kanālam), kas tiem ir nepieciešams turpināt izpildi, kamēr citi gorutini pastāvīgi piekļūst šim resursam. Tas notiek nepareiza plānošanas vai neefektīvu sinhronizācijas mehānismu dēļ, piemēram, prioritāšu vai pārmērīgas bloķēšanas dēļ.

Piemērs:

package main

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

var (
	mu      sync.Mutex
	counter int
)

func worker(id int) {
	for {
		mu.Lock() // Aizsargā resursu (counter)
		// Šeit var rasties bads, ja citi gorutini
		// pastāvīgi aizfiksēs mutexu un ilgi to turēs.
		counter++
		fmt.Printf("Darbinieks %d palielināja skaitītāju līdz %d\n", id, counter)
		time.Sleep(10 * time.Millisecond) // Darba imitācija
		mu.Unlock()
		// Pievienosim nelielu aizkavi, lai plānotājs varētu pārslēgties
		time.Sleep(1 * time.Millisecond)
	}
}

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

	// Programma darbosies bezgalīgi,
	// bet daži darbinieki var piedzīvot badu
	// atkarībā no plānotāja un slodzes.
	select {}
}

Lai samazinātu badu, tiek izmantotas:

  • Taisnīgas bloķēšanas (fair locks): Garantē, ka plūsmas saņem piekļuvi resursam pēc pieprasījuma secības.
  • Nejaušība: Ieviešana nejaušības izvēlē, kurš plūsma saņems piekļuvi resursam.
  • Laika ierobežojumi: Laika ierobežojumu noteikšana, gaidot piekļuvi resursam.
  • Prioritāšu inversijas novēršana: Vairāk izvairīties no situācijām, kad augsta prioritāte procesam gaida zemas prioritātes procesu.

Standarta mutexi Go nesniedz garantiju par taisnīgumu, kas var novest pie badu dažādos apstākļos.