Middle+
Խոսիր Go-ում goroutine-ների կառավարման մոդել (GMP) մասին։
sobes.tech AI
Պատասխան AI-ից
Go ծրագրավորողի պլանավորիչը կառավարում է goroutine-ները, օպերացիոն համակարգի թելերը և տրամաբանական պրոցեսորները GMP մոդելն օգտագործելով.
- G (Goroutine): Թեթև, անկախ կատարման միավոր: պարունակում է ստեկ, հրահանգների ցուցիչ և այլ վիճակի մասին տեղեկություններ: Շատ goroutine-ներ կարող են աշխատել մեկ օպերացիոն համակարգի թելում:
- M (Machine): Օպերացիոն համակարգի թել: որպես կատարող, որը սկսում է goroutine-ի կոդը: M-ների հավաքածուն կարող է լինել մատչելի պլանավորիչի համար:
- P (Processor): Թվային պրոցեսոր: տրամադրում է կոնտեքստ goroutine-ի կատարման համար: պարունակում է տեղական հերթ, որտեղ պատրաստ է աշխատելու այս M-ով goroutine-ները: Դիֆոլտ P-ների թիվը հավասար է
runtime.NumCPU():
Հարցազրույց:
- Գորուտինա (G) ստեղծվում է և տեղադրվում է գլոբալ կամ տեղական P հերթում:
- Անվճար M- ն պահանջում է P: Եթե P մատչելի է, M- ն միանում է նրան:
- M- ն վերցնում է goroutine- ն տեղական P հերթից և սկսում է նրա կատարմանը:
- Եթե goroutine- ն բլոկվում է (օրինակ, սպասում է I/O-ին), M- ն անջատվում է P-ից ("hand off"): P մնում է մատչելի այլ M-ների կամ իր հերթի համար:
- Երբ բլոկված goroutine- ն պատրաստ է վերականգնվել, այն կրկին տեղադրվում է P հերթում կամ գլոբալ հերթում:
- M- ն կարող է ստեղծվել պլանավորիչով անհրաժեշտության դեպքում (օրինակ, եթե բոլոր առկա M-ները բլոկված են) կամ հեռացվի, երբ անգործ է:
Preemption (մարտահրավերային փոխարկում): Պլանավորիչը կարող է ընդհատել goroutine- ի կատարմանը որոշ ժամանակ անց (time slice), որպեսզի ապահովի արդար բաշխում CPU ժամանակի միջև այլ goroutine-ների:
Work Stealing (աշխատանքի գողություն): Եթե P- ն սպառում է իր տեղական հերթում goroutine-ները, նա կարող է փորձել "գողանալ" goroutine-ներ գլոբալ հերթից կամ այլ P-ների հերթերից: