Sobes.tech
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():

Հարցազրույց:

  1. Գորուտինա (G) ստեղծվում է և տեղադրվում է գլոբալ կամ տեղական P հերթում:
  2. Անվճար M- ն պահանջում է P: Եթե P մատչելի է, M- ն միանում է նրան:
  3. M- ն վերցնում է goroutine- ն տեղական P հերթից և սկսում է նրա կատարմանը:
  4. Եթե goroutine- ն բլոկվում է (օրինակ, սպասում է I/O-ին), M- ն անջատվում է P-ից ("hand off"): P մնում է մատչելի այլ M-ների կամ իր հերթի համար:
  5. Երբ բլոկված goroutine- ն պատրաստ է վերականգնվել, այն կրկին տեղադրվում է P հերթում կամ գլոբալ հերթում:
  6. M- ն կարող է ստեղծվել պլանավորիչով անհրաժեշտության դեպքում (օրինակ, եթե բոլոր առկա M-ները բլոկված են) կամ հեռացվի, երբ անգործ է:

Preemption (մարտահրավերային փոխարկում): Պլանավորիչը կարող է ընդհատել goroutine- ի կատարմանը որոշ ժամանակ անց (time slice), որպեսզի ապահովի արդար բաշխում CPU ժամանակի միջև այլ goroutine-ների:

Work Stealing (աշխատանքի գողություն): Եթե P- ն սպառում է իր տեղական հերթում goroutine-ները, նա կարող է փորձել "գողանալ" goroutine-ներ գլոբալ հերթից կամ այլ P-ների հերթերից: