Sobes.tech
Middle

Ի՞նչ է սովը (գլուխը) բազմապատկման համատեքստում։

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
		// մշտապես գրավում են մյուտեքսը և երկար պահում։
		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-ները չեն երաշխավորում արդարությունը, ինչը կարող է հանգեցնել սովի որոշ պայմաններում։