Heim >Backend-Entwicklung >Golang >Wann erstellt der Go-Scheduler neue M und P?

Wann erstellt der Go-Scheduler neue M und P?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-29 18:39:43320Durchsuche

When Does the Go Scheduler Create New M and P?

Wenn Go Scheduler neue M und P erstellt

In der Go-Laufzeit werden Goroutinen, Betriebssystem-Threads (OS-Threads) und Kontexte/ Prozessoren (M und P) arbeiten zusammen, um die Parallelität zu verwalten. Für eine effiziente Leistung ist es entscheidend zu verstehen, wann neue M- und P-Entitäten erstellt werden.

M- und P-Erstellung

  • M (Maschine): Ein M stellt einen Betriebssystem-Thread dar und wird erstellt, wenn die Ausführung einer Goroutine geplant ist. Die Anzahl von M wird zunächst durch die Umgebungsvariable runtime.GOMAXPROCS festgelegt.
  • P (Prozessor): A P ist ein Prozessor, der Goroutinen ausführt. Jedem P ist ein M zugeordnet. Wenn ein M blockiert, kann ein neues M erstellt werden, um Goroutinen auf diesem P auszuführen.

Szenarioanalyse

In In Ihrem Codebeispiel erstellen Sie mehrere Goroutinen, die Blockierungsvorgänge ausführen. In diesem Szenario:

  1. Der erste Batch von Goroutinen wird auf den vorhandenen P-Instanzen geplant.
  2. Wenn alle lokalen Warteschlangen von P voll sind, wird ein neues M erstellt, um den Überlauf zu bewältigen Goroutinen.
  3. Da Ihre Goroutinen jedoch blockierende Operationen innerhalb der go func() ausführen, wird das mit blockierten Goroutinen verknüpfte M aus dem P entfernt und in den Leerlauf-Thread-Pool gelegt.
  4. Neu M wird erstellt, um das blockierte M zu ersetzen und weiterhin Goroutinen auf diesem P auszuführen.

Fazit

Zusammenfassend lässt sich sagen, dass der Go-Scheduler ein neues M erstellt, wenn Die Ausführung einer Goroutine ist geplant und ein kostenloser Betriebssystem-Thread ist nicht verfügbar. Ein neues P wird erstellt, wenn die lokale Warteschlange eines vorhandenen P voll ist. Bei blockierenden Goroutinen kann jedoch die Anzahl der erstellten M die Anzahl der virtuellen Kerne übersteigen, da für jeden Blockierungsvorgang ein separater M erforderlich ist.

Zusätzliche Ressourcen

  • [GOMAXPROCS im Go-Blog](https://blog.golang.org/GOMAXPROCS)
  • [Go Goroutine, Betriebssystem-Thread und CPU-Management](https://godoc.org/ runtime/debug#SetMaxThreads)
  • [GMP-Grundlagen](https://www.programmersought.com/article/79557885527/)

Das obige ist der detaillierte Inhalt vonWann erstellt der Go-Scheduler neue M und P?. 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