Sobes.tech
Middle+

Opowiedz o wzorcu zarządzania goroutines (GMP) w Go.

sobes.tech AI

Odpowiedź od AI

Planer Go zarządza gorutynami, wątkami systemu operacyjnego i procesorami logicznymi, korzystając z modelu GMP:

  • G (Goroutine): Lekka, niezależna jednostka wykonawcza. Zawiera stos, wskaźnik na instrukcję i inne informacje o stanie. Wiele gorutyn może działać na jednym wątku systemu operacyjnego.
  • M (Machine): Wątek systemu operacyjnego. Działa jako wykonawca uruchamiający kod gorutyny. Zbiór M może być dostępny dla planera.
  • P (Processor): Logiczny procesor. Zapewnia kontekst do wykonywania gorutyny. Zawiera lokalną kolejkę gorutyn gotowych do wykonania na tym M. Domyślna liczba P to runtime.NumCPU().

Interakcja:

  1. Tworzy się gorutynę (G) i umieszcza ją w globalnej lub lokalnej kolejce P.
  2. Wolny M żąda P. Jeśli P jest dostępny, M się do niego dołącza.
  3. M pobiera gorutynę z lokalnej kolejki P i zaczyna jej wykonywanie.
  4. Jeśli gorutyna się zablokuje (np. oczekując na I/O), M odłącza się od P ("hand off"). P pozostaje dostępny dla innego M lub planuje inną gorutynę z własnej kolejki.
  5. Gdy zablokowana gorutyna jest gotowa do wznowienia, jest ponownie umieszczana w kolejce P lub w kolejce globalnej.
  6. M może być tworzony przez planera w razie potrzeby (np. gdy wszystkie istniejące M są zablokowane) lub usuwany, gdy jest nieaktywny.

Preemption (wymuszone przełączanie): Planer może przerwać wykonywanie gorutyny po określonym czasie (time slice), aby zapewnić sprawiedliwy podział czasu procesora między innymi gorutynami.

Work Stealing (kradzież pracy): Jeśli P wyczerpie gorutyny w swojej lokalnej kolejce, może próbować "ukraść" gorutyny z kolejki globalnej lub z kolejek innych P.