Middle+
Papaskok apie gorutinių valdymo modelį (GMP) Go kalboje.
sobes.tech AI
Atsakymas iš AI
Go planuotojas valdo gorutinas, operacinės sistemos srautus ir loginus procesorius, naudodamas GMP modelį:
- G (Goroutine): Lengvas, nepriklausomas vykdymo vienetas. Jame yra stekas, instrukcijos rodyklė ir kita būsenos informacija. Daug gorutinų gali dirbti viename OS sraute.
- M (Machine): Operacinės sistemos srautas. Atlieka gorutinos kodo vykdymą. Daug M gali būti prieinami planuotojui.
- P (Processor): Loginis procesorius. Teikia kontekstą gorutinos vykdymui. Jame yra vietinis gorutinų eilė, kurie yra pasiruošę vykdyti šį M. P skaičius paprastai yra lygus
runtime.NumCPU().
Sąveika:
- Gorutina (G) yra sukurta ir įdedama į globalią arba vietinę P eilę.
- Laisvas M prašo P. Jei P yra prieinama, M prie jos prisijungia.
- M paima gorutiną iš vietinės eilės ir pradeda ją vykdyti.
- Jei gorutina užstringa (pvz., laukia I/O), M atjungiasi nuo P („hand off“). P lieka prieinama kitam M arba planuoja kitą gorutiną savo eilėje.
- Kai užstringanti gorutina yra pasiruošusi tęsti, ji vėl įdedama į P eilę arba į globalią eilę.
- M gali būti sukurtas planuotojo, jei reikia (pvz., jei visi esami M yra užstringę), arba pašalintas, kai nėra aktyvus.
Preemption (priverstinis perjungimas): planuotojas gali nutraukti gorutinos vykdymą po tam tikro laiko (time slice), siekiant užtikrinti teisingą procesoriaus laiko paskirstymą kitoms gorutinoms.
Work Stealing (darbo vagystė): jei P vietinė eilė yra tuščia, jis gali bandyti „vagystę“ iš globalios eilės arba kitų P eilės gorutinų.