Sobes.tech
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-ների:

Սկեդյուլատորի աշխատանքի սկզբունքը:

  1. Gorutines (G) ստեղծվում և ավելացվում են գլոբալ կամ տեղական runnable հերթին:
  2. Օպերացիոն համակարգի թելերը (M) կապված են լոգիկ պրոցեսորների (P) հետ: P-ների քանակը սովորաբար հավասար է CPU-ների քանակին (GOMAXPROCS):
  3. P-ները վերցնում են goroutine-ներ իրենց տեղական հերթից: Եթե տեղական հերթը դատարկ է, P-ները փորձում են "թալանել" (steal) gorutines այլ P-ների հերթից կամ գլոբալ հերթից:
  4. M գործարկում է goroutine-ները:
  5. Երբ goroutine-ները բլոկվում են (օրինակ, երբ կարդում են առանց տվյալների կամ համակարգային կանչի ժամանակ), M-ները անջատվում են P-ներից, և P-ները դառնում են հասանելի այլ goroutine-ների համար: Բլոկված goroutine-ները սպասման վիճակում են: Երբ բլոկը վերացվում է, goroutine-ները կրկին դառնում են runnable և վերադառնում են հերթին:
  6. Եթե M-ները բլոկվում են համակարգային կանչի ժամանակ, նրանք չեն պահում P-ները: Կարող է ստեղծվել նոր M կամ օգտագործվել գոյություն ունեցողը, որպեսզի P-ները շարունակեն այլ goroutine-ներ գործարկել:

Այս մոտեցումը արդյունավետ է օգտագործում պրոցեսորի ռեսուրսները և հեշտացնում է պառալելային առաջադրանքների ընդլայնումը, թաքցնելով օպերացիոն համակարգի թելերի կառավարման բարդությունը ծրագրավորողից:

// Goroutine ստեղծելու օրինակ
func myFunc() {
	// Goroutine- ի կոդը
}

func main() {
	go myFunc() // Goroutine- ի գործարկում
	// Հիմնական ծրագիրը շարունակվում է գործել პარալել
}