Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des Coroutine-Schedulers in der Go-Sprache

Detaillierte Erläuterung des Coroutine-Schedulers in der Go-Sprache

王林
王林Original
2023-06-05 20:40:321622Durchsuche

Go-Sprache verfügt über einen effizienten Coroutine-Scheduler, der problemlos gleichzeitige Aufgaben verarbeiten und leistungsstarke Programme implementieren kann. In diesem Artikel werfen wir einen detaillierten Blick auf den Coroutine-Scheduler in der Go-Sprache und untersuchen seine Implementierung, Funktionsweise und Optimierung.

Einführung in Coroutinen

Coroutinen sind Lightweight-Threads oder Benutzermodus-Threads. Es wird vom Programmierer geplant, nicht vom Betriebssystem. Das Merkmal von Coroutinen ist, dass sie nicht präventiv sind, d. h. der Kontext wird nur gewechselt, wenn die Funktion yield() explizit aufgerufen wird. Daher ist der Umschaltaufwand für Coroutinen sehr gering, sie können leicht erstellt und zerstört werden und viele Coroutinen können gleichzeitig ausgeführt werden, um eine gleichzeitige Ausführung von Programmen zu erreichen.

Go-Sprach-Coroutinenmodell

Go-Sprache verwendet das M:N-Coroutinenmodell, dh mehrere Benutzermodus-Threads M, entsprechend der Beziehung mehrerer Threads N auf Systemebene. Dieses Modell nutzt die Vorteile von Multi-Core-CPUs voll aus, reduziert gleichzeitig den Aufwand für den Kontextwechsel und verbessert die Planungsleistung.

M stellt den Betriebssystem-Thread dar, dh den physischen Thread, der die kleinste Einheit der Betriebssystemplanung darstellt. N stellt den virtuellen Thread (Goroutine) im Laufzeitsystem der Go-Sprache (Laufzeit) dar, der die kleinste Einheit zur Erzielung von Parallelität darstellt. N Goroutinen werden M Threads zugeordnet und vom Scheduler zur Laufzeit geplant.

Coroutine-Scheduler

Der Coroutine-Scheduler ist die Kernkomponente im Go-Sprachlaufzeitsystem und für die Verwaltung und Planung mehrerer Coroutinen zur Ausführung von Aufgaben verantwortlich. Es handelt sich um einen High-Level-Scheduler, der die Ausführung und den Wechsel von Coroutinen steuern und die Ebenenplanung von Coroutinen realisieren kann. In der Go-Sprache verwendet der Coroutine-Scheduler eine zusätzliche laufende Entität namens Goroutine, die Ausführungsaufgaben in der Coroutine effizienter umschalten kann.

Prinzip der Implementierung des Coroutine-Schedulers

Das Implementierungsprinzip des Coroutine-Schedulers kann in zwei Ebenen unterteilt werden: Betriebssystemebene und Go-Sprachlaufzeitsystemebene.

Betriebssystemebene

Auf der Betriebssystemebene ordnet der Coroutine-Scheduler zur Laufzeit mehrere Benutzer-Threads mehreren Betriebssystem-Threads zu und nutzt dabei die parallelen Rechenfunktionen von Multi-Core-CPUs.

Die M:N-Architektur im Coroutine-Modell der Go-Sprache, das heißt, M repräsentiert den Betriebssystem-Thread (Maschine), N repräsentiert den virtuellen Thread der Go-Sprache (N, repräsentiert Goroutine) und der Scheduler verwaltet die Planung unter Laufzeit. Die Hauptfunktion des Schedulers besteht darin, in jedem Betriebssystem-Thread eine Planungsaufgabenwarteschlange zu verwalten, die Ausführung von Aufgaben in jedem Thread entsprechend der Priorität der Aufgaben in der Aufgabenwarteschlange und dem Planungsalgorithmus dynamisch zu planen und Thread-Ressourcen zu verwalten.

Go-Sprachlaufzeitsystemebene

