Sobes.tech
Middle+

Разкажи за модела за управление на горутините (GMP) в Go.

sobes.tech AI

Отговор от AI

Планировчикът на Go управлява горутините, нишките на операционната система и логическите процесори, използвайки модела GMP:

  • G (Goroutine): Лека, независима единица за изпълнение. Съдържа стек, указател към инструкция и друга информация за състоянието. Множество горутини могат да работят на един и същ нишков поток.
  • M (Machine): Нишка на операционната система. Действа като изпълнител, който стартира кода на горутината. Множество M може да бъде достъпно за планировчика.
  • P (Processor): Логически процесор. Предоставя контекст за изпълнение на горутината. Съдържа локална опашка с горутини, готови за изпълнение на този M. Броят на P по подразбиране е равен на runtime.NumCPU().

Взаимодействие:

  1. Създава се горутина (G) и се поставя в глобална или локална опашка P.
  2. Свободен M иска P. Ако P е наличен, M се привързва към него.
  3. M взема горутина от локалната опашка P и започва нейното изпълнение.
  4. Ако горутината блокира (например, при очакване на I/O), M се отделя от P ("hand off"). P остава наличен за друго M или планира друга горутина от своята опашка.
  5. Когато блокираната горутина е готова за възобновяване, тя се поставя обратно в опашката P или в глобалната опашка.
  6. M може да бъде създаден от планировчика при необходимост (например, ако всички съществуващи M са блокирани) или премахнат, когато е неактивен.

Прекъсване (preemption): Планировчикът може да прекъсне изпълнението на горутина след определен период от време (time slice), за да гарантира справедливо разпределение на процесорното време между другите горутини.

Работна кражба (Work Stealing): Ако P изчерпи горутините в локалната си опашка, той може да се опита да "краде" горутини от глобалната опашка или от опашките на други P.