Middle
Ի՞նչ է գործարկման ժամանակը (runtime) և ինչպես է աշխատում պլանավորիչը (scheduler):
sobes.tech AI
Պատասխան AI-ից
Go- ի ժամանակը (runtime) այն միջավայրն է, որտեղ աշխատում են Go ծրագրերը: Այն ներառում է.
- Հիշողության կառավարում: Garbage collector-ը ավտոմատ կերպով կառավարում է հիշողության բաժանումն ու ազատումը:
- Սկեդյուլատոր (scheduler): Կառավարում է gorutines-ների կատարմանը օպերացիոն համակարգի թելերով:
- Համակարգային կանչեր: Առաջարկում է ինտերֆեյս օպերացիոն համակարգի հետ փոխազդեցության համար:
- Սինխրոնիզացիայի primitives: Կանալներ, մյուտեքսներ և այլ մեխանիզմներ gorutines-ների համակարգման համար:
Go-ի սկեդյուլատորը իրականացնում է M:N մոդելը (մի քանի gorutines՝ մի քանի օպերացիոն համակարգի թելերով): Նրա հիմնական բաղադրիչները:
- G (Goroutine): Հ lightweight thread of execution, essentially an abstraction over a function:
- M (Machine): Օպերացիոն համակարգի թել, որի վրա աշխատում են Go ծրագրերը:
- P (Processor): Լոգիկ պրոցեսոր, կապված օպերացիոն համակարգի թելի հետ: Այն պահում է տեղական
runnableհերթը gorutines-ների:
Սկեդյուլատորի աշխատանքի սկզբունքը:
- Gorutines (G) ստեղծվում և ավելացվում են գլոբալ կամ տեղական
runnableհերթին: - Օպերացիոն համակարգի թելերը (M) կապված են լոգիկ պրոցեսորների (P) հետ: P-ների քանակը սովորաբար հավասար է CPU-ների քանակին (
GOMAXPROCS): - P-ները վերցնում են goroutine-ներ իրենց տեղական հերթից: Եթե տեղական հերթը դատարկ է, P-ները փորձում են "թալանել" (steal) gorutines այլ P-ների հերթից կամ գլոբալ հերթից:
- M գործարկում է goroutine-ները:
- Երբ goroutine-ները բլոկվում են (օրինակ, երբ կարդում են առանց տվյալների կամ համակարգային կանչի ժամանակ), M-ները անջատվում են P-ներից, և P-ները դառնում են հասանելի այլ goroutine-ների համար: Բլոկված goroutine-ները սպասման վիճակում են: Երբ բլոկը վերացվում է, goroutine-ները կրկին դառնում են
runnableև վերադառնում են հերթին: - Եթե M-ները բլոկվում են համակարգային կանչի ժամանակ, նրանք չեն պահում P-ները: Կարող է ստեղծվել նոր M կամ օգտագործվել գոյություն ունեցողը, որպեսզի P-ները շարունակեն այլ goroutine-ներ գործարկել:
Այս մոտեցումը արդյունավետ է օգտագործում պրոցեսորի ռեսուրսները և հեշտացնում է պառալելային առաջադրանքների ընդլայնումը, թաքցնելով օպերացիոն համակարգի թելերի կառավարման բարդությունը ծրագրավորողից:
// Goroutine ստեղծելու օրինակ
func myFunc() {
// Goroutine- ի կոդը
}
func main() {
go myFunc() // Goroutine- ի գործարկում
// Հիմնական ծրագիրը շարունակվում է գործել პარալել
}