Sobes.tech
Middle+

Erzählen Sie mir vom Management-Pattern der Goroutines (GMP) in Go.

sobes.tech KI

Antwort von AI

Der Go-Planer verwaltet Goroutines, Betriebssystem-Threads und logische Prozessoren unter Verwendung des GMP-Modells:

  • G (Goroutine): Leichtgewichtige, unabhängige Ausführungseinheit. Enthält einen Stack, einen Instruktionszeiger und andere Statusinformationen. Mehrere Goroutines können auf einem einzigen Betriebssystem-Thread laufen.
  • M (Machine): Betriebssystem-Thread. Fungiert als Ausführer, der den Goroutine-Code startet. Eine Menge von M kann dem Scheduler zur Verfügung stehen.
  • P (Processor): Logischer Prozessor. Bietet einen Kontext für die Ausführung der Goroutine. Enthält eine lokale Warteschlange von Goroutines, die auf diesem M ausgeführt werden können. Die Standardanzahl der P ist runtime.NumCPU().

Interaktion:

  1. Eine Goroutine (G) wird erstellt und in eine globale oder lokale P-Warteschlange gelegt.
  2. Ein freier M fordert ein P an. Wenn P verfügbar ist, wird M daran gebunden.
  3. M nimmt eine Goroutine aus der lokalen Warteschlange P und beginnt deren Ausführung.
  4. Wenn die Goroutine blockiert (z.B. bei I/O-Warten), trennt sich M von P ("hand off"). P bleibt für ein anderes M verfügbar oder plant eine andere Goroutine aus seiner Warteschlange.
  5. Wenn die blockierte Goroutine bereit ist, fortzufahren, wird sie wieder in die P-Warteschlange oder die globale Warteschlange gelegt.
  6. M kann vom Scheduler bei Bedarf erstellt werden (z.B. wenn alle bestehenden M blockiert sind) oder bei Inaktivität entfernt werden.

Preemption (erzwungener Wechsel): Der Scheduler kann die Ausführung einer Goroutine nach einer bestimmten Zeitspanne (Time Slice) unterbrechen, um eine faire Verteilung der CPU-Zeit zwischen den Goroutines zu gewährleisten.

Work Stealing (Arbeitsdiebstahl): Wenn P seine Goroutines in der lokalen Warteschlange aufgebraucht hat, kann er versuchen, Goroutines aus der globalen Warteschlange oder den Warteschlangen anderer P zu "stehlen".