Middle
Чӣ тавр starvation (гулўғонӣ) дар контексти бисёрсоҳавӣ?
sobes.tech AI
Ҷавоб аз AI
Афҳол, ки дар он як ё бештар goroutines (сӯроқҳо, равандҳо) ҳеҷ гоҳ ба манбаи (масалан, mutex, канал) дастрасӣ намеёбанд, ки барои идомаи иҷрои онҳо зарур аст, дар ҳоле ки дигар goroutines ҳамеша ба ин манбаъ дастрасӣ доранд. Ин ба сабаби нақшаи нодуруст ё механизмҳои синхронизатсияи номукаммал, мисли афзалиятҳо ё нигоҳ доштани зиёди бастаҳо рӯй медиҳад.
Масалан:
package main
import (
"fmt"
"sync"
"time"
)
var (
mu sync.Mutex
counter int
)
func worker(id int) {
for {
mu.Lock() // Ҳимояи манбаъ (counter)
// Ин ҷо метавонад гулӯгарӣ рӯй диҳад, агар дигар goroutines
// ҳамеша 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)
}
// Барнома беохир идома мекунад,
// аммо баъзе goroutines метавонанд гулӯгарӣ кунанд
// вобаста ба нақшаи ва бор.
select {}
}
Барои кам кардани гулӯгарӣ истифода мешаванд:
- Блокҳои одилона (fair locks): Гарант мекунанд, ки сӯроқҳо ба манбаъ дар тартиби дархост қарор мегиранд.
- Тасодуфӣ: Вуруд кардани тасодуфият дар интихоби сӯроқ, ки ба манбаъ дастрасӣ хоҳад ёфт.
- Timeouts: Муайян кардани маҳдудиятҳои вақт барои интизорӣ ба манбаъ.
- Пешгирии инверсияи афзалият: Ҳангоми пешгирӣ кардани ҳолатҳое, ки дар он як раванд бо афзалияти баланд интизор аст, дар ҳоле ки раванд бо афзалияти паст интизор аст.
Дар Go, mutex-ҳои стандартӣ адолатро кафолат намедиҳанд, ки метавонад ба гулӯгарӣ оварда расонад.