Sobes.tech
Middle

Ko'p ipli ishlash kontekstida starvation (ochlik) nima?

sobes.tech AI

AIdan javob

Bir yoki bir nechta goroutinlar (iplar, jarayonlar) hech qachon davom ettirish uchun zarur bo'lgan resursga (masalan, mutex, kanal) kirishmaydi, boshqalar esa doimiy ravishda bu resursga kirishadi. Bu adolatsiz rejalashtirish yoki samarali bo'lmagan sinxronizatsiya mexanizmlari, masalan, prioritetlar yoki ortiqcha blokirovka usullari tufayli yuzaga keladi.

Misol:

package main

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

var (
	mu      sync.Mutex
	counter int
)

func worker(id int) {
	for {
		mu.Lock() // Resursni (counter) himoyalash
		// Bu yerda ochlik yuzaga kelishi mumkin, agar boshqa goroutinlar
		// doimiy ravishda mutexni ushlab turib, uzoq vaqt saqlashsa.
		counter++
		fmt.Printf("Ishchi %d hisoblagichni %d ga oshirdi\n", id, counter)
		time.Sleep(10 * time.Millisecond) // Ishni simulyatsiya qilish
		mu.Unlock()
		// Rejalashtiruvchi uchun kichik kechikishni qo'shamiz
		time.Sleep(1 * time.Millisecond)
	}
}

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

	// Dastur cheksiz davom etadi,
	// ammo ba'zi ishchilar ochlikdan aziyat chekishlari mumkin
	// rejalashtiruvchi va yukga qarab.
	select {}
}

Ochlikni kamaytirish uchun quyidagilar qo'llaniladi:

  • Adolatli blokirovka (fair lock): So'rov tartibida resursga kirishni ta'minlaydi.
  • Tasodifiylik: Resursga kirishni tanlashda tasodifiylikni kiritish.
  • Timeoutlar: Resurs uchun kutish vaqtini cheklash.
  • Prioritetlar inversiyasini oldini olish: Yuqori prioritetli jarayon past prioritetli jarayonni kutishini oldini olish.

Go'da standart mutexlar adolatlilikni kafolatlamaydi, bu esa ba'zan ochlikka olib kelishi mumkin.