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.