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:
- Tworzy się gorutynę (G) i umieszcza ją w globalnej lub lokalnej kolejce P.
- Wolny M żąda P. Jeśli P jest dostępny, M się do niego dołącza.
- M pobiera gorutynę z lokalnej kolejki P i zaczyna jej wykonywanie.
- 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.
- Gdy zablokowana gorutyna jest gotowa do wznowienia, jest ponownie umieszczana w kolejce P lub w kolejce globalnej.
- 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.