Heim >Backend-Entwicklung >Golang >Wie erstellt der Go-Scheduler neue M und P, wenn Goroutinen Blockierungsvorgänge ausführen?

Wie erstellt der Go-Scheduler neue M und P, wenn Goroutinen Blockierungsvorgänge ausführen?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-30 02:18:28496Durchsuche

How Does the Go Scheduler Create New M and P When Goroutines Perform Blocking Operations?

Wenn der Go-Scheduler neue M und P im GMP-Modell erstellt

Im GMP-Modell (Goroutine, Maschine, Prozessor) von Go der Scheduler verwaltet die Erstellung von M (Maschine) und P (Prozessor) basierend auf bestimmten Bedingungen.

M-Erstellung

M wird als Reaktion auf bestimmte Ereignisse erstellt, wie zum Beispiel:

  • Blockierungsoperationen: Wenn eine Goroutine eine Blockierungsoperation ausführt (z. B. E/A, Systemaufruf), wird das dieser Goroutine zugeordnete M blockiert. Um mit der Ausführung der Goroutine fortzufahren, erstellt der Scheduler ein neues M.
  • Pipelines planen: Wenn die globale G-Warteschlange, in der auf die Ausführung wartende Goroutinen gespeichert werden, mehr Goroutinen enthält, als M verfügbar sind , erstellt der Scheduler neues M, um die Goroutinen auszuführen.

P-Erstellung

P wird beim Programmstart basierend auf der Umgebungsvariablen GOMAXPROCS erstellt, die die angibt maximale Anzahl verfügbarer P. Der Standardwert ist die Anzahl der logischen CPUs im System.

Beispielanalyse

In Ihrem Beispielcode haben Sie zwei Stapel von Goroutinen Ausführen von Datenbankoperationen. Jede Goroutine führt einen blockierenden E/A-Vorgang aus.

  • Erster Batch: Der Scheduler erstellt 8 M (da Sie 8 virtuelle Kerne haben) und 1 P, um den ersten Batch auszuführen von Goroutinen. Jedes M führt eine Goroutine aus der lokalen Warteschlange von P aus.
  • Zweiter Stapel: Da die Blockierungsvorgänge dazu führen, dass das anfängliche M blockiert wird, erstellt der Scheduler ein neues M für die verbleibenden Goroutinen in der zweiten Charge. Das M wird einem neuen P zugeordnet, auch wenn die Anzahl der P bei 1 bleibt.

Daher erstellt der Scheduler in Ihrem Fall mehr als 8 M für den zweiten Stapel von Goroutinen, weil Die Vorgänge blockieren. Das P wird basierend auf dem GOMAXPROCS-Wert auf 1 begrenzt, aber M wird nach Bedarf dynamisch erstellt.

Zusätzliche Ressourcen

Weiteres Verständnis finden Sie im Folgenden Ressourcen:

  • https://www.programmersought.com/article/79557885527/
  • https://blog.golang.org/go-goroutine-os-thread-and -CPU-Verwaltung

Das obige ist der detaillierte Inhalt vonWie erstellt der Go-Scheduler neue M und P, wenn Goroutinen Blockierungsvorgänge ausführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn