Middle+
Разкажи за модела за управление на горутините (GMP) в Go.
sobes.tech AI
Отговор от AI
Планировчикът на Go управлява горутините, нишките на операционната система и логическите процесори, използвайки модела GMP:
- G (Goroutine): Лека, независима единица за изпълнение. Съдържа стек, указател към инструкция и друга информация за състоянието. Множество горутини могат да работят на един и същ нишков поток.
- M (Machine): Нишка на операционната система. Действа като изпълнител, който стартира кода на горутината. Множество M може да бъде достъпно за планировчика.
- P (Processor): Логически процесор. Предоставя контекст за изпълнение на горутината. Съдържа локална опашка с горутини, готови за изпълнение на този M. Броят на P по подразбиране е равен на
runtime.NumCPU().
Взаимодействие:
- Създава се горутина (G) и се поставя в глобална или локална опашка P.
- Свободен M иска P. Ако P е наличен, M се привързва към него.
- M взема горутина от локалната опашка P и започва нейното изпълнение.
- Ако горутината блокира (например, при очакване на I/O), M се отделя от P ("hand off"). P остава наличен за друго M или планира друга горутина от своята опашка.
- Когато блокираната горутина е готова за възобновяване, тя се поставя обратно в опашката P или в глобалната опашка.
- M може да бъде създаден от планировчика при необходимост (например, ако всички съществуващи M са блокирани) или премахнат, когато е неактивен.
Прекъсване (preemption): Планировчикът може да прекъсне изпълнението на горутина след определен период от време (time slice), за да гарантира справедливо разпределение на процесорното време между другите горутини.
Работна кражба (Work Stealing): Ако P изчерпи горутините в локалната си опашка, той може да се опита да "краде" горутини от глобалната опашка или от опашките на други P.