Auf der Go-Sprachlaufzeitsystemebene verwendet der Coroutine-Scheduler drei Mechanismen: Scheduler, Scheduler-Warteschlange und P.

Scheduler

Der Coroutine-Scheduler der Go-Sprache wird von einem globalen Scheduler gesteuert, der die Scheduler-Warteschlange, die P-Warteschlange, die Spin-Nummer, den Planungsalgorithmus usw. verwaltet. Der Scheduler verwaltet die Aufgabenausführung in jedem Thread dynamisch, um die Ausführungseffizienz der Coroutine zu optimieren.

Scheduler-Warteschlange

In der Scheduler-Warteschlange zeichnet der Scheduler alle Goroutinen auf, die auf die Planung warten. Wenn der Planer P Goroutine zuweist, sucht er zunächst nach Goroutinen, die auf die Planung in der Warteschlange warten. Wenn sie gefunden werden, werden sie sofort in die lokale Warteschlange von P gestellt. Wenn sie nicht gefunden werden, wird eine neue Goroutine erstellt und in die lokale Warteschlange von P gestellt Warteschlange. In der lokalen Warteschlange von P.

P

P ist ein Prozessor, der zum Ausführen von Goroutine verwendet wird, und die Warteschlange, die er besitzt, ist die lokale Warteschlange. Die Anzahl der P wird durch die Umgebungsvariable GOMAXPROCS gesteuert. Wenn sie nicht festgelegt ist, verwendet das Go-Programm standardmäßig die Anzahl der Kerne der Maschine.

Optimierung des Go-Schedulers

Der Go-Scheduler verfügt über viele Optimierungsstrategien, hier sind einige davon:

  1. Arbeitsdiebstahl

Wenn alle Goroutinen in einer bestimmten P-Warteschlange blockiert sind, sucht der Go-Scheduler nach Goroutinen in anderen P-Warteschlangen stehlen dann einige und stellen sie zur Ausführung in ihre eigenen Warteschlangen. Diese Strategie gewährleistet eine stabile Last und Lastverteilung für alle Ps.

  1. Preemption

Goroutine kann während der Ausführung einen Timer für sich selbst einstellen. Wenn die Zeit abgelaufen ist, rufen Sie runtime.Goexit auf, um der Laufzeit mitzuteilen, dass diese Goroutine aktiv geplant werden kann. Der Go-Scheduler verfügt auch über eine Vorkaufsrichtlinie, wenn die Goroutine Goexit nicht aktiv aufruft. Vor Go 1.13 war eine vorzeitige Befreiung nur möglich, wenn GOMAXPROCS 1 war. Es wurde jetzt aktualisiert, um mehr Situationen zu unterstützen.

  1. Lokale Runqueue

Um den Wettbewerb um Aufgaben zwischen verschiedenen Threads zu verringern, verfügt jeder Thread über eine eigene lokale Warteschlange. Jeder Thread übernimmt zuerst Aufgaben aus der lokalen Warteschlange und führt sie erst aus, wenn die lokale Warteschlange leer ist. Gehen Sie zur globalen Warteschlange, um die Aufgabe zu erhalten.

Zusammenfassung

Der Coroutine-Scheduler ist eine der Schlüsselkomponenten für leistungsstarke Parallelität in der Go-Sprache. Es ist für die Verwaltung und Planung mehrerer Coroutinen zur Ausführung von Aufgaben verantwortlich. Es übernimmt das M:N-Coroutinenmodell und verwendet verschiedene Mechanismen und Algorithmen auf der Ebene des Betriebssystems und des Go-Sprachlaufzeitsystems, um eine effiziente Ausführung und Planung von Coroutinen sicherzustellen. Gleichzeitig verfügt der Go-Scheduler auch über viele Optimierungsstrategien, wie z. B. Coroutine-Preemption, lokale Ausführungswarteschlangen und Task-Stealing, die dazu beitragen können, dass das Programm effizienter ausgeführt wird und die Programmleistung und der Durchsatz verbessert werden.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Coroutine-Schedulers in der Go-Sprache. 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