Sobes.tech
Middle

Çok iş parçacıklı bağlamda starvation (açlık) nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Bir veya daha fazla goroutine'nin (iş parçacığı, süreç) ihtiyaç duyduğu kaynağa (örneğin, bir mutex, kanal) erişmediği, diğer goroutine'lerin ise sürekli olarak bu kaynağa eriştiği durum. Bu, adaletsiz planlama veya öncelikler veya aşırı kilit tutma gibi verimsiz senkronizasyon mekanizmaları nedeniyle olur.

Örnek:

package main

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

var (
	mu      sync.Mutex
	counter int
)

func worker(id int) {
	for {
		mu.Lock() // Kaynağı (counter) koruyoruz
		// Burada açlık yaşanabilir, diğer goroutine'ler
		// sürekli mutex'i alıp uzun süre tutarsa.
		counter++
		fmt.Printf("İşçi %d sayacı %d'ye çıkardı\n", id, counter)
		time.Sleep(10 * time.Millisecond) // İşlem simülasyonu
		mu.Unlock()
		// Planlayıcının geçiş yapabilmesi için küçük bir gecikme ekle
		time.Sleep(1 * time.Millisecond)
	}
}

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

	// Program sonsuz çalışacak,
	// ancak bazı işçiler açlık yaşayabilir
	// planlayıcı ve yük durumuna bağlı olarak.
	select {}
}

Açlığı azaltmak için uygulanır:

  • Adil kilitler (fair locks): İstek sırasına göre kaynak erişimini garanti eder.
  • Rastgelelik: Kaynağa erişecek işçinin seçiminde rastgelelik kullanmak.
  • Zaman aşımı (Timeouts): Kaynak bekleme süresi sınırları koymak.
  • Öncelik inversiyonunun önlenmesi: Yüksek öncelikli bir işlemin düşük öncelikli bir işlemi beklemesini önlemek.

Go'da standart mutexler adaleti garanti etmez, bu da belirli koşullarda açlığa yol açabilir.