Middle
Многопоточный контекстте starvation (азап) эмне?
sobes.tech AI
AIден жооп
Бир же бир нече goroutine (жип, процесстер) эч качан ишке ашырууга зарыл болгон ресурска (мисалы, mutex, канал) кире албайт, ал эми башка goroutineler дайыма ошол ресурска кирип жатат. Бул адилетсиз пландоонун же натыйжалуу эмес синхрондоштуруу механизмдеринин, мисалы, артыкчылыктар же ашыкча блоктоону кармоо себеп болот.
Мисал:
package main
import (
"fmt"
"sync"
"time"
)
var (
mu sync.Mutex
counter int
)
func worker(id int) {
for {
mu.Lock() // Ресурсты (counter) коргоо
// Мында ачкачылык болушу мүмкүн, эгер башка goroutineler
// дайыма mutexти кармап, узак убакыт кармап турушса.
counter++
fmt.Printf("жумушчу %d эсептегичти %dге көтөрдү\n", id, counter)
time.Sleep(10 * time.Millisecond) // иштин имитациясы
mu.Unlock()
// Планировщикке которулушу үчүн кичинекей кечиктирүү кошобуз
time.Sleep(1 * time.Millisecond)
}
}
func main() {
for i := 0; i < 5; i++ {
go worker(i)
}
// Программа үзгүлтүксүз иштейт,
// бирок кээ бир жумушчулар ачкачылыкка дуушар болушу мүмкүн
// планировщикке жана жүктөмгө жараша.
select {}
}
Ачкачылыкты азайтуу үчүн колдонулат:
- Адилеттүү блокдоолор (fair locks): Тартипке ылайык, жиптер ресурска кирүү мүмкүнчүлүгүн алышат.
- Кездейсөңдүүлүк: Ресурска кирүү үчүн жипти тандоодо кездейсөңдүүлүк киргизүү.
- Timeouts: Ресурска күтүүнүн убакыт чектерин коюу.
- Артыкчылык инверсиясын алдын алуу: Жогорку артыкчылыктагы процесстин төмөн артыкчылыктагыны күтүүсүн алдын алуу.
Go стандарттык mutex-тери адилеттүүлүктү кепилдебейт, бул кээ бир шарттарда ачкачылыкка алып келиши мүмкүн